diff options
Diffstat (limited to 'sys/contrib')
37 files changed, 28144 insertions, 0 deletions
diff --git a/sys/contrib/dev/fla/COPYRIGHT b/sys/contrib/dev/fla/COPYRIGHT new file mode 100644 index 0000000..9618a67 --- /dev/null +++ b/sys/contrib/dev/fla/COPYRIGHT @@ -0,0 +1,102 @@ + +SOFTWARE LICENSE AGREEMENT + +IMPORTANT! READ CAREFULLY: +THIS SOFTWARE LICENSE AGREEMENT (the ``Agreement'') is a legal +agreement between you (either an individual or a single entity) and +M-Systems Flash Disk Pioneers Ltd. ("M-Systems"). +This Agreement relates to the M-Systems' software accompanying this +Agreement, which includes computer software and may include associated +media, printed materials, and ``online'' or electronic documentation +(the ``Licensed Software''). +By downloading, installing, copying, or otherwise using the Licensed +Software, you agree to be bound by the terms of this Agreement. +If you do not agree to the terms of this Agreement, do not install, +copy or use the Licensed Software. + +The Licensed Software is protected by copyright laws and international +copyright treaties, as well as other intellectual property laws and +treaties. The Licensed Software is licensed, not sold. +The Licensed Software is being provided solely for use with M-Systems' +DiskOnChip® product lines. +1. License Grant. +(a) Grant of License. Subject to the terms and conditions of this + Agreement, M-Systems hereby grants you a nonexclusive, + royalty-free, worldwide license (including the right to + sublicense) to use, copy and distribute the Licensed Software + with M-Systems DiskOnChip® products. +(b) Restrictions on Use. The Licensed Software is licensed solely + for use with and to support M-Systems' DiskOnChip® products. + Use of this Licensed Software with, or to support, any other + flash disk, flash card, resident flash array or solid state + disk of any kind is expressly prohibited, and constitutes an + illegal infringement of M-Systems' patent, copyright and other + rights in and to the Licensed Software. +2. Limitations on Reverse Engineering, Decompilation, and + Disassembly. You may not reverse engineer, decompile, or + disassemble the Licensed Software, except and only to the + extent that such activity is expressly permitted by applicable + law notwithstanding this limitation. +3. Termination. Without prejudice to any other rights, M-Systems + may terminate this Agreement if you fail to comply with the + terms and conditions of this Agreement. In such event, you must + destroy all copies of the Licensed Software and all of its + component parts. +4. Intellectual Property Rights. Title to the Licensed Software, + and all rights with respect to the Software not specifically + granted under this Agreement, including without limitation + all rights of modification, disassembly and decompilation and + all copyright, patent, trademark, trade secret and other + proprietary rights and interests are reserved to M-Systems. + You may not remove or alter the "README" or "COPYRIGHT" files + or copyright notices in the Licensed Software. +5. DISCLAIMER OF WARRANTIES. To the maximum extent permitted by + applicable law, M-Systems and its suppliers provide the Product + and any (if any) support services related to the Product + ("Support Services") AS IS AND WITH ALL FAULTS, and hereby + disclaim all warranties and conditions, either express, + implied or statutory, including, but not limited to, any + (if any) implied warranties or conditions of merchantability, + of fitness for a particular purpose, of lack of viruses, of + accuracy or completeness of responses, of results, and of lack + of negligence or lack of workmanlike effort, all with regard + to the Product, and the provision of or failure to provide + Support Services. ALSO, THERE IS NO WARRANTY OR CONDITION OF + TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO + DESCRIPTION OR NON-INFRINGEMENT, WITH REGARD TO THE PRODUCT. + THE ENTIRE RISK AS TO THE QUALITY OF OR ARISING OUT OF USE OR + PERFORMANCE OF THE PRODUCT AND SUPPORT SERVICES, IF ANY, + REMAINS WITH YOU. +6. EXCLUSION OF INCIDENTAL, CONSEQUENTIAL AND CERTAIN OTHER + DAMAGES. To the maximum extent permitted by applicable law, + in no event shall M-Systems or its suppliers be liable for + any special, incidental, indirect, or consequential damages + whatsoever (including, but not limited to, damages for loss + of profits or confidential or other information, for business + interruption, for personal injury, for loss of privacy, for + failure to meet any duty including of good faith or of + reasonable care, for negligence, and for any other pecuniary + or other loss whatsoever) arising out of or in any way related + to the use of or inability to use the Product, the provision + of or failure to provide Support Services, or otherwise under + or in connection with any provision of Agreement, even in the + event of the fault, tort (including negligence), strict + liability, breach of contract or breach of warranty of + M-Systems or any supplier, and even if M-Systems or any + supplier has been advised of the possibility of such damages. +7. LIMITATION OF LIABILITY AND REMEDIES. Notwithstanding any + damages that you might incur for any reason whatsoever + (including, without limitation, all damages referenced above + and all direct or general damages), the entire liability of + M-Systems and any of its suppliers under any provision of this + Agreement and your exclusive remedy for all of the foregoing + shall be limited to the greater of the amount actually paid by + you for the Product or U.S.$5.00. The foregoing limitations, + exclusions and disclaimers shall apply to the maximum extent + permitted by applicable law, even if any remedy fails its + essential purpose. +8. Miscellaneous + The laws of the State of California, United States of America, + exclusive of conflict-of-laws provisions, shall govern this + Agreement in all respects. + diff --git a/sys/contrib/dev/fla/README b/sys/contrib/dev/fla/README new file mode 100644 index 0000000..78433de --- /dev/null +++ b/sys/contrib/dev/fla/README @@ -0,0 +1,198 @@ + README and FAQ for the fla driver. + ================================== + + +[0] COPYRIGHT & LICENSE + + Please read the COPYRIGHT file carefully. If you cannot + agree to be bound by the terms of this license, please + contact M-systems and make arrangements with them. + +[1] What does this driver do ? + + This driver supports up to eight M-systems DiskOnChip + devices. + + The driver has been tested with the following devices: + + DiskOnChip2000 (8, 12, 24, 32, 40, 72, 144 MB) + DiskOnChipMillenium (8 MB) + DiskOnChipMillenium TSOP (8 MB) + + You can find full details, specs etc on M-systems homepage: + http://www.m-sys.com + +[2] Which firmware version ? + + The driver has only been tested with version 1.21. + +[3] How many devices ? + + The driver supports up to 8 devices but have been tested only + with 5 due to hardware limitations in my test setup. + +[4] Which FreeBSD versions ? + + The driver is tested for 4.0-CURRENT and 3.3-RELEASE. + + Porting to earlier versions of FreeBSD should be a simple + matter of modifying the fla.c file. [patches are welcome] + +[5] Can I install FreeBSD with sysinstall ? + + Yes, it has been tested in FreeBSD-4.0-CURRENT and it works. + You will need to build a kernel with the fla driver since + the default "GENERIC" kernel doesn't contain the fla driver. + +[6] How to boot from a fla device ? + + FreeBSD 4.0 and forward find their root device by reading + the /etc/fstab, so the DiskOnChip devices will work just + like any other device. + + Earlier FreeBSD kernels recognizes the root device using + various hacks. These hacks doesn't recognize the fla device + so some "real" hacks are needed to boot from your fla + device. + + In pre 4.0 versions specifying the boot device in the kernel + config file this way is the easiest way to do it: + + config kernel root on major 28 minor 65538 + +[7] How to disklabel a fla device ? + + Look at the script in prep.fla.sh, it will do the job for you. + +[8] Who to contact ? + + doc2k@phk.freebsd.dk will offer limited best-effort help + to the extent time permits. Further support for special + projects or configurations available at reasonable hourly + rates. + +[9] Getting detailed + + The DiskOnChip product gets out in some odd corners of the + PC-architecture, and chances are that things don't do what + you expect. Here are some hints and random observations + I've made during my work with these devices. + +[9a] Choosing an address for the DOC + + Each DOC needs a 8K memory window starting on an 8K boundary. + The lowest possible address is C000:0, the highest is DE00:0 + + If your hardware puts the DOC another place, you will need + to modify the doc2k_probe() call in fla.c. + + It is important that you set the BIOS to not do "fancy things" + with this window, in particular no kind of cache or shadowing + can be enabled. + + Be aware that some hardware will decode a 32k memory window + for the DOC device. + + If everything is OK, the DOC will print a message during + the BIOS startup. + + For large devices it can take some time to check the flash + data structures, but if it takes more than 3 minutes + something is wrong. + + If you boot a MSDOS floppy and run FDISK you should be able + to see the DOC device. + + If it doesnt work: + + If you machine never gets to the point where it will boot, + but just hangs it could be because you have a BIOS which + need the "slightly special" DOC firmware. Obviously you + will need to put the DOC in another machine to load this + firmware. You can download the firmware and utilities + from M-systems website http://www.m-sys.com + + If the machine boots, but the device isn't visible it can + be because some other device uses the same memory window, + or because the BIOS prevents it from being used. If you + boot MSDOS and enter DEBUG, you should be able to find a + BIOS extension signature at the address using the 'd' + command, for instance 'd d800:0'. + + A special case is when the DOC prints the BIOS message + but disappears afterwards, this can happen because another + card (NCR SCSI controllers for instance) steal the memory + window later in the boot process. In such a case the + above check with DEBUG will not show the BIOS signature. + +[9b] So just who is drive 'C' here anyway ? + + Using the DUPDATE program you can choose to have the DOC + add itself at the front or the back of the device list. + + This is, unfortunately not the only thing affecting the + drive order, the above mentioned NCR SCSI controllers also + have some builtin AI, and the result can be very confusing + because the DOC will come before even the floppy as a result. + + There is no simple solution for this case, only variuos + work-arounds. But chances are good that most users will + not use both a DOC and a SCSI in the same system, except + maybe for initial programming. + +[9c] MBR/fdisk + + The boot firmware in the DOC and/or the FreeBSD bootblocks + mandate that the first MBR slice/(partition in FDISK lingo) + start exactly at "sector #1, head #1, cylinder #0." You + will have problems booting from the fla if you don't get this + right. The prep.fla.sh script will do this for you. + + DO NOT WRITE JUNK IN THE MBR! The DOC firmware relies on + various fields and can get utterly confused if they don't + make sense. + +[9d] Getting the FreeBSD kernel to use the fla as root + + Please see above under item 6. + +[9e] I turned the machine off while it was running and now my + DOC hangs during boot/panics the machine/does weird things. + + If a write operation to the DOC gets interrupted by reset + or power-failure, it can happen that the flash data structures + are left in a state the sofware cannot cope with. + + Your best chance is to DUPDATE, DFORMAT the device again. + + If it hangs during boot, you can use this particular dirty + trick ENTIRELY AT YOUR OWN RISK! DO NOT COMPLAIN IF THIS + DOESN'T WORK FOR YOU OR IF YOU DESTROY YOUR COMPUTER OR + DOC DEVICE DOING IT! + + Jumper the DOC for an address which will not work, but which + will not interfere with the system either, C000:0 seems to + work pretty universally for this. + + Boot MSDOS and rejumper the DOC for its real (working) address. + + Run DUPDATE and use the /win:xxxx argument to point it at the + DOC device. + +[9f] Apart from that... + + ...the DOC is just like any other disk, but it is silent, + has better MTBF and doesn't take up a lot of space. + + +[10] History + + The fla driver was written by Poul-Henning Kamp <phk@FreeBSD.org> + under contract for M-systems, and using their "OSAK" + development kit. + +Good Luck, + +Poul-Henning + +$FreeBSD$ diff --git a/sys/contrib/dev/fla/fla.c b/sys/contrib/dev/fla/fla.c new file mode 100644 index 0000000..0f91842 --- /dev/null +++ b/sys/contrib/dev/fla/fla.c @@ -0,0 +1,354 @@ +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * <phk@FreeBSD.ORG> wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. Poul-Henning Kamp + * ---------------------------------------------------------------------------- + * + * $FreeBSD$ + * + */ + +#include "fla.h" +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/sysctl.h> +#include <sys/kernel.h> +#include <sys/buf.h> +#include <sys/malloc.h> +#include <sys/conf.h> +#include <sys/disk.h> +#include <sys/devicestat.h> +#include <sys/module.h> +#include <machine/clock.h> +#include <machine/resource.h> + +#include <vm/vm.h> +#include <vm/pmap.h> +#include <vm/vm_param.h> + +#include <sys/bus.h> +#include <isa/isavar.h> + +#ifdef SMP +#include <machine/smp.h> +#define LEAVE() rel_mplock(); +#define ENTER() get_mplock(); +#else +#define LEAVE() +#define ENTER() +#endif + +#include <contrib/dev/fla/msysosak.h> + +MALLOC_DEFINE(M_FLA, "fla driver", "fla driver storage"); + +static int fla_debug = 0; +SYSCTL_INT(_debug, OID_AUTO, fladebug, CTLFLAG_RW, &fla_debug, 0, ""); + +#define CDEV_MAJOR 102 +#define BDEV_MAJOR 28 + +static d_strategy_t flastrategy; +static d_open_t flaopen; +static d_close_t flaclose; +static d_ioctl_t flaioctl; + +static struct cdevsw fla_cdevsw = { + /* open */ flaopen, + /* close */ flaclose, + /* read */ physread, + /* write */ physwrite, + /* ioctl */ flaioctl, + /* poll */ nopoll, + /* mmap */ nommap, + /* strategy */ flastrategy, + /* name */ "fla", + /* maj */ CDEV_MAJOR, + /* dump */ nodump, + /* psize */ nopsize, + /* flags */ D_DISK | D_CANFREE, + /* bmaj */ BDEV_MAJOR +}; +static struct cdevsw fladisk_cdevsw; + +void * +doc2k_malloc(int bytes) +{ + return malloc(bytes, M_FLA, M_WAITOK); +} + +void +doc2k_free(void *ptr) +{ + free(ptr, M_FLA); +} + +void +doc2k_delay(unsigned msec) +{ + DELAY(1000 * msec); +} + +void +doc2k_memcpy(void *dst, const void *src, unsigned len) +{ + bcopy(src, dst, len); +} + +int +doc2k_memcmp(const void *dst, const void *src, unsigned len) +{ + return (bcmp(src, dst, len)); +} + +void +doc2k_memset(void *dst, int c, unsigned len) +{ + u_char *p = dst; + while (len--) + *p++ = c; +} + +static struct fla_s { + int busy; + int unit; + unsigned nsect; + struct doc2k_stat ds; + struct buf_queue_head buf_queue; + struct devstat stats; + struct disk disk; + dev_t dev; +} softc[NFLA]; + +static int +flaopen(dev_t dev, int flag, int fmt, struct proc *p) +{ + struct fla_s *sc; + int error; + struct disklabel *dl; + + if (fla_debug) + printf("flaopen(%s %x %x %p)\n", + devtoname(dev), flag, fmt, p); + + sc = dev->si_drv1; + + error = doc2k_open(sc->unit); + + if (error) { + printf("doc2k_open(%d) -> err %d\n", sc->unit, error); + return (EIO); + } + + dl = &sc->disk.d_label; + bzero(dl, sizeof(*dl)); + error = doc2k_size(sc->unit, &dl->d_secperunit, + &dl->d_ncylinders, &dl->d_ntracks, &dl->d_nsectors); + dl->d_secsize = DEV_BSIZE; + dl->d_secpercyl = dl->d_ntracks * dl->d_nsectors; /* XXX */ + + return (0); +} + +static int +flaclose(dev_t dev, int flags, int fmt, struct proc *p) +{ + int error; + struct fla_s *sc; + + if (fla_debug) + printf("flaclose(%s %x %x %p)\n", + devtoname(dev), flags, fmt, p); + + sc = dev->si_drv1; + + error = doc2k_close(sc->unit); + if (error) { + printf("doc2k_close(%d) -> err %d\n", sc->unit, error); + return (EIO); + } + return (0); +} + +static int +flaioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p) +{ + + if (fla_debug) + printf("flaioctl(%s %lx %p %x %p)\n", + devtoname(dev), cmd, addr, flags, p); + + return (ENOIOCTL); +} + +static void +flastrategy(struct buf *bp) +{ + int unit, error; + int s; + struct fla_s *sc; + enum doc2k_work what; + + if (fla_debug > 1) + printf("flastrategy(%p) %s %lx, %d, %ld, %p)\n", + bp, devtoname(bp->b_dev), bp->b_flags, bp->b_blkno, + bp->b_bcount / DEV_BSIZE, bp->b_data); + + sc = bp->b_dev->si_drv1; + + s = splbio(); + + bufqdisksort(&sc->buf_queue, bp); + + if (sc->busy) { + splx(s); + return; + } + + sc->busy++; + + while (1) { + bp = bufq_first(&sc->buf_queue); + if (bp) + bufq_remove(&sc->buf_queue, bp); + splx(s); + if (!bp) + break; + + devstat_start_transaction(&sc->stats); + bp->b_resid = bp->b_bcount; + unit = dkunit(bp->b_dev); + + if (bp->b_flags & B_FREEBUF) + what = DOC2K_ERASE; + else if (bp->b_flags & B_READ) + what = DOC2K_READ; + else + what = DOC2K_WRITE; + + LEAVE(); + + error = doc2k_rwe( unit, what, bp->b_pblkno, + bp->b_bcount / DEV_BSIZE, bp->b_data); + + ENTER(); + + if (fla_debug > 1 || error) { + printf("fla%d: %d = rwe(%p, %d, %d, %d, %ld, %p)\n", + unit, error, bp, unit, what, bp->b_pblkno, + bp->b_bcount / DEV_BSIZE, bp->b_data); + } + if (error) { + bp->b_error = EIO; + bp->b_flags |= B_ERROR; + } else { + bp->b_resid = 0; + } + devstat_end_transaction_buf(&sc->stats, bp); + biodone(bp); + + s = splbio(); + } + sc->busy = 0; + return; +} + +static int +flaprobe (device_t dev) +{ + int unit; + struct fla_s *sc; + int i; + + unit = device_get_unit(dev); + sc = &softc[unit]; + + /* This is slightly ugly */ + i = doc2k_probe(unit, KERNBASE + 0xc0000, KERNBASE + 0xe0000); + if (i) + return (ENXIO); + + i = doc2k_info(unit, &sc->ds); + if (i) + return (ENXIO); + + bus_set_resource(dev, SYS_RES_MEMORY, 0, + sc->ds.window - KERNBASE, 8192); + + return (0); +} + +static int +flaattach (device_t dev) +{ + int unit; + int i, j, k, l, m, error; + struct fla_s *sc; + + unit = device_get_unit(dev); + sc = &softc[unit]; + + error = doc2k_open(unit); + if (error) { + printf("doc2k_open(%d) -> err %d\n", unit, error); + return (EIO); + } + + error = doc2k_size(unit, &sc->nsect, &i, &j, &k ); + if (error) { + printf("doc2k_size(%d) -> err %d\n", unit, error); + return (EIO); + } + + printf("fla%d: <%s %s>\n", unit, sc->ds.product, sc->ds.model); + + error = doc2k_close(unit); + if (error) { + printf("doc2k_close(%d) -> err %d\n", unit, error); + return (EIO); + } + + m = 1024L * 1024L / DEV_BSIZE; + l = (sc->nsect * 10 + m/2) / m; + printf("fla%d: %d.%01dMB (%u sectors)," + " %d cyls, %d heads, %d S/T, 512 B/S\n", + unit, l / 10, l % 10, sc->nsect, i, j, k); + + if (bootverbose) + printf("fla%d: JEDEC=0x%x unitsize=%ld mediasize=%ld" + " chipsize=%ld interleave=%d window=%lx\n", + unit, sc->ds.type, sc->ds.unitSize, sc->ds.mediaSize, + sc->ds.chipSize, sc->ds.interleaving, sc->ds.window); + + bufq_init(&sc->buf_queue); + + devstat_add_entry(&softc[unit].stats, "fla", unit, DEV_BSIZE, + DEVSTAT_NO_ORDERED_TAGS, + DEVSTAT_TYPE_DIRECT | DEVSTAT_TYPE_IF_OTHER, + DEVSTAT_PRIORITY_DISK); + + sc->dev = disk_create(unit, &sc->disk, 0, &fla_cdevsw, &fladisk_cdevsw); + sc->dev->si_drv1 = sc; + sc->unit = unit; + + return (0); +} + +static device_method_t fla_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, flaprobe), + DEVMETHOD(device_attach, flaattach), + {0, 0} +}; + +static driver_t fladriver = { + "fla", + fla_methods, + sizeof(struct fla_s), +}; + +static devclass_t fla_devclass; + +DRIVER_MODULE(fla, isa, fladriver, fla_devclass, 0, 0); diff --git a/sys/contrib/dev/fla/i386/msysosak.o.uu b/sys/contrib/dev/fla/i386/msysosak.o.uu new file mode 100644 index 0000000..4d1faaf --- /dev/null +++ b/sys/contrib/dev/fla/i386/msysosak.o.uu @@ -0,0 +1,724 @@ + +SOFTWARE LICENSE AGREEMENT + +IMPORTANT! READ CAREFULLY: +THIS SOFTWARE LICENSE AGREEMENT (the ``Agreement'') is a legal +agreement between you (either an individual or a single entity) and +M-Systems Flash Disk Pioneers Ltd. ("M-Systems"). +This Agreement relates to the M-Systems' software accompanying this +Agreement, which includes computer software and may include associated +media, printed materials, and ``online'' or electronic documentation +(the ``Licensed Software''). +By downloading, installing, copying, or otherwise using the Licensed +Software, you agree to be bound by the terms of this Agreement. +If you do not agree to the terms of this Agreement, do not install, +copy or use the Licensed Software. + +The Licensed Software is protected by copyright laws and international +copyright treaties, as well as other intellectual property laws and +treaties. The Licensed Software is licensed, not sold. +The Licensed Software is being provided solely for use with M-Systems' +DiskOnChip® product lines. +1. License Grant. +(a) Grant of License. Subject to the terms and conditions of this + Agreement, M-Systems hereby grants you a nonexclusive, + royalty-free, worldwide license (including the right to + sublicense) to use, copy and distribute the Licensed Software + with M-Systems DiskOnChip® products. +(b) Restrictions on Use. The Licensed Software is licensed solely + for use with and to support M-Systems' DiskOnChip® products. + Use of this Licensed Software with, or to support, any other + flash disk, flash card, resident flash array or solid state + disk of any kind is expressly prohibited, and constitutes an + illegal infringement of M-Systems' patent, copyright and other + rights in and to the Licensed Software. +2. Limitations on Reverse Engineering, Decompilation, and + Disassembly. You may not reverse engineer, decompile, or + disassemble the Licensed Software, except and only to the + extent that such activity is expressly permitted by applicable + law notwithstanding this limitation. +3. Termination. Without prejudice to any other rights, M-Systems + may terminate this Agreement if you fail to comply with the + terms and conditions of this Agreement. In such event, you must + destroy all copies of the Licensed Software and all of its + component parts. +4. Intellectual Property Rights. Title to the Licensed Software, + and all rights with respect to the Software not specifically + granted under this Agreement, including without limitation + all rights of modification, disassembly and decompilation and + all copyright, patent, trademark, trade secret and other + proprietary rights and interests are reserved to M-Systems. + You may not remove or alter the "README" or "COPYRIGHT" files + or copyright notices in the Licensed Software. +5. DISCLAIMER OF WARRANTIES. To the maximum extent permitted by + applicable law, M-Systems and its suppliers provide the Product + and any (if any) support services related to the Product + ("Support Services") AS IS AND WITH ALL FAULTS, and hereby + disclaim all warranties and conditions, either express, + implied or statutory, including, but not limited to, any + (if any) implied warranties or conditions of merchantability, + of fitness for a particular purpose, of lack of viruses, of + accuracy or completeness of responses, of results, and of lack + of negligence or lack of workmanlike effort, all with regard + to the Product, and the provision of or failure to provide + Support Services. ALSO, THERE IS NO WARRANTY OR CONDITION OF + TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO + DESCRIPTION OR NON-INFRINGEMENT, WITH REGARD TO THE PRODUCT. + THE ENTIRE RISK AS TO THE QUALITY OF OR ARISING OUT OF USE OR + PERFORMANCE OF THE PRODUCT AND SUPPORT SERVICES, IF ANY, + REMAINS WITH YOU. +6. EXCLUSION OF INCIDENTAL, CONSEQUENTIAL AND CERTAIN OTHER + DAMAGES. To the maximum extent permitted by applicable law, + in no event shall M-Systems or its suppliers be liable for + any special, incidental, indirect, or consequential damages + whatsoever (including, but not limited to, damages for loss + of profits or confidential or other information, for business + interruption, for personal injury, for loss of privacy, for + failure to meet any duty including of good faith or of + reasonable care, for negligence, and for any other pecuniary + or other loss whatsoever) arising out of or in any way related + to the use of or inability to use the Product, the provision + of or failure to provide Support Services, or otherwise under + or in connection with any provision of Agreement, even in the + event of the fault, tort (including negligence), strict + liability, breach of contract or breach of warranty of + M-Systems or any supplier, and even if M-Systems or any + supplier has been advised of the possibility of such damages. +7. LIMITATION OF LIABILITY AND REMEDIES. Notwithstanding any + damages that you might incur for any reason whatsoever + (including, without limitation, all damages referenced above + and all direct or general damages), the entire liability of + M-Systems and any of its suppliers under any provision of this + Agreement and your exclusive remedy for all of the foregoing + shall be limited to the greater of the amount actually paid by + you for the Product or U.S.$5.00. The foregoing limitations, + exclusions and disclaimers shall apply to the maximum extent + permitted by applicable law, even if any remedy fails its + essential purpose. +8. Miscellaneous + The laws of the State of California, United States of America, + exclusive of conflict-of-laws provisions, shall govern this + Agreement in all respects. + +begin 664 msysosak.o +M?T5,1@$!`0!&<F5E0E-$``$``P`!``````````````"H60```````#0````` +M`"@`#``)`%6)Y>C\____A<!U(.C\____A<!U%_\U`````/\U`````.C\____ +MA<!U`C'`R<.0D%6)Y8M%#(M5$*,`````B14`````_P4`````@ST``````74) +MZ/S___^%P'45BT4(.P4`````<P4QP.L&D+@``0``R<.058GE@^PH5U93BUT( +MBWT,:D1J`%?H_/___XE=Z(E]](U%Z%!J"^C\____B47DBT\(A<E]!H'!__\/ +M`(G.P?X4C5\<QT<8`````(/^8WXCN!^%ZU'W[HG3P?L%B5W8P?D?B4W<BD78 +M*D7<!#"(1QR-7QV#_@E^.KAG9F9F]^Z)T<'Y`HGPP?@?*<&X9V9F9O?IB=?! +M_P*)R,'X'RG'B7W<C12_`=*)5=PJ3=R`P3"("T.X9V9F9O?NB='!^0*)\,'X +M'RG!B4W<C12)`=*)5=R)\"I%W`0PB`-#Q@--0\8#0L9#`0"+1>2-9<Q;7E_) +MPXGV58GE@^PH5U93BT4(B47HBUT,BWT4BW48C57H4FH0Z/S___^)P8M%^(D# +MBU40QP(`!```QP<0````BP+!X`2)1=R+$XE5V(G0,=+W==R)!HL#B478,=+W +M==R%TG1`_P:+11"+$`^O%HE5W(L#B478,=+W==R)!XL#B478,=+W==R%TG09 +M_P>+/P^O/HE]W(L;B=@QTO?WB<.+11")&(G(C67,6UY?R<.058GE@^P8BT4( +MB47HC47H4&H%Z/S____)PXUV`%6)Y8/L&(M%"(E%Z(U%Z%!J`>C\____R<.- +M=@!5B>6#[!A64XM="(MU#(M%$(M5%(M-&(E=Z(E%^(E5_(E-](/^`70<<@J# +M_@)T)>LSC78`C47H4&H&Z/S____K*(UV`(U%Z%!J!^C\____ZQB-=@"-1>A0 +M:@GH_/___^L(C78`N!`G``"-9>!;7LG#58GER<.-=@!5B>6X`0```,G#B?95 +MB>7)PXUV`%6)Y8M%",<``````#'`R<-5B>7)PY"0D%6)Y5.+70CV`PAT"_]S +M;(N#B````/_0Q@,`,<"+7?S)PXUV`%6)Y593BUT(,?:#?0P!=4R-0S10Z/S_ +M__^#Q`2%P'4(N`D```#K;Y!J`?^SE````.C\_____[.4````Z/S___^#Q`SV +M`PAT3&H!_W-LBX.$````_]")QNL[C78`]@,(=!)J`/]S;(N#A````/_0B<:# +MQ`C_LY0```#H_/___VH`_[.4````Z/S___^-0S10Z/S___^)\(UE^%M>R<.- +M=@!5B>6+10AJ`/]U#/]P;(M`</_0R<.-=@!5B>53BUT(4^@7____@\0$A<!U +M2FH!C4-L4(G8+0````"-!$"-!,")PL'B"2G"B=#!X!(!PO?:P?H#4NC\____ +MA<!U&L=#$`````#'0Q@`````QT,4`````(`+"#'`BUW\R<.058GE5U93BW4( +M5NBQ_O__@\0$A<`/A;\!``!J`8U&;%")\"T`````C01`C03`B<+!X@DIPHG0 +MP>`2`<+WVL'Z`U+H_/___X/$#(7`#X6(`0``:@!6Z"O___^#Q`B%P'48_W9L +MBX:(````_]"X&P```.ED`0``C78`/0````!U%?]V;(N&B````/_0N!D```#I +M10$``&:!N/X!``!5JG4=@+C"`0```'04!<8!``!0Z/S___^)1A"#Q`3K")#' +M1A``````QT88`````,=&%`````"`#@C_=A!6Z*?^__^)PX/$"(7;=0JX&P`` +M`.GI````@?L`````=0RX&0```.G7````B?:`.^ET&XL#)?\`_P`]ZP"0`'0- +MN`H```#IN````(UV`(U#"U#H_/___X/$!&8]``(/A9H````/MD,-B48$#[9# +M$(E&'`^W0Q:)1B`/MTL.`TX0B4X4#[=#%@'(B488#[9#$`^W4Q8/K\(!R(E& +M)(U#$5#H_/___R7__P``P>`%2,'H"4")1B@#1B2)1BR-0Q-0Z/S___\E__\` +M`(7`=0.+0R`#1A`K1BPQTO=V!$")1@@]]`\``'88BWX$P><)B7X,QT8P`@`` +M`(`.`C'`ZP:0N`L```"-9?1;7E_)PXUV`%6)Y5.+10B+70S_<&R+@(P```#_ +MT(E#$#'`BUW\R<.058GE@^P$5U93BW4,BUX,BT80BU4(BWH0`<>+5A2)5?S' +M1A0`````.584<U)7BU4(4NA*_?__@\0(A<!T'ST`````=0BX&0```.LUD&@` +M`@``4%/H_/___^L/B?9H``(``&H`4^C\____@\0,_T841X'#``(``(M5_#E6 +M%'*N,<"-9?!;7E_)PU6)Y5=64XM]"(M-#%%7Z.7\__^)PH/$"(72=&:!^@`` +M``!T7HM%#"M'%,'@"(UP_@^O=P0#=RPQVXUV`(M-$&:+!`MF@SP3`'0;9H7` +M=1;_=P16_W=LBX>`````_]"#Q`R%P'4?BTT,45?HB?S__XG"@\0(`W<$@\," +M@?O_`0``=KHQP(UE]%M>7\G#58GE@^P$5U93BUT,BWL,BT,0BU4(BW(0`<:+ +M4Q2)5?S'0Q0`````.5,4<R975HM5"/]R;(M"=/_0@\0,A<!U%/]#%$:!QP`" +M``"+5?PY4Q1RVC'`C67P6UY?R<-5B>6#[`13BT4(BUT,C57\4O]S$/]P;(M` +M</_0A<!T'#T`````=0FX&0```.L3B?:+1?R)0Q0QP.L'B?:X&P```(M=^,G# +MB?95B>6+50B+30R+01`#0A#_<110_W)LBX*`````_]#)PU6)Y8/L!%=64XM= +M"(M%#(M`#(E%_/]S$%/HBOO__X/$"(7`=",]`````'0KBWW\B<;\N0D```#S +MI6H`4^AG^___@\0(A<!U"+@;````ZSB0/0````!U";@9````ZRF)]F:!N/X! +M``!5JG4:@+C"`0```'01!<8!``!0Z/S___^+3?R)01PQP(UE\%M>7\G#D%6) +MY593BUT(C7,X5O^SE````.C\____@\0(A<!U"U:+0VC_T(`+`3'`C67X6U[) +MPU6)Y8M%"(`@_LG#D%6)Y8M5"(M%#(M(#&:+0CAFB0&+0CR)002+0D`/KT)$ +MB4$(BT)`B4$,BT)(B4$0BX*4````BT`HP>`,B4$4,<#)PXGV58GE5E.+=0B+ +M30R+010#01"+5D`/KU9$.=!_+(M9$(G8F?=^/(M&/"G0.4$4?QG_<03_<13_ +M<0Q3C48X4(M&7/_0,<#K!XGVN#,```"-9?A;7LG#58GE4XM="(M-#(M!%`-! +M$(M30`^O4T0YT'\1BT$0F?=[/(M#/"G0.4$4?@BX,P```.L<D/]Q!/]Q%/]Q +M#/]Q$(U#.%"+0V#_T(7`=0(QP(M=_,G#58GE@^P$5U93BUT(BTT,BT$4`T$0 +MB47\BW-`#Z]S1(GPF?=[/(G'.7W\?@BX,P```.L?D/]Q%/]Q$(U#.%"+0V3_ +MT(G!A<EU!S'`ZP6-=@")R(UE\%M>7\G#B?95B>575E.+?0R#/0``````=0WH +MM0$``(7`#X6C`0``BP<[!0````!R"[@4````Z8\!``"0BP>-%,"-%%"---4` +M````:@%6Z*GX__^#Q`B%P`^%;`$``(-]"`]W5(M-"/\DC1@```")]O8&`71K +M5N@Y_O__@\0$ZV#V!@AT"[L?````Z3$!``"0]@8!=0]6Z.G]__^)PX/$!.L$ +MB?8QVX7;=#96Z`3^__^#Q`3I]0```/8&"'08=!:+10A(@_@/=PC_)(58```` +MD/8&`G4+NS<```#IX0```)"#?0@0#X>^````BTT(_R2-F````%;H'OG__^LR +M5NC6]___ZRK_=PS_-^C\____@\0$4.C\____Z8,```!75NC9^O__ZWJ-=@!6 +MZ(;X__^)PX/$!.MXC78`5U;HW?K__^M>C78`5U;HY?O__^M2C78`5U;H-?S_ +M_^M&C78`5U;H<?S__^LZC78`5U;HA?S__^LNC78`5U;H1?W__^LBC78`5U;H +M??W__^L6C78`5U;HQ?W__^L*C78`5U;H#?[__XG#@\0(ZP>)]KL!````A=MU +M#VH`5NA#]___B</K"XUV`&H`5N@T]___B=B-9?1;7E_)PXGV58GE5E.#/0`` +M````#X61````O@`````QVXUV`%/H_/___XF&E````(D8Q@8`@\0$0X'&F``` +M`(/[!W;@QP4``````0```.C\____QP4``````````.C\____A<!U1^C\____ +MA<!T#>L\C78`N!\```#K,I`QV[X`````.QT`````<R"0C48T4.C\____@\0$ +MA<!UV$.!QI@````['0````!RX3'`C67X6U[)PU6)Y5=64[X`````,?\[/0`` +M``!S2HUV`&H!5NA<]O__@\0(A<!U*5;H*_;__U;H`?S___^VE````.C\____ +MC5XT4^C\____4^C\____@\041X'&F````#L]`````'*YQP4``````````(UE +M]%M>7\G#D)"058GEBT4(#[=5#(M((-/BB=#)PY!5B>6#[`Q75E.+=0B+30QF +MB4WV@WXT`'1[#[?9BT8T9H$\F*W>=4QF@7R8`JW>=4-J!&H(C47X4%-6Z*W_ +M__^#Q`B#P`A0C49<4(N&@````/_0BU8TC47XBWWX9@MX!&:)/)J+5C1FBT@" +M9@M(!F:)3)H"#[=5]HM&-&:+!)"+?1!FB0>+1C1FBT20`HM-%&:)`>M$:@1J +M"(U%^%`/MT7V4%;H1?___X/$"(/`"%"-1EQ0BX:`````_]"-1?B+3?AF"T@$ +MBWT09HD/9HM(`F8+2`:+?11FB0^-9>A;7E_)PU6)Y8/L%%=64XM="(M%$(MU +M#&:)1?*+?11FB7WL9HE%^(U5^&:)0@2)^<'A$(M%^"7__P``B47X"4WXBT($ +M)?__``")0@0)2@1J!&H(4@^WQE!3Z+3^__^#Q`B#P`A0C4-<4(N#A````/_0 +M@\04A<!U3(-[-`!T%@^WQHM3-&;'!(*MWHM3-&;'1(("K=Z-1?90C47T4`^W +MQE!3Z(#^__]FBWWR9CM]]'4)BWWL9CM]]G0)N!T```#K!(GV,<"-9>!;7E_) +MPXGV58GE@^P$BTT(#[=5#(M!+(`\`@!]%HU%_E"-1?Q04E'H,_[__P^W1?[K +M!I"X__\``,G#D%6)Y8M%"(M5#(G1P>D+BT`X#[8$`<'J"(G1@^$'T_B#X`,/ +MMH`(````R<.058GE5U93BWT(BW4,BET0@W\X``^$C````(GRP>H+BT<XB@P" +M#[;#@_A5=!1_!H7`=!;K&#W_````=`GK#XUV`+("ZPJR`^L&,=+K`K(!B?#! +MZ`B#X`>#^`)T'7<'A<!T#^LWD(/X!'0;@_@&="+K*H#A_`C1ZR.0@.'SB-#` +MX`+K%HGV@.'/B-#`X`3K"HGV@.$_B-#`X`8(P8GRP>H+BT<XB`P"C67T6UY? +MR<.-=@!5B>6#[`175E.+=0B+?0R#?C@`=!=75N@(____B$7^@\0(/!%T!@^V +M1?[K.6H$:@*-1?Y0C4<&4(U&7%"+AH````#_T(U=_HI%_@I#`27_````4%=6 +MZ/;^__^*1?X*0P$E_P```(UE\%M>7\G#C78`58GE@^P(5U93BWT(BT4,,=+W +M=QC!X@F)5?S'1?C_____#[?0BT<P9HL<4&:!^___=$B)]@^WPU!7Z(;\__^+ +M3?R--`%65^A%____@\00//]T*#P1=`['1?C_____A,!T`XEU^`^WPU!7Z!+^ +M__^)PX/$"&:!^___=;J+1?B-9>Q;7E_)PXUV`%6)Y8/L!%.+70AJ!&H$C47\ +M4`^W10Q04^@?_/__@\0(!0@$``!0C4-<4(N#@````/_0BT7\9@M%_B7__P`` +MBUWXR<.058GE@^P(5U93BUT(BW40BWT4:@1J"(U%^%`/MT4,4%/HT_O__X/$ +M"`4(`@``4(U#7%"+@X````#_T(M5_&8+5?YFB1:+1?B)!XUE[%M>7\G#C78` +M58GE@^P(5U93BW4(BTT0BWT4BUT,C57X9HE*!,'A$(M"!"7__P``B4($"4H$ +MB7WX:@1J"%(/M]M35NAE^___@\0(!0@"``!0C49<4(N&A````/_0C67L6UY? +MR<-5B>575E.+70B+50RX`0```(72=`;V0A0"=0VX&@```.FI````C78`C7M< +MB=;\N0T```#SI<=#+`````#'0S``````QT,,`````#M#8'T+D/]##`'`.T-@ +M?/:+2PR)2R"+0V@/KT-DT_AFB4,<#[?0@<(``@``N`$```#3X#G"=B2^`0`` +M`(GV_T,@9L%K'`$/MU,<@<(``@``BTL@B?#3X#G"=^/'`P$```#'0SS_____ +M_W-XZ/S___]0Z/S___^)@Y````!FQT,J```QP(UE]%M>7\G#B?95B>53BUT( +M#[=#'%#H_/___XE#+`^W0Q`!P%#H_/___XE#,(-[+`!T!(7`=0>X/P```.L" +M,<"+7?S)PY!5B>6#[`A64XMU"`^W70R+1BS&!`-KC47\4(U%^E!35N@7_O__ +M_W7\:@!35NA?_O__C67P6U[)PU6)Y8/L$%=64XMU"(M]#`^WSXM&+(`\`?]T +M(8H$`21_/$!V#+@=````Z?D```")]@^WUXM&+(`\`O]U!&;_3@@/M]^+1BR` +M)`.`BT8L@`P#:HU%_%"-1?I04U;HI/W__X/$$(-^-`!T$XM&-&;'!)BMWHM& +M-&;'1)@"K=X/M]^+3B#3XP^WQT#3X#G#<RL/M\=`B47TC78`:/\```!35NAT +M^___@\0,@<,``@``BTX@BT7TT^`YPW+?BT8,BTX@*<&X`0```-/@4`^WUXE5 +M\(G0T^!0C49<4(N&B````/_0B<.#Q`R%VW0/BU7P4E;HU?[__XG8ZS"0_T7\ +M=0?'1?P!````_W7\:&D\```/M]]35NA"_?__A<!U#8M&+,8$`_]F_T8(,<"- +M9>1;7E_)PY!5B>6#[`A75E.+70B+=0S_=11H``(``/]U$%:->UQ7BX.$```` +M_]")1?B#Q!2#^!UU,F:+1?ZT`&:)1?Z`3?\1QD7^$6H15E/HF_K__VH$:@*- +M1?Y0C48&4%>+@X0```#_T.L):E564^A[^O__BT7XC67L6UY?R<-5B>6#[`A7 +M5E.+=0B_`@```(M&>,=`'`$```!J`F@``@``_[:0````BU4,4HU>7%.+AH`` +M``#_T(/$%(/X&75-:@1J"(U%^%"+50Q24XN&@````/_0:@1J"(U%^%"+51!2 +M4XN&A````/_0@\0HA<!U+8I%_PI%_B7_````4(M5$%)6Z.GY__^#Y_V#Q`Q7 +M_[:0````BU404E;HZO[__XUE[%M>7\G#B?95B>6#[`Q75E.+?0B+30QFB4WV +M,?:-1?Y0C47\4`^WP5!7Z)GW__]FBUW^@\009CM?''-,9H/^$W=&#[?3BT<L +M@#P"_W0)B@0")'\\0'<QC47Z4(U%^%`/M\-05^A?]___BT7\@,R`@\009CE% +M^'409HE=]F:+7?IF1F8[7QQRM`^W1?:-9>A;7E_)PU6)Y8/L#%=64XM]"(M- +M#&:)3?J+31!FB4WX#[?1BT<P9HL44&:)5?:)RF:!??;__W0#@,Z`#[=U^HM' +M+,8$!@!F_T\(:/__```/M\)05E?HP/?__XG#@\00A=MT#U97Z(C\__^)V.G^ +M````D&:!??;__P^$X`````^W5?:+1RR`/`+_=`V*!`(D?SQ`#X?5````#[=% +M]E!7Z-?^__^)QHU%_E"-1?Q0#[?&4%?H@_;__X/$&&:!??[__W0(NQT```#K +M+9!FBTWZ9HE-_@^WUHM'+(`,`H`/MT7^4`^W1?Q04E?H+??__XG#@\00A=MT +M)`^W1?I05^@I_/__#[=5]HM'+(`D`H"+1RR`#`)JB=CK6(UV`(M-^&8Y3RIV +M2F8Y=?9T1`^W7?:+?RR*!#LD?P^VT`^WQHH$."1_B$7U#[9%]0'"@_H_?PB* +M3?4`##OK%[@?````ZQ*0#[=5^(M',&:+3?IFB0Q0,<"-9>A;7E_)PXUV`%6) +MY8/L!%=64XM]"(MU#`^WUHM'+(`D`H")T8E-_(GVBTW\45?HUOW__XG##[?# +M4%?H>OO__X/$$(7`=05F.?-UWC'`C67P6UY?R<-5B>6#[!Q75E.+?0B+30QF +MB4WR#[?1BT<P9HL44&:)5?#_1U@/MU7PBT<L@#P"_W0[B@0")'\\0'8RC47^ +M4%?H-`,``(/$"(7`#X6+`0``#[=%\E`/MT7^4%?HX?W__X/$#(7`="KI;P$` +M`)"+3?!FB4W^D`^W1?Y05^B=]O__@\0(9CW__W0(9HE%_NOFB?;'1?A55555 +M:@1J!(U%^%`/MUWP4U?HMO3__X/$"`4(!```4(U'7%"+AX0```#_T(M'+(`D +M`X"+1RR`#`-J#[=U\@^O=Q@/MT7^4%?H@/3__XG#QT7L`````,=%Z`````"# +MQ!R+3>P[3QAS/Y!65^B9]___@\0(@_C_=!W_1>PYV'064U!7Z/+[__^#Q`R% +MP`^%M0```/]'5/]%Z$:!PP`"``"+3>@[3QARPH-][`!T2&C__P``#[=%\E`/ +MMT7^4%?H__3__X/$$(7`=7X/MTWRBU<P9HM%_F:)!$H/MU7^BT<L@"0"@`^W +M5?Z+1RR*3>P(#`+K2HUV`(M-\&8[3?YT,<=%]!$1$1%J!&H$C47T4`^WP5!7 +MZ+;S__^#Q`@%"`0``%"-1UQ0BX>$````_]"#Q!0/MU7RBT<P9L<$4/__#[=% +M\%!7Z-K]__^-9=A;7E_)PXGV58GE@^P$5U93BW4(#[=-#(M&,&:+!$AFB47^ +M9CW__W1-#[?0BT8L@"0"@(G/#Z]^&#';.UX8<S975NAY]O__@\0(@_C_=""+ +M3B#3Z(G!#[?1BT8L@#P"`'T$9HM-_@^WT8M&+/X$`D-'.UX8<LJ-9?!;7E_) +MPXGV58GE@^P45U93BTT(BUD80XE=_,=%^`````!FQT7V```Q]F:+7?9F.UD0 +M#X.S````BTT(9CEQ*G<7#[?&4%'H1?___XGQ08M="&:)2RJ#Q`@/M]:+70B+ +M0S!F@3Q0__]T=`^W%%"+0RR*!`*_?P```"''.7W\<EZ$P'P$A?]U5H7_=$?' +M1>P`````#[?&BTT(BU$P#[<$0E!1ZPZ0_T7L)?__``!0BUT(4^@2]/__@\0( +M9CW__W7E.7W\=0B+3>PY3?AS$8M=[(E=^(E]_&:)=?:%_W0.1HM-"&8[<1`/ +M@DW___^+3?R+70@[2QAW'@^W7?:+30B+03!FBQ18BT4,9HD04U'HF_S__^L& +MD+@_````C67@6UY?R<.-=@!5B>6#[`A75E.+70B+=0QFBWLH9H-["`!T:(GV +M9O]#*&:+0RAF.T,<<@AFBT,>9HE#*`^W4RB+0RR`/`+_=3V-1?Q0C47Z4`^W +M0RA04^B>]?__@\009H%]^FD\=!(/MT,H4%/HA/?__X/$"(7`=0UFBT,H9HD& +M,<#K#XGV9CE[*'6:5E/H6_[__XUE[%M>7\G#C78`58GE5U93BUT(BW4,BWT0 +M.W,\=0F+0WB#>!P`=%<[<R1S/E93Z&?T__^)PHE31(/$"(/Z_W0JBX.0```` +MB4-`:@)H``(``%!2C4-<4(N#@````/_0A<!T#[@`````ZR&0QT-``````(ES +M/(M#>,=`'`````"%_W0%BT-$B0>+0T"-9?1;7E_)PU6)Y8/L$%=64XM]#&:) +M??0/M]^)WHM]"`-W+(U%_E"-1?Q04U?HMO#__XU%^%"-1?904U?HF_3__X/$ +M(&:!??S__W0(9H%]]FD\=`C&!O_I\@```(`F$&:+1?Z+?0AF.T<<<RV`#H`/ +MMTW^BU<L@#P1_W0/B@01)'\\0'8&@#P1`'T.#[=5_HM]"(M'+(`D`N]F@WW\ +M``^,J@```(M%_(M]"&8[1Q`/@X,````/MWWTB7WP5XM]"%?HT_/__XG##[=5 +M_(M',&:+#%"#Q`AF@?L1$74(BWWP5^MCB?9F@?G__W08#[?1BWT(BT<L@#P" +M_W0VB@0")'\\0'8M#[=5_(M]"(M',(M]]&:)/%"`)N]F@?M5574&@":`@`YJ +M9H'Y__]T(P^WP>L49H'[555T";@7````ZQ*)]@^W1?10BWT(5^C:^?__,<"- +M9>1;7E_)PU6)Y8/L$%=64XM%#(M="#'2]W,89HE%_`^WR(E-\(M#,&:+-$C! +MX@F)5?B_`0```,=%]`````!F@?[__W0R#[?6BT,L@#P"_W0FB@0")'\\0'8= +M45/HPOG__X/$"(7`#X5>`0``#[=5_(M#,&:+-%!FB77^9H'^__]T39`/MT7^ +M4%/H]>[__P-%^%!3Z+?Q__^#Q!`\_W0H/!%T"SQ5#Y3`#[;(B4WT#[=%_E!3 +MZ(;P__]FB47^1X/$"&8]__]UO&:!??[__W56@_\3=A8/MT7\4%/H1/G__X/$ +M"(7`#X7@````C47^4%/HI_S__X/$"(7`#X7+````#[=%_%`/MT7^4%/H5/?_ +M_X/$#(7`#X6P````#[=5_(M#,&:+-%`/MU7^BT,L@#P"_W0)B@0")'\\0'=] +M:@+_=1`/MT7^4%/H..[__X/$"`-%^%!3Z%_U__^%P'5NBTW\9CE+*G9C9CEU +M_G0X#[=5_HM#+(`\`@!\*XH$`B1_/#]W-P^W5?Z+0RS^!`*#??0`=#</M\:+ +M6RSV!!A_=!O^#!CK)I"#??0`=1\/M\:+4RR*!!`D?SP_=@>X'P```.L+#[?6 +MBT,L_@0",<"-9>1;7E_)PY!5B>575E.+=0B+?0RX'0```(,^`'0*N!<```#K +M/(UV`#M^)'8'N!L```#K+?]&3#';C78`@_@==2`Y?CQU!\=&//____^+51!2 +M5U;HY/W__X/$#$.#^P-^VXUE]%M>7\G#C78`58GE@^P05U93BUT(BWT,@SL` +M=`RX%P```.D6`0``B?:+=1"-!#X[0R1V&;@;````Z?\```"-=@"X'P```.GR +M````B?;'1?@`````Z=8```!74^@Q\/__B47P@\0(@_C_#X2Y````B?@QTO=S +M&&:)1?8/M\B+0S`/MQ1(BT,L@#P"_W0HB@0")'\\0'8?45/H6/?__X/$"(7` +M#X65````5U/HXN___XE%\(/$"&:+1?ZT`&:)1?[&1?X`:@"+=?!64^BB[O__ +M:@1J`HU%_E"+1?"#P`90C4-<4(N#A````/_0BTL@T^Z)\0^WT8M#+(/$((`\ +M`@!]"P^W5?:+0S!FBPQ09HMU]F8Y<RIV$P^WT8M#+/8$`G\/A!S____^#`+_ +M1?A'_T-0BW40.77X#X(>____,<"-9>1;7E_)PU6)Y3'`R<.058GEBT4(BT`D +MR<.058GE4XM="(-[+`!T"_]S+.C\____@\0$@WLP`'0+_W,PZ/S___^#Q`2# +M>S0`=`O_<S3H_/___X/$!(-[.`!T"/]S..C\____BUW\R<.-=@!5B>6#["A7 +M5E.+50B+71"-!-*-!(*--(4@````:@YJ`(U%\%#H_/___\=&-`````#'1C@` +M````4U;H)O#__X/$%(7`#X62`P``BT44C4Y<B0AFQT8$``!F@WX<`'12C5WP +MC78`:@!J#E,/MT8$4%;H..O__X/$"%"-1EQ0BX:`````_]!J!FC<````4^C\ +M____@\0@A<!T#F;_1@1FBT8$9CM&''*^9HM&!&8[1AQR#+@:````Z2$#``") +M]F:+1@1`9HE&!F8[1AQS48U=X(GV:@!J#E,/MT8&4%;HS.K__X/$"%"-1EQ0 +MBX:`````_]!J!FC<````4^C\____@\0@A<!T#F;_1@9FBT8&9CM&''*^9HM& +M!F8[1AQR!F;'1@;__V:+1?9FB48<BT7X9HE&'HU%^E#H_/___\'H"8E%W(E& +M)&:+1AYF`48<N@$```"+7B")T(G9T^!(B484@\/WB=G3XHE6&(M]W(U$.O\Q +MTO=V&&:)1A"+?B33[XE]W`^W3=P/MT8<#[=6'BG0@\0$.<%^#+@7````Z3T" +M``")]E;HEN___X/$!(7`#X4J`@``QP8`````:@(/MT8<4/]V+`^W1@105NC@ +MZ?__@\0(!0`"``!0C49<4(N&@````/_0B478@\04A<!T$5;HO_W__XM%V.GB +M`0``C78`,=MF.UX0<Q0/M].+1C!FQP10__]F0V8[7A!R[#';9CM>''-"9CM> +M'G(89CM>!'029CM>!G0,#[?3BT8L@#P"_W0<#[?3BT8L@#P"_W0&Q@0":^L* +M#[?3BT8LQ@0":F9#9CM>''*^,=MF.UX<<RZ)]@^WTXM&+(H$`@26/`%V%5)6 +MZ%[X__^)1=B#Q`B%P`^%6____V9#9CM>''+49L=&"```9HM>'F8[7AQS,`^W +MPP-&+(`X$'0%@#B0=1`/M\-05N@^\___@\0(ZPF0@#CO=0/&`/]F0V8[7AQR +MT&;'1@@``&:+7AYF.UX<<QF+5BR0#[?#@#P0_W4$9O]&"&9#9CM>''+K9HM& +M'F:)1BC'1E``````QT9,`````,=&2`````#'1E@`````QT94`````(M]#(DW +MQT<$L!L``,='"%0?``#'1Q2X'P``QT<@_"```,='&/0@``#'1QP((0``QT<, +M`````,='$``````/MT8<P>`"4.C\____B48T@\0$A<!T)C';9CM>'',>#[?# +MBU8T9L<$@JW>BU8T9L=$@@*MWF9#9CM>''+B#[=&'(M.((/!]=/@4.C\____ +MB<*)5CB#Q`2%TG05#[=&'(M.((/!]=/@4&I54NC\____,<"-9<Q;7E_)PY!5 +MB>564X,]``````!^"KAF````ZU:-=@"+-0````"-%/4`````N`````#'!`)8 +M(0``QT0"!`````#_!0`````QTKM,````N5````"0C032C02"P>`"QP08```` +M`,<$"`````!"@_H'=N,QP(UE^%M>R<.0D%6)Y8M-"(M5#(G0P>@(B$$!B!') +MPXUV`%6)Y8M%"&8/ME`!9L'B"&8/M@`!P@^WPLG#B?95B>564XMU"(M=#`^W +MPU!6Z+?____!ZQ!3@\8"5NBJ____C67X6U[)PXUV`%6)Y593BUT(4^BJ____ +MB<:#PP)3Z)____\/M];!X!`!PHG0C67X6U[)PY"058GEN`$```#)PXGV58GE +MR<.-=@!5B>7)PXUV`%6)Y3'`R<.058GER<.-=@!5B>7)PXUV`%6)Y3'`R<.0 +M58GE,<#)PY!5B>7)PXUV`%6)Y5=64XM]#(,]``````=V"KAF````Z:T````Q +M]H,]``````</AY$```"0_S4`````Z/S___^)PXDS:@)3Z/S___]7BU4(4O\S +MZ/S___^)0RB#Q!B%P'1CQT4(`````#'_QT-`/"8``,=#1$@F``#'0TA0)@`` +MQT-,6"8``,=#4&`F``#'0U1H)@``QT-8<"8``,=#7'@F``#'0V``````QT-D +M@"8``$;_!0````"#/0`````'#X9P____A?9T!#'`ZP6X/````(UE]%M>7\G# +MD)"058GEBU4(BT(8BT`HQH`&$````(M"&(M`*,:`!A````K)PXGV58GEBU4( +MBT(8BT`HQH`&$````(M"&(M`*,:`!A```"K)PXGV58GEBT4(BT`8BT`HQH`& +M$````LG#C78`58GE@^P$5E.+=0C&1?\`BT88]D`<"'0L,<F)PXM#*(I5_XJ` +M!A````#"B%7_08/Y`7[IBT88BT`HBH`&$```ZRZ-=@`QR8M>&(UV`(M#*(I5 +M_XJ`!Q````#"B%7_08/Y`7[IBT88BT`HBH`'$```)(`E_P```(UE]%M>R<.- +M=@!5B>575E.+70B+=0R+31#V0Q4!=3>+?13WQP0```!T)(L1@>+_`0``QP90 +M````@_H'=PF!`0`!``#K;Y"#`?CK:8UV`,<&`````.M>BT,89HLY9B-X"(GX +M#[?0*1&+?13WQP0```!T!H'"``(``(M#&`^W0`HYPG,+QP8`````ZQV-=@"+ +M0Q@/MT`&.<)S"<<&`0```.L'D,<&4````(M#&`^W0`I((<(!$8UE]%M>7\G# +MB?95B>6#[`164XMU",9%_P`QR8M>&(M#*(I5_XJ`(!````#"B%7_08/Y`W[I +MBT88BT`HBH`$$```B$7^,<F+7AB0BT,HBE7_BH`@$````,*(5?]!@_D!?NF* +M1?[`Z`<T`27_````C67T6U[)PY!5B>564XMU"#';B?96Z(+___^#Q`2%P'4' +MN`$```#K"T.!^R]U``!^XS'`C67X6U[)PXGV58GE@^P$4XM-"(M5#,9%_P"+ +M01B+0"B(D`00```QVXM)&(GVBT$HBE7_BH`@$````,*(5?]#@_L#?NF+7?C) +MPU6)Y8/L!%93BW4(BUT,QD7_`&H(5NBF____BT88BT`HB)@%$```,<F#Q`B+ +M7AB)]HM#*(I5_XJ`(!````#"B%7_08/Y`W[I:AE6Z''___^-9?1;7LG#B?95 +MB>6+30B+01B+4"B*@@$0``"$P'4;QH("$```A8M!&(M`*,:``A```(6+01C& +M0!4`R<.058GE4XM%"(M=#&H`_W`<Z/S___^(F`(0``"(F`(0``"+7?S)PXUV +M`%6)Y8/L!(M5#(J"`!```#PP=16*@@80``"(1?^*1?^*D@80``#K$Y"*@@<0 +M``"(1?^*1?^*D@<0```PT(A%_HI%_J@$=`8QP.L'B?:X`0```,G#D%6)Y8M5 +M#,:"`A```(3&@@(0``"$QH("$```A<:"`A```(6*@@`0```\('0*BH(`$``` +M/#!U%E+_=0CH;?___X7`=0FX`0```.L$B?8QP,G#58GE@^Q(4XM=##'2C4VX +MD(H$&H@$"D*#^D=^](!]N%5U1H!]N:IU0(!]NA!U.FH,:.(```"-1;]0Z/S_ +M__^%P'4*N#````#K(8UV`(!]^%5U%H!]^:IU$(!]^A!U"K@@````ZP6-=@`Q +MP(M=M,G#D%6)Y8/L!%=64XM]#(7_=3"#?1``=2J+/0P```"+#1````")31#K +M,I")WXV/`"```(D-%````(GXP>@,Z5L!``")/0P```"+31")#1````#'!10` +M````````@ST4``````^%*`$``(M-$(D-%````)"A%`````4`X/__HQ0````Y +M^'(I4(M-"%'H`____X/$"(7`=-R+'10```#&@P(0``"$QH,"$```A.O&B?:+ +M31")#10```"-=@"A%`````4`X/__HQ0````Y^')54(M-"%'HN_[__XG&@\0( +MA?9TVHL=%````,:#`A```(7&@P(0``"%4XM-"%'H\/W__X/$"(7`=;6Z!1`` +M`(/^,'4%NAL0``"A%````,'H#8@$&NN9D(D]%````.MF_S44````BTT(4>A9 +M_O__B<:#Q`B%]G1$BQT4````4XM-"%'HG/W__X/$"(7`=2VZ!1```(/^,'4% +MNAL0``"*!!H/MM"+'10```")V,'H#27_````.<(/A*3^__^!!10`````(``` +MBTT0.0T4````<H\QP(UE\%M>7\G#D%6)Y593BW4(BT8(#Z]&$$B+70PAP_9& +M%0%T#XG8P>@)P>`(#[;3B<,)TVH55N@B_/__BT88BU`HBT`DB!P0BT88BT@H +MBU`DB=C!Z`B(!`J+1AB+2"B+4"2)V,'H$(@$"HM&&(/$"/9`'`AT"HM`*,:` +M'A````!J,5;HUOO__XUE^%M>R<.-=@!5B>564XM="(MU#&H34^BY^___BT,8 +MBU`HBT`DB?&(#!"+0QB#Q`CV0!P(=`F+0"B(B!X0``!J$5/HCOO__XUE^%M> +MR<.-=@!5B>6#[!!75E.+=0B+?0R+1AB)1?R`>!0!=C*+#XG(BUW\,=+W<QB) +MP8A-]SI+%70/B$L5BT88BT`HB(@#$```#[9%]XM6&`^O0A@I!XUEY%M>7\G# +MC78`58GE@^P$5E.+70B+=0QJ`/]S'.C\____B<*+0QB)4"A64^B!____BT,( +M#Z]#$(E%_(L6B=`QTO=U_(G!#[;!4%/H)OO__XUE]%M>R<.-=@!5B>6#[`17 +M5E.+?0B+=1#&1?\`BT<8]D`<"'0\BT`HBE7_BH`=$````,*(5?].B?.!_@`! +M``!^!;L``0``4XM7&(M")`-"*%"+30Q1Z/S___^#Q`SK!(GV,=LYWGX:B?`I +MV%"+5QB+0B0#0BA0BT4,`=A0Z/S___^+1QCV0!P(=`^+0"B*@!\0``"+30R( +M!`Z-9?!;7E_)PU6)Y5.+70C_=1#_=0R+4QB+0B0#0BA0Z/S___^+0QCV0!P( +M=`J+0"C&@!X0````BUW\R<-5B>53BUT(_W40#[9%#%"+4QB+0B0#0BA0Z/S_ +M__^+0QCV0!P(=`J+0"C&@!X0````BUW\R<.)]E6)Y8/L!%93BW4(QD7_`&IP +M5NCU_?__BT88BU`HBD7_BI(-$````-"(1?\QR8/$"(M>&)"+0RB*5?^*@"`0 +M````PHA5_T&#^0%^Z8M&&(M0*(M`)(H<$&H85NAY^?__#[;#C67T6U[)PXUV +M`%6)Y593BUT(BW40#[9%#%!3Z(K]__]64^C[_/__4^@5^?__C67X6U[)PXGV +M58GE4XM="/9#%0)T%&C_````4^A<_?__4^CN^/__@\0,#[9%#%!3Z$C]__]H +M@````%/H/?W___]U$%/HK/S__U/HQOC__XM=_,G#D%6)Y5.+70AJ$%/H&?W_ +M_U/HJ_C__U/H`?___Z@!=04QP.L&D+@=````BUW\R<.)]E6)Y8/L%%=64XMU +M"(M]%(M-$(E-\,=%[`````#'1?0`````_W8<Z/S___^#Q`2%P'0*N!,```#I +MK@$``(U%#%!6Z%+]__^+31A1C44,4(U%]%!6Z!CW__^#Q!CV1A4"=#N#??0! +M=36+1AB+70QF(U@(#[?;@\,"#[=`"@-%#"G84&H`5NC[_O__4VC_````5N@? +M_O__@\08ZQ&)]O]U#/]U]%;HW/[__X/$#(M-&/;!`G0)5NC[]?__@\0$]D85 +M`75^#[=%#+H``0``BTT8]L$$=`6Z"````(M-&/;!!'0(@^`'ZPB-=@`E_P`` +M`(G3*<,Y^WX"B?LIWU.+3?!15NA\_?__@\0,A?]^0X7;?A%6Z+O^__^#Q`2% +MP`^%R@```(G8`T4,4&H`5NA6_O__5XM%\`'84%;H1?W__X/$&.L.5XM-\%%6 +MZ#7]__^#Q`R+31CVP0)T?&HA5NAF]___BT88@\0(]D`<"'0:,=*+1AB+0"C& +M@"`0````0H/Z`G[MZQ"-=@!J`VH`5N@F_?__@\0,:C%6Z"OW__]J!HM&&(M` +M*`40$```4(U=^%/H_/___U;H(O7__VH&4U;HP?S__X/$)&H":!@```!6Z+'\ +M__^#Q`Q6Z/C]__^#Q`2%P'4+:AA6Z-WV__^+1>R-9>!;7E_)PXGV58GE@^P( +M5U93BW44BWT8BTT0B4W\QT7X``(``/?'!````'0'QT7X"`````^W10R+5?A* +M(="+7?@IPXM-"%'H)??__X/$!(7V?CZ)]CGS?@*)\X'[``(``'0#@^?]B?A0 +M4XM-_%&+30Q1BTT(4>B:_?__@\04A<!U$2G>`5T,`5W\BUWXA?9_Q#'`C67L +M6UY?R<.)]E6)Y8/L'%=64XMU",=%Y`````#'1>@`````BT4,B47LC44,4%;H +MYOK__XM-&%&-1>Q0C47H4%;HK/3___]U[/]UZ%;HB/S__X/$)(M-&/;!`G0) +M5NBO\___@\0$]D85`75B#[=%#+H``0``@WWH4'4+N@@```"#X`?K!I`E_P`` +M`(G3*<,[711^`XM=%(M]%"G?4XM-$%%6Z,/Z__^#Q`R%_WXQB=@#10Q0:@!6 +MZ![\__]7BT40`=A05NBA^O__@\08ZQ&+3111BTT045;HCOK__X/$#(M-&/;! +M`@^$C0```&H&C47X4%;H<_K__U;H=?/__X/$$(7`=&MF@WT8`'P;BT48@,R` +M4(M-%%&+31!1_W4,5NCG_O__ZUZ0:@:+1AB+0"@%$!```%"-7?!3Z/S___^* +M5?"*1?2(1?"(5?2*5?&*1?6(1?&(5?5J`5.+31!1Z/S___^#Q!B%P'0'QT7D +M&0```%;HY?+__X/$!&H85NC&]/__BT7DC6786UY?R<.-=@!5B>6#[`A75E.+ +M=12+?1B+31")3?S'1?@``@``]\<$````=`?'1?@(````BTT(4>@<]?__#[=% +M#(M5^$HAT(M=^"G#@\0$A?9^/HGV.?-^`HGS@?L``@``=`.#Y_V)^%!3BTW\ +M48M-#%&+30A1Z`K^__^#Q!2%P'41*=X!70P!7?R+7?B%]G_$,<"-9>Q;7E_) +MPXGV58GE@^P05U93BW4(QT7X`````(M=#`^O7@2)7?S_=ASH_/___XG'@\0$ +MA?]T"K@3````Z60!``"+50P#51"+1A@/MT`.#Z]&##G"?@NX'0```.E%`0`` +MD%;H7O3__XG8BTX8,=+W<1B)PXA=\P^V7?-##Z]9&(G8F?=^!(G#BTT,`TT0 +M@\0$.=E^1RM%#(M5$"G"4E-6Z&7___^)QX/$#(7_="CI\P```(UV`,=%^!T` +M``!H_P```%;HFO?__U;H+//__X/$#.FV````*UT,B5T0C47\4%;H'/C__S'_ +M@\0(.WT0#XV8````B?:+1AAFBU@29@^O70QH_P```%;H5??__U;HY_+__VI@ +M5NA']___:A56Z`OS__^+1AB+4"B+0"2('!"+1AB+4"B+0"1FP>L(B!P0BUX8 +M@\0<]D,<"'0*BT,HQH`>$````&H15NC1\O__:-````!6Z/KV__]6Z(SR__]6 +MZ.+X__^#Q!BH`0^%-____T?_10P[?1`/C&K___^#??@`=1%6Z+[X__^H`70' +MQT7X'0```(M%^(UEY%M>7\G#58GEBT4(C12`C110C025P`0``,G#C78`58GE +M4XM="&H`_W40BT,8_W`@_W4,4^B5_?__BT,<QT`<`0```(M#&(M`((M=_,G# +M58GE@^P$5E.+30B*70R)WHI=$(A=_XM1&(!Z%0`/A<D!``"#?10`#X6_`0`` +MB?`E_P```&:)`HM1&&8/ML-FB4("BT$89L=`$A``B?`E_P```#V8````#X33 +M````/>P````/A:@!```/ML,]XP```'16?Q2#^&1T,H/X<P^$A@```.F)`0`` +MD#WF````=%E_#SWE````=##I<P$``(UV`#WJ````#X5E`0``9L<!9.R+01AF +MQT`$``''00@``"``Z4$!``"-=@!FQP'E[(M!&&;'0`0``L=!"```0`"`214! +MZ2`!``")]F;'`>;LBT$89L=`!``"QT$(``"``(!)%0'I``$``(GV9L<!<^R+ +M01AFQT`$``+'00@````!@$D5`8M!&&;!8!(!Z=@```")]@^V1?^#^',/A(<` +M``!_$8/X9'0O@_AK=$/IP@```(GV/>8```!T47\//>4```!T+.FK````C78` +M/>H````/A9T```!FQP%DF(M!&&;'0`0``<=!"```(`#K6XGV9L<!Y9B`214! +MBT$89L=`!``"QT$(``!``.L^D&;'`>:8@$D5`8M!&&;'0`0``L=!"```@`#K +M(I!FQP%SF(M!&&;'0`0``L=!"`````&`214!BT$89L%@$@&`214"ZQN0B?`E +M_P```(M1&&8[`G459@^V1?]F.T("=0JX`0```.L%C78`,<"-9?1;7LG#C78` +M58GE@^P$5U93BUT(QD7_`&B0````4^@U]/__:AU3Z/GO__^+0QB+4"B+0"3& +M!!``BT,8@\00]D`<"'0*BT`HQH`>$````&H94^C.[___:@KH_/___XM#&(M0 +M*(I%_XJ2#1````#0B$7_,<F#Q`R+<QB-=@"+1BB*5?^*@"`0````PHA5_T&# +M^0%^Z8M#&(M0*(M`)(H4$(A5_FH*Z/S___^+0QB+4"B*1?^*D@T0````T(A% +M_S')@\0$BW,8C78`BT8HBE7_BH`@$````,*(5?]!@_D!?NF+0QB+4"B+0"2* +M!!"+?0Q7)?\```!0#[9%_E!3Z.S\__^#Q!"#^`%T"#'`Z8(```"0_T,,:A!3 +MZ`GO__^+0QB`>!4`=6B#?0P`=6)FQT`*``&+4QAFBT($9HE"!O9#%0%T"XM# +M&&;'0`P0`.L)BT,89L=`#`@`BT,89HMX!D]FB7@(BTL8#[=!$@^W408/K\*) +M0P2+0PB9]WL$9HE!#HM#&&:+4`QF`U`&9HE0$+@!````C67P6UY?R<.-=@!5 +MB>6#[!!75E.+=0C'1?@`````QD7S`/]V'.C\____B<*-!)*-!$*-!(7`!``` +MB488_W8<Z/S___]0Z/S___^)PHM&&(E0(&B%````5N@"[___:A#_=ASH_/__ +M_VIX_W8<Z/S___^+1AC'0!@!````BT88QD`4!(M&&,9`%03'1@P`````QT8( +M```@`,=&$`$```"#Q"1J`/]V'.C\____B<*+1AB)4"B+5AB+0BB#Q`B*@``0 +M```\,'41@$H<"(M&&,=`)``(``#K"Y"+1AC'0"0`&```C47X4%;H?/+__XM6 +M&(/$"/9"'`AT'(M"*(J`!A```(A%_XM2*(I%_XJ2!A```.L=B?:+5AB+0BB* +M@`<0``"(1?^+4BB*1?^*D@<0```PT(A%_HI%_J@$#X1U`0``BT88BT`HBH`` +M$```OQ`````\,'4%OP(```"+1AC&0!4`BT88B<*`>!4#=T&0B="+4"B*0!6( +M@@,0```QVSG[?1T/ML-05NA*[?__:/\```!6Z#/Q__^#Q!!#.?M\XXM&&/Y` +M%8M6&(!Z%0-VP(M&&,9`%0"+1AB+4"B*0!6(@@,0``!J&%;HRNS__\9%\@"# +MQ`B-=@`QVSG[?7&)]HM%^(E%](U%]%!6Z'SQ__]35NB%_/__@\00@_@!=2F* +M3?+^P8A-\X!]\@!U#8M&&(M6"`^O5A`!4!B+1@@/KT80`47XZR2)]H!]\@!U +M%HG?BU88B=@/KT8(#Z]&$(E"&.L(B?:)^\9%\@1#.?M\D?Y%\H!]\@-V@(M& +M&,9`%0"+1AB+4"B*0!6(@@,0``"#?@P`=$3'1?@`````C47X4%;HY_#__XM& +M&(I-\XA(%%;H&.K__\=&*,`R``#'1BQL-0``QT8DV#0``,=&("@W``"`3A0" +M,<#K!;@:````C67D6UY?R<.-=@!5B>6#/0``````?R2+%0````"-!)4````` +MQX``````"#L``/\%`````#'`ZPB-=@"X9@```,G#D%6)Y8/L.%=64\=%R``` +M``"+30A1Z/S___^)PK\:````C47,4%+H_/___XG&@\0,A?9T"8/^&@^%M0`` +M`(M-#,=!)``````QVSL=`````'U"A?]T0K@`````@WS8!`!T*8T4W0````") +MQXU%R%`QP(7V=0.-1<Q0BTT,48M-"%&+!#K_T(G'@\000SL=`````'R^A?]U +M68-]R`!T#(M%R%"+0##_T(/$!(-]$`!T03';.QT`````?3>^`````(UV`(T$ +MW0````"#?#`$`'48:@!J`(M-#%&+30A1BP0P_]"#Q!"%P'0)0SL=`````'S1 +MB?B-9;Q;7E_)PXUV`%6)Y3'`R<.058GE4XM-"(M=#&8/MA&*00$D`V;!X`@) +MPF:)$P^^40&!XOP```#!^@**00(D#V:89L'@!@G09HE#`@^^40*!XO````#! +M^@2*00,D/V:89L'@!`G09HE#!`^^40.!XL````#!^@9F#[9!!&;!X`()T&:) +M0P:+7?S)PXUV`%6)Y593BTT(BUT,#[_#`<"+51`!PH/"_C'`9CG8?1>0B<Z# +MY@%FB3*#POYFP?D!9D!F.=A\ZHUE^%M>R<.-=@!5B>575E.+50R)T0^_P8T$ +M1?[___^+?0@!QS'VNP$```!F26:%TGX99HL'@\?^9H7`=`()WF8!VXG(9DEF +MA<!_YP^_QHUE]%M>7\G#58GE#[]%"%#HCP$``(G"N/\#```IT)A0Z$<!``"8 +MR<-5B>564XM%"(M5#(G!B=9FA<!T!6:%TG4',<#K+XUV``^_P5#H4P$``(G# +M#[_&4.A(`0```=B#Q`AF/?\#?@4%`?S__YA0Z/D```"8C67X6U[)PY!5B>53 +MBUT(#[]%#%#H>____YA0#[_;4^B0____F(M=_,G#B?95B>6#[`A75E-FQT7^ +M``!FQT7X_@&-=@"+30AFBSD/OT7X4.BD````B<-FB5W\BT7X`<"#Q`1F/?X# +M?@4%`?S__V8!P&8]_@-^!04!_/__F%#H=@```&:)1?J^`0```(/$!(GV#[_; +M4P^_QHM-"`^_!$%0Z!#___\QQU,/OT7\4.@#____B<.#Q!!F1F:#_@-^T@^_ +M1?I0#[_'4.@\____B<(/OT7^BTT,9HD408/$"&;_1?YF_T7X9H-]_@,/CE7_ +M__^-9>Q;7E_)PY!5B>6+30@QTK@!````9CG*?2*)]F8!P&8]_P-^$*@(=`<% +M^?O__^L%!0G\__]F0F8YRGS@F,G#D%6)Y8M%"(G!9H7`=0NX_____^LXF.LU +MD#'`N@$```"09CG*=.]F`=)F@?K_`WX3]L((=`B!POG[___K!H'""?S__V9` +M9CW_`W[6,<#)PXGV58GE@^PD5U93BTT09HE-_F;'1?P``#'_9CE-_`^-(@$` +M`(GV#[]%_(M=#&:+'$-FB5WTBW4(#[\$1HT$@`'`@\#ZB<%FP?D#B<IFP>(# +M*=!!9HE-\F:#^`=U70^_QT&+711FB0Q#1XMU]/?&`0```'0.BTT89L<$08`` +MZPR-=@"+71AFQP1#``!FP7WT`0^_QV:+3?*+=11FB0Q&BU7TM@"+71AFB11# +M1P^_QXMU]&;![@CK>(UV`+D(````*<%FB4WZN`H````IR`^_WV:+3?*+=11F +MB0Q>F(E%Y(M5]&8C%$4<````#[_2N`@````K1>2)P=/BBW489HD47D</OT7T +MBTWDT_AFB47T#[_'9HMU\DZ+711FB31##[]-^HMU]+L<````9B,T2XM=&&:) +M-$-'9O]%_&:+3?YF.4W\#XS@_O__9L=%_```9L=%XO__9CE]_'UBB?8/OUW\ +MB5WDBW489H,\7@!T10^_5>*+311FBP199CL$47429H-]X@!\"V:+'%YF"1Q6 +MZR.09O]%X@^_=>(/OU7\BTT49HL$46:)!'&+71AFBP139HD$<V;_1?QF.7W\ +M?*!FBT7B0)B-9=!;7E_)PXGV58GE#[]%"%#HV_W__S')@\0$B?:)PL'J"8/B +M`68!P(#D`PG09D%F@_D(?NB84.A]_?__F,G#B?95B>6#[#175E,QVS'2C78` +M#[_"BTT(9H,\00!T`4-F0F:#^@-^ZF:%VW4),<#IN`,``(GV9H/[`P^.L@`` +M`(M]"`^_!U`/OT<"4.@Y_/__9HE%U`^_1P)0#[]'!%#H)OS__XG&#[]'!%`/ +MOT<&4.@5_/__@\089CEUU'5T9CG&=6\/O]Y3Z";]__^#Q`1F/9X!?UV+30QF +MB0%3Z'7[__^)PC';@\0$B?8/O\)04.B"^___B<*#Q`A#@_L(?NN+?0@/OT<" +M4`^_1=10#[_"4.AA^___@\0(F%#H5_O__XM-$&:)`;@!````Z?T"``"-=@"+ +M?0@/OT<$4`^_!U#H,_O__XG##[]'`E`/OT<"4.@B^___B=XQQH/$$&:%]@^$ +M:@(``(M-"`^_0090#[]!`E#H`/O__XG#BWT(#[]'!%`/OT<$4.CL^O__B=HQ +MPH/$$&:%T@^$-`(```^_QE`/O\)0Z"/[__]FB47.BTT(#[]!!%`/OT$"4.BY +M^O__B<.+?0@/OT<&4`^_!U#HIOK__XG:,<*#Q!AFA=(/A.X!```/O\90#[_" +M4.C=^O__B<,/O\-04.A]^O__F%`/OT7.4.C%^O__B<*-1=A0:@H/O\)0Z+3Y +M__^#Q"1F@WW<``^%J@$``&:+1>IFB47TBTW89C--VF:)3?:+?>0QQV:)??B+ +M3>`QP6:)3?)FBT7>,T7@,T7D9HE%[HM]V#''9HE][(M-Z#'Y9HE-_&:+1>9F +M,T7R,<AFB47Z9HM%XF8S1?IF,T7V,?AFB47P9L=%_@``:@J-1>Q0Z'#Y__]F +MB47.B<>#SP&84`^_VU/HR/G__V:)1<X/O\=04^BZ^?__9HE%U@^_1<Y0Z"C[ +M__]FB472#[]%UE#H&OO__V:)1="#Q"!F@7W2G@$/C^,```!F/9X!#X_9```` +M9HM-UF8S3<YFB4W4#[]=SE/H__S__XG&4U/H8OG__XG"#[_"4`^_QE#HI_G_ +M_XG&#[]%U%`/O\90Z$/Y__^)PX/$'&:%VP^$C0````^_1=90BWT(#[\'4.@D +M^?__B<)F,U<"@\0(9H72=&X/O\-0#[_"4.A=^?__BTT09HD!#[]=UE/HC?S_ +M_XG&4U/H\/C__XG"#[_"4`^_QE#H-?G__XG&#[]%U%`/O\90Z-'X__^)PX/$ +M)&:%VW0?#[]%SE"+?0@/OP=0Z+;X__^)PF8S5P*#Q`AFA=)U"+C_____ZU>0 +M#[_#4`^_PE#HY_C__XM-$&:)00*+?=!F.7W2?B.+30QFB3EFBWW29HEY`HM- +M$&:+$6:+00)FB0%FB5$"ZQ.)]F:+3=*+?0QFB0^+3=!FB4\"N`(```"-9<!; +M7E_)PXGV58GE@^P@5U93BUT(BWT,C47X4%/H__;__V8/MDL%9HE-YHU%\%"- +M1?A0Z(GX__^-1>Q0C47H4(U%\%#HS/O__V:)1>*#Q!QFA<!U!#'`ZWUF@WWB +M`'QQ,=(/OT7BB<,YPGT8C47HOIX!``"0B?%F*PQ09HD,4$(YVGSQBTT448M- +M$%$/OT7B4(U%[%"-1>A0Z'?Y__^(!S'`,=*`/P!^&P^^'Y"+31!F@3Q1``)_ +M!XM-%&8S!%%".=I\Z68[1>9U![@!````ZP6X`@```(UEU%M>7\G#C78`58GE +M@^P@5U93C47H4(U%]%"-1>=0_W4,Z`O___^#^`%U-3')@'WG`'XKC7WTC77H +M#[Y=YXE=X)"-%$T`````#[\$.C-%$(H4,HM="#`4&$$[3>!\XS'`C6746UY? +MR<.058GEBT4(_W4,_W`<Z/S____)PY!5B>53BU4(BUT0BT444%#_=0Q2BT(@ +M_]"#Q`Q04^C\____,<"+7?S)PXUV`%6)Y;@3````R<.)]E6)Y;@3````R<.) +M]E6)Y8M%"&H`:@#_<!SH_/___\G#58GE@^P(5U93BWT(BTT04?]W'.C\____ +MB<:#Q`C&1?K_@WT,`'0$QD7Z\#';C78`BDWZB`PSB`PSA=MU!8H.B$W[@WT, +M`'085FB0````BT40`=A05XM-#/_1@\00ZP60Q@0SD(7;=0B*#HA-_.LMD(H$ +M,SI%_'4'B@8X1?MT'8I%_&;!X`B*%#-F#[;2"=!FB0>*3?J(##/K#HGVBDWZ +MB`PS0X/[#GZ(C4/_A=AT"6;'!P``ZP6)]HE?$(UE[%M>7\G#D%6)Y8/L!%=6 +M4XM]",9%__^#?0P`=`3&1?_P:@"+31!15XM'(/_0B<:#Q`R#?0P`=!-6:)`` +M``!J`%>+30S_T8/$$.L#Q@:0QT<,`````(GV:@"+1PP/KT<(`T404%>+1R#_ +MT(G&@\0,@W\,`'X:B@:)PF;!X@B+1Q"*!#`E_P````G"9CL7='2#?PP`#Y3` +M#[;8.U\0?5*0@WT,`'0>5FB0````BT<,#Z]'"`-%$`'84%>+30S_T8/$$.L$ +MQ@0SD(H$,XG"9L'B"(G8`T<0B@0P)?\````)PF8[%W4?BDW_B`PS0SM?$'RO +MBT<0`4<,@7\,SP<```^.5/___VH`BTT045>+1R#_T(G&BDW_B`XQP(-_#`!U +M!;@:````C67P6UY?R<-5B>6#[`A3BT4(:@#_<!SH_/___XG#BA.(5?LQR832 +M=0*Q_\=%_`````"+1?R(#!B+1?R*!!@/MM`/OL$YPG0$,<#K#HM%_(I5^X@4 +M&+@!````BUWTR<.058GE5U93BT4(BW4,OQH```")1AQ6Z([___^#Q`2%P'5[ +M9L<&``#'1A0`````QT8@'$D``,=&)#!)``#'1BA<20``QT8L:$D``,=&,'1) +M```QVSL=`````'T>B?:%_W0<5HL$G0````#_T(G'@\0$0SL=`````'SDA?]U +M!#'`ZR''1@@``!``QT8$`!```,=&#`$```#'1A`!````N!H```"-9?1;7E_) +MPY"0D%6)Y8M%"(L`R<.)]E6)Y8M%"(T40(T4D(T$U2`&``#)PXUV`%6)Y8M5 +M"(T$E0````"+@&`)``#)PXUV`%6)Y8M%"%"+0%S_T,G#B?95B>564[L@!@`` +M,?8[-0````!S=&CZ````4^CM````:A!3Z,T```!J`E/H]0```,=#"`````!H +M$`(``.C\____B02U8`D``(/$'(7`=0JX/P```.LUC78`4XM#3/_0@\0$A<!U +M)5.+0TC_T,=#%`````#'0PP`````@\0$1H/#:#LU`````'*,,<"-9?A;7LG# +MC78`58GEBT4(BT`LR<.058GE5U93BW4(BWT,@7XL_W\``'4)5HM&4/_0@\0$ +MBT8T]]B)^R'#P>L,.5XL=!%35HM&5/_0B5XLQT8<`0```(M&-$@A^`-&,(UE +M]%M>7\G#C78`58GEBU4(BT4,B4(\QT(L_W\``,G#C78`58GEBU4(BT4,B4(X +MQT(L_W\``,G#C78`58GEBT4(BU4,P>(,B5`TBU`HP>(,B5`PQT`L_W\``,G# +MC78`58GEBT4(@WT,`'4(4.AN````ZP['0"S_?P``QT`<`0```,G#58GE4XM= +M"/]##(-[%`!U%U.+0T3_T(/$!(-[(`!T"/]S)(M#(/_0QT,4`@```(M=_,G# +MD%6)Y8M%"(-X#`!^`_](#,G#C78`58GEBT4(BU4,BTT0B5`@B4@DR<-5B>6+ +M10B#>!``=4>#>!@"=0K'0!@!````ZPZ0@W@8`74'QT`8`````(-X#`!U)(-X +M%`)U"\=`%`$```#K%8GV@W@4`74-QT`4`````%"+0$C_T,G#C78`58GEBT4( +M@WA@`'0)_W4,4(M`8/_0,<#)PXUV`%6)Y5.+70AJ`%/H5?[__U/H3____VH` +M4^CO_O__4XM#9/_0BQN-!)T`````_[!@"0``Z/S___^+7?S)PTTM4WES=&5M +M<R!$:7-K3VY#:&EP`````(`*``#("@``R`H``,@*``"`"@``@`H``,@*``#( +M"@``R`H``,@*``#("@``D`H``)`*``"0"@``D`H``/`*``#P"@``\`H``/`* +M``#@"@``X`H``/`*``#P"@``X`H``/`*``#P"@``X`H``.`*``#@"@``X`H` +M`.`*``#P"@``!`L```P+``#!"P``N`L``+@+```X"P``2`L``%0+``!@"P`` +M;`L``'@+``"$"P``D`L``)P+``"H"P``%`L``"P+``!!3D%.1``H0RE-+5-Y +M<W1E;7,````````````````````15?\`@`P````/``````!550`````!``,` +M!P`/`!\`/P!_`/\````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````$=#0SH@*$=.52D@96=C<RTR+CDQ+C8V(#$Y +M.3DP,S$T("AE9V-S+3$N,2XR(')E;&5A<V4I``!'0T,Z("A'3E4I(&5G8W,M +M,BXY,2XV-B`Q.3DY,#,Q-"`H96=C<RTQ+C$N,B!R96QE87-E*0``1T-#.B`H +M1TY5*2!E9V-S+3(N.3$N-C8@,3DY.3`S,30@*&5G8W,M,2XQ+C(@<F5L96%S +M92D``$=#0SH@*$=.52D@96=C<RTR+CDQ+C8V(#$Y.3DP,S$T("AE9V-S+3$N +M,2XR(')E;&5A<V4I``!'0T,Z("A'3E4I(&5G8W,M,BXY,2XV-B`Q.3DY,#,Q +M-"`H96=C<RTQ+C$N,B!R96QE87-E*0``1T-#.B`H1TY5*2!E9V-S+3(N.3$N +M-C8@,3DY.3`S,30@*&5G8W,M,2XQ+C(@<F5L96%S92D``$=#0SH@*$=.52D@ +M96=C<RTR+CDQ+C8V(#$Y.3DP,S$T("AE9V-S+3$N,2XR(')E;&5A<V4I``!' +M0T,Z("A'3E4I(&5G8W,M,BXY,2XV-B`Q.3DY,#,Q-"`H96=C<RTQ+C$N,B!R +M96QE87-E*0``1T-#.B`H1TY5*2!E9V-S+3(N.3$N-C8@,3DY.3`S,30@*&5G +M8W,M,2XQ+C(@<F5L96%S92D``$=#0SH@*$=.52D@96=C<RTR+CDQ+C8V(#$Y +M.3DP,S$T("AE9V-S+3$N,2XR(')E;&5A<V4I``!'0T,Z("A'3E4I(&5G8W,M +M,BXY,2XV-B`Q.3DY,#,Q-"`H96=C<RTQ+C$N,B!R96QE87-E*0``1T-#.B`H +M1TY5*2!E9V-S+3(N.3$N-C8@,3DY.3`S,30@*&5G8W,M,2XQ+C(@<F5L96%S +M92D``$=#0SH@*$=.52D@96=C<RTR+CDQ+C8V(#$Y.3DP,S$T("AE9V-S+3$N +M,2XR(')E;&5A<V4I``@``````````0```#`Q+C`Q````"``````````!```` +M,#$N,#$````(``````````$````P,2XP,0````@``````````0```#`Q+C`Q +M````"``````````!````,#$N,#$````(``````````$````P,2XP,0````@` +M`````````0```#`Q+C`Q````"``````````!````,#$N,#$````(```````` +M``$````P,2XP,0````@``````````0```#`Q+C`Q````"``````````!```` +M,#$N,#$````(``````````$````P,2XP,0````@``````````0```#`Q+C`Q +M`````"YS>6UT86(`+G-T<G1A8@`N<VAS=')T86(`+G1E>'0`+G)E;"YT97AT +M`"YR;V1A=&$`+G)E;"YR;V1A=&$`+F1A=&$`+F)S<P`N8V]M;65N=``N;F]T +M90``````````````````````````````````````````````````````&P`` +M``$````&`````````#0````X3P`````````````$`````````"$````)```` +M``````````"D9```D`8```H````!````!`````@````K`````0````(````` +M````;$\``.\```````````````0`````````,P````D``````````````#1K +M``"(`0``"@````,````$````"````#\````!`````P````````!@4```(`4` +M````````````(`````````!%````"`````,`````````@%4``(`)```````` +M`````"``````````2@````$``````````````(!5``#+`@`````````````! +M`````````%,````'`````````,L"``!+6```!`$``````````````0`````` +M```1`````P``````````````3UD``%D```````````````$``````````0`` +M``(``````````````(A;``!@!0``"P```$H````$````$`````D````#```` +M``````````#H8```NP,``````````````0`````````````````````````` +M`````````````````````P`!``````````````````,``@`````````````` +M```#``,``````````````````P`$``````````````````,`!0`````````` +M```````#``8``````````````````P`'``````#+`@````````,`"``````` +M```````````#``D``````````````````P`*``````````````````,`"P`! +M````X$X``!D````"``$`&````+!,```.`````@`!`"D```!@30``40````(` +M`0`O````K`,``!4````"``$`.@```!`F```J`````@`!`$<```#D)0``*0`` +M``(``0!2````1`````0````!``4`6P```$P````$`````0`%`&D```"83``` +M%0````(``0!T````!`````0````!``4`?0````A.```D`````@`!`(T```"T +M!@``C`````(``0">````=$P```H````"``$`JP```,0(```+`````@`!`+P` +M``#X/0``^0````(``0#$````M$T``!4````"``$`V````(A)``##`````@`! +M`.@```!T3@``%`````(``0#]````P$P``)$````"``$`"P$``+P"```*```` +M`@`!`!<!``!0````!`````$`!0`?`0``/"4``'(````"``$`+@$``/Q.```\ +M`````@`!`#L!``!(````!`````$`!0!*`0``+$X``#,````"``$`5`$``&!. +M```1`````@`!`&(!``"\2```7P````(``0!S`0``@$P``!4````"``$`?@$` +M`.0+``"L`````@`!`(4!``"8*P``HP$```(``0"<`0``-`````0````!``4` +MIP$``.@"```A`````@`!`+8!``#,30``%0````(``0#'`0``D`P``'$````" +M``$`S@$``(A.``!5`````@`!`.`!``#()0``&@````(``0#I`0````````0` +M```!``4`]P$``'0Y``"1`0```@`!``,"``"()@``T0````(``0`4`@``Y$T` +M`"$````"``$`)`(``!@*``#*`0```@`!`"L"``"T`@``!0````(``0`W`@`` +ML"4``!4````"``$`/@(``,A+``"I`````@`!`$X"``!4````"`````$`!0!6 +M`@``#`,``)T````"``$`7@(``$`````$`````0`%`&X"``!@````P`0```$` +M!0!S`@``Y$<``-4````"``$`?P(``"@K``!O`````@`!`(X"``#0`@``$``` +M``(``0"<`@``X`(```4````"``$`J0(``,`]```W`````@`!`+L"``!,2@`` +M)`$```(``0#'`@```````"X````"``$`W`(``%1-```+`````@`!`/`"```0 +M-P``%0````(``0#^`@``R`(```4````"``$`#`,``-@J``!0`````@`!`!L# +M```P````!`````$`!0`D`P``]#X```<````"``$``````,L"`````````P`( +M`"T#`````````````!`````Z`P`````````````0````10,````````````` +M$````%(#``!$`@``<````!(``0!<`P`````````````0````:0,```P"```9 +M````$@`!`'0#``!D`0``IP```!(``0!_`P``*`(``!D````2``$`BP,````` +M````````$````)@#`````````````!````"D`P``=````.X````2``$`KP,` +M`#````!#````$@`!``!U<&1A=&53;V-K971087)A;65T97)S`&9L5W)I=&50 +M<F]T96-T960`9FQ-87``9FEN9%-E8W1O<@!F<F]M54Y!3$Q/3D<`=&]53D%, +M3$].1P!M=&1486)L90!M>5]L;W=A9&1R97-S`&9L0G5F9F5R3V8`:6YI=$1O +M;F4`9FQ3;V-K9713971"=7-Y`')E<&QA8V5&051S96-T;W(`9FQ3;V-K971. +M;T]F`&1I<VUO=6YT3&]W3&5V96P`9FQ-;W5N=`!F;%-E=%=I;F1O=T)U<U=I +M9'1H`&9L26YT96Q)9&5N=&EF>0!F;%-E=%!O=V5R3VY#86QL8F%C:P!F;$EN +M:713;V-K971S`&9L5&%K94UU=&5X`&YO3V943',`9FQ296=I<W1E<DY&5$P` +M9FQ%>&ET4V]C:V5T`&UY7VAI9VAA9&1R97-S`&9L3F5E9%9C8P!F;$1O;G1. +M965D5F-C`&9L0VAE8VM!;F1&:7A%1$,`9FQ3;V-K971/9@!F;$EN:70`9FQ$ +M;V-7:6YD;W="87-E061D<F5S<P!N;T]F1')I=F5S`&1I<VUO=6YT5F]L=6UE +M`&9L4V5T5VEN9&]W4W!E960`9FQ%>&ET`&9L26YT97)V86Q2;W5T:6YE`&9R +M;VU53D%,`&9L37-E8T-O=6YT97(`<F5A9$9L87-H240`9FQ296=I<W1E<D1/ +M0U-/0P!F;%-E=%=I;F1O=U-I>F4`8F1#86QL`&9L1G)E94UU=&5X`'1O54Y! +M3`!F;$ED96YT:69Y1FQA<V@`=&Q486)L90!S971"=7-Y`&1A=&%%<G)O<D]B +M:F5C=`!V;VQS`&9L1&5C;V1E141#`&9L4&5E:T%T5VEN9&]W`&9L0W)E871E +M375T97@`9FQ3>7-F=6Y);FET`&9L4F5G:7-T97)$3T,R,#`P`&9L26YT96Q3 +M:7IE`&9L4F5G:7-T97)#;VUP;VYE;G1S`&9L1V5T36%P<&EN9T-O;G1E>'0` +M9V5T3D9$0S(Q5F%R<P!F;$1E;&5T94UU=&5X`&-H96-K5VEN1F]R1$]#`&YO +M3V9-5$1S`&YO1F]R;6%T`&1O8S)K7VUE;7-E=`!D;V,R:U]F<F5E`&1O8S)K +M7VUE;6-P>0!D;V,R:U]R=V4`9&]C,FM?;6%L;&]C`&1O8S)K7V]P96X`9&]C +M,FM?<VEZ90!D;V,R:U]C;&]S90!D;V,R:U]M96UC;7``9&]C,FM?9&5L87D` +M9&]C,FM?:6YF;P!D;V,R:U]P<F]B90``!`````)````-`````B$``!<````! +M(P``'0````$3```B`````C(``#H````!$P``0`````$C``!&`````08``$P` +M```!!@``5`````(H``!A`````2H``(D````"2@``F@````(T``"Y`````0,` +M`(,!```"-```'P(```(T```[`@```C0``'\"```"-```CP(```(T``"?`@`` +M`C0``"$#```"'P``/0,```(6``!(`P```B0``(8#```")0``DP,```(6``"< +M`P```C4``.$#```!.P````0```(:``!+!````3L``&H$```"&@``H00```$Z +M``#7!````A```!H%```!.@``404```(O``"?!0```B\``+X%```"+P``:@8` +M``$Z``"`!@```DP``)$&```"2@``T@8```$Z``"]!P```3H``"H(```!.@`` +M50@```$Z``!_"````A```*<(```"-P``(PH```$5```["@```2H``%<*```! +M.P``>@H```$#``#;"@```0,````+```!`P``&@L```(G```C"P```@P``.L+ +M```!%0``]PL```$[```"#````B<``"(,```!%0``*PP```(_```Q#````2`` +M`#H,```"0@``0PP```(>``!;#````3L``&$,```!*@``;0P```(^``"!#``` +M`2H``)<,```!.P``GPP```$J``#*#````B(``-,,```"-0``V0P```)%``#I +M#````2H``/$,```!%0``&0\```$%``!R$@```A@``'@2```"%```H1(```). +M``"P$@```DX```D<```!.@``&2$```)+```J(0```DL``#LA```"2P``3"$` +M``)+``!P(0```08``'TA```"2@``WR$```$#``#E(0```E(``$LB```!`P`` +M42(```)2``".(@```A```(PD```!`0``DR0```$!``":)````0$``*$D```! +M`0``J"0```$!``"O)````0$``,HD```"3@``#"4```).```M)0```DH``$,E +M```!(```5B4```$@``!B)0```3@``&DE```!`0``<24```%(``!W)0```2`` +M`'XE```!!@``@R4```$&``"3)@```2H``*@F```!*@``MB8```$J``"[)@`` +M`B<``,<F```",P``TR8```(I``#M)@```0$``/0F```!`0``^R8```$!```" +M)P```0$```DG```!`0``$"<```$!```7)P```0$``!XG```!`0``+"<```$! +M```S)P```2H``#DG```!*@``;"H```(.``!9*P```0,``&(K```"4@``L"L` +M``$%``"V*P```04``,HK```!!0``VBL```$%``#C*P```04``.DK```!!0`` +M\RL```$%```#+````04```DL```!!0``$RP```$%```N+````04``$DL```! +M!0``42P```$%``!;+````04``'@L```!!0``JRP```$%``"Z+````04``,(L +M```!!0``VBP```$%```&+0```04``!XM```!!0``*RT```$%``!X+@```@X` +M``$O```"3```*"\```),``!D+P```DP``)HO```"2@``\S````(-``!X,@`` +M`DP``)$R```!!0``@S0```),``"G-````B8``(TU```"#0``'S<```$&``#% +M.0```E,``!$Z```"4P``(SL```(8```R.P```08``#T[```"&```0SL```(4 +M``!@.P```AL``&H[```"+```I#L```(.``"//0```0$``)8]```!`0``G3T` +M``$!``"D/0```0$``,4]```!1P``SCT```%'``#;/0```1(``-\]```!`0`` +MY3T```%'```-/@```B<``!X^```"-P``0CX```$@``!-/@```3@``(0^```! +M(```JCX```$@``"Q/@```3@``.$^```!(```TT(```$%```20P```04``"E) +M```"#@``3DD```),``""20```AT``)Q)```"#@``@$L```(.``#X2P```0$` +M`/]+```!`0``!DP```$!```-3````0$``!1,```!`0``'$P```%'```L3``` +M`1(``#I,```!1P``CTP```$&``"G3````08``,9,```!!@``SDP```$J``#\ +M3````DX```--```!!@``0DT```$J```J3P```08``"]/```"2P``&`````$! +M```<`````0$``"`````!`0``)`````$!```H`````0$``"P````!`0``,``` +M``$!```T`````0$``#@````!`0``/`````$!``!``````0$``$0````!`0`` +M2`````$!``!,`````0$``%`````!`0``5`````$!``!8`````0$``%P````! +M`0``8`````$!``!D`````0$``&@````!`0``;`````$!``!P`````0$``'0` +M```!`0``>`````$!``!\`````0$``(`````!`0``A`````$!``"(`````0$` +M`(P````!`0``D`````$!``"4`````0$``)@````!`0``G`````$!``"@```` +M`0$``*0````!`0``J`````$!``"L`````0$``+`````!`0``M`````$!``"X +M`````0$``+P````!`0``P`````$!``#$`````0$``,@````!`0``S`````$! +:``#0`````0$``-0````!`0``V`````$!```` +` +end diff --git a/sys/contrib/dev/fla/msysosak.h b/sys/contrib/dev/fla/msysosak.h new file mode 100644 index 0000000..11d4c51 --- /dev/null +++ b/sys/contrib/dev/fla/msysosak.h @@ -0,0 +1,135 @@ +/*- +SOFTWARE LICENSE AGREEMENT + +IMPORTANT! READ CAREFULLY: +THIS SOFTWARE LICENSE AGREEMENT (the ``Agreement'') is a legal +agreement between you (either an individual or a single entity) and +M-Systems Flash Disk Pioneers Ltd. ("M-Systems"). +This Agreement relates to the M-Systems' software accompanying this +Agreement, which includes computer software and may include associated +media, printed materials, and ``online'' or electronic documentation +(the ``Licensed Software''). +By downloading, installing, copying, or otherwise using the Licensed +Software, you agree to be bound by the terms of this Agreement. +If you do not agree to the terms of this Agreement, do not install, +copy or use the Licensed Software. + +The Licensed Software is protected by copyright laws and international +copyright treaties, as well as other intellectual property laws and +treaties. The Licensed Software is licensed, not sold. +The Licensed Software is being provided solely for use with M-Systems' +DiskOnChip® product lines. +1. License Grant. +(a) Grant of License. Subject to the terms and conditions of this + Agreement, M-Systems hereby grants you a nonexclusive, + royalty-free, worldwide license (including the right to + sublicense) to use, copy and distribute the Licensed Software + with M-Systems DiskOnChip® products. +(b) Restrictions on Use. The Licensed Software is licensed solely + for use with and to support M-Systems' DiskOnChip® products. + Use of this Licensed Software with, or to support, any other + flash disk, flash card, resident flash array or solid state + disk of any kind is expressly prohibited, and constitutes an + illegal infringement of M-Systems' patent, copyright and other + rights in and to the Licensed Software. +2. Limitations on Reverse Engineering, Decompilation, and + Disassembly. You may not reverse engineer, decompile, or + disassemble the Licensed Software, except and only to the + extent that such activity is expressly permitted by applicable + law notwithstanding this limitation. +3. Termination. Without prejudice to any other rights, M-Systems + may terminate this Agreement if you fail to comply with the + terms and conditions of this Agreement. In such event, you must + destroy all copies of the Licensed Software and all of its + component parts. +4. Intellectual Property Rights. Title to the Licensed Software, + and all rights with respect to the Software not specifically + granted under this Agreement, including without limitation + all rights of modification, disassembly and decompilation and + all copyright, patent, trademark, trade secret and other + proprietary rights and interests are reserved to M-Systems. + You may not remove or alter the "README" or "COPYRIGHT" files + or copyright notices in the Licensed Software. +5. DISCLAIMER OF WARRANTIES. To the maximum extent permitted by + applicable law, M-Systems and its suppliers provide the Product + and any (if any) support services related to the Product + ("Support Services") AS IS AND WITH ALL FAULTS, and hereby + disclaim all warranties and conditions, either express, + implied or statutory, including, but not limited to, any + (if any) implied warranties or conditions of merchantability, + of fitness for a particular purpose, of lack of viruses, of + accuracy or completeness of responses, of results, and of lack + of negligence or lack of workmanlike effort, all with regard + to the Product, and the provision of or failure to provide + Support Services. ALSO, THERE IS NO WARRANTY OR CONDITION OF + TITLE, QUIET ENJOYMENT, QUIET POSSESSION, CORRESPONDENCE TO + DESCRIPTION OR NON-INFRINGEMENT, WITH REGARD TO THE PRODUCT. + THE ENTIRE RISK AS TO THE QUALITY OF OR ARISING OUT OF USE OR + PERFORMANCE OF THE PRODUCT AND SUPPORT SERVICES, IF ANY, + REMAINS WITH YOU. +6. EXCLUSION OF INCIDENTAL, CONSEQUENTIAL AND CERTAIN OTHER + DAMAGES. To the maximum extent permitted by applicable law, + in no event shall M-Systems or its suppliers be liable for + any special, incidental, indirect, or consequential damages + whatsoever (including, but not limited to, damages for loss + of profits or confidential or other information, for business + interruption, for personal injury, for loss of privacy, for + failure to meet any duty including of good faith or of + reasonable care, for negligence, and for any other pecuniary + or other loss whatsoever) arising out of or in any way related + to the use of or inability to use the Product, the provision + of or failure to provide Support Services, or otherwise under + or in connection with any provision of Agreement, even in the + event of the fault, tort (including negligence), strict + liability, breach of contract or breach of warranty of + M-Systems or any supplier, and even if M-Systems or any + supplier has been advised of the possibility of such damages. +7. LIMITATION OF LIABILITY AND REMEDIES. Notwithstanding any + damages that you might incur for any reason whatsoever + (including, without limitation, all damages referenced above + and all direct or general damages), the entire liability of + M-Systems and any of its suppliers under any provision of this + Agreement and your exclusive remedy for all of the foregoing + shall be limited to the greater of the amount actually paid by + you for the Product or U.S.$5.00. The foregoing limitations, + exclusions and disclaimers shall apply to the maximum extent + permitted by applicable law, even if any remedy fails its + essential purpose. +8. Miscellaneous + The laws of the State of California, United States of America, + exclusive of conflict-of-laws provisions, shall govern this + Agreement in all respects. +*/ + +#ifndef MSYSOSAK_H +#define MSYSOSAK_H 1 + +struct doc2k_stat { + unsigned short type; + long unitSize; + long mediaSize; + long chipSize; + int interleaving; + unsigned long window; + + /* Non-OSAK members Below this point */ + char *product; + char model[40]; +}; + +enum doc2k_work { DOC2K_READ, DOC2K_WRITE, DOC2K_ERASE }; + +int doc2k_probe(int drive, unsigned lowaddr, unsigned highaddr); +int doc2k_info(int drive, struct doc2k_stat *info); +int doc2k_size(int drive, unsigned *capacity, unsigned *ncyl, unsigned *nhead, unsigned *nsect); +int doc2k_open(int drive); +int doc2k_close(int drive); +int doc2k_rwe(int drive, enum doc2k_work what, unsigned block, unsigned len, void *ptr); +void doc2k_memcpy(void *dst, const void *src, unsigned len); +void doc2k_memset(void *dst, int c, unsigned len); +int doc2k_memcmp(const void *dst, const void *src, unsigned len); +void *doc2k_malloc(int bytes); +void doc2k_free(void *ptr); +void doc2k_delay(unsigned usec); + +#endif diff --git a/sys/contrib/dev/fla/patch.00 b/sys/contrib/dev/fla/patch.00 new file mode 100644 index 0000000..90841e6 --- /dev/null +++ b/sys/contrib/dev/fla/patch.00 @@ -0,0 +1,23 @@ +Index: files.i386 +=================================================================== +RCS file: /home/ncvs/src/sys/i386/conf/files.i386,v +retrieving revision 1.220.2.8 +diff -u -r1.220.2.8 files.i386 +--- files.i386 1999/05/27 03:06:33 1.220.2.8 ++++ files.i386 1999/08/01 12:44:00 +@@ -34,6 +34,13 @@ + no-obj no-implicit-rule before-depend \ + clean "ukbdmap.h" + # ++contrib/dev/fla/fla.c optional fla ++msysosak.o optional fla \ ++ dependency "$S/contrib/dev/fla/i386/msysosak.o.uu" \ ++ compile-with "uudecode < $S/contrib/dev/fla/i386/msysosak.o.uu" \ ++ no-implicit-rule ++ ++# + dev/fb/fb.c optional fb device-driver + dev/fb/fb.c optional vga device-driver + dev/fb/splash.c optional splash + + diff --git a/sys/contrib/dev/fla/prep.fla.sh b/sys/contrib/dev/fla/prep.fla.sh new file mode 100644 index 0000000..5d27717 --- /dev/null +++ b/sys/contrib/dev/fla/prep.fla.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# $FreeBSD$ + +dev=fla0 + +grep "$dev.*sectors" /var/run/dmesg.boot | tr -d '(:)' | awk ' + { + v = $3 + c = $5 + h = $7 + s = $9 + ss = c * h * s - s + + print "#",$0 > "_" + print "g c"c" h"h" s"s > "_" + print "p 1 165",s,ss > "_" + print "a 1" > "_" + + print "#",$0 > "__" + print "type: ESDI" > "__" + print "disk:", $1 > "__" + print "label:" > "__" + print "flags:" > "__" + print "bytes/sector: 512" > "__" + print "sectors/track:", s > "__" + print "tracks/cylinder:", h > "__" + print "sectors/cylinder:", s * h > "__" + print "cylinders:", c > "__" + print "sectors/unit:", ss > "__" + print "rpm: 3600" > "__" + print "interleave: 1" > "__" + print "trackskew: 0" > "__" + print "cylinderskew: 0" > "__" + print "headswitch: 0 # milliseconds" > "__" + print "track-to-track seek: 0 # milliseconds" > "__" + print "drivedata: 0 " > "__" + print "8 partitions:" > "__" + print "# size offset fstype [fsize bsize bps/cpg]" > "__" + print "a:",ss,"0 4.2BSD 512 4096 " > "__" + print "c:",ss,"0 unused 0 0" > "__" + } +' +fdisk -f _ -i -v $dev +disklabel -BrR ${dev} __ +newfs /dev/r${dev}a diff --git a/sys/contrib/dev/oltr/COPYRIGHT b/sys/contrib/dev/oltr/COPYRIGHT new file mode 100644 index 0000000..668a641 --- /dev/null +++ b/sys/contrib/dev/oltr/COPYRIGHT @@ -0,0 +1,62 @@ +The oltr driver uses objects and microcode from Olicom's +OC-3300 PowerMACH Works Kit. + +As the Linux driver says.. +================================================================== +* +* This driver uses the Token Ring Low Level Driver (TRlld, +* PowerMach Works) as the lower level driver. The PMW kit is +* (C) Olicom. The executable object may be distributed along +* with this driver for the purpose of linking this driver. +* +================================================================= +The low level driver is combined with a FreeBSD specific driver +supplied in source, which provides all OS dependent functions. + +files from olicom are: + +trlld.o - Olicom low-level driver interface + +trlldmac.o - TMS 380 Microcode for Olicom TMS380 based cards +trlldbm.o - "bullseye" Microcode for Olicom "bullseye" based cards +trlldhm.o - "hawkeye" Microcode for Olicom "hawkeye" based cards + +The file trlld.o is stored in uuencode format as trlld.o.uu +It represents a state machine of some kind that has no OS dependencies +and communicates with the firmware on the cards via a proprietary interface. +All communication with this module is achieved via functions supplied in +the FreeBSD specific driver. + +The other 3 files have been encoded using file2c(1) +and represent only microcode to be loaded into the appropriate board +when found. + +Here is the release notice from Olicom regarding these files: +------------------------------------------------------------------------------- +OC-3300 PowerMach Works and its components are wholly owned products of +Olicom A/S +Nybrovej 114 +2800 Lyngby +Denmark +(45) 45 27 00 00 +and are used and distributed with permission. (#SS022499) +------------------------------------------------------------------------------- + +A supporting email is also included. +---------- Forwarded message ---------- +Date: Wed, 24 Feb 1999 17:07:14 +0100 +From: Starla Scott <sscott@olicom.com> +To: 'Larry Lile' <lile@stdio.com> +Subject: RE: FreeBSD Token-ring driver + +Larry, + +You may freely distribute the driver and/or kit. However, we do request that +you include an acknowledgement of Olicom's copyright and ownership as +related to your driver. + +Thanks, +Starla +Olicom Tech Support +------------------------------------------------------------------------------ + diff --git a/sys/contrib/dev/oltr/i386-elf.trlld.o.uu b/sys/contrib/dev/oltr/i386-elf.trlld.o.uu new file mode 100644 index 0000000..02fabcd --- /dev/null +++ b/sys/contrib/dev/oltr/i386-elf.trlld.o.uu @@ -0,0 +1,1850 @@ +begin 644 trlld.o +M?T5,1@$!`0````````````$``P`!``````````````#<0@$``````#0````` +M`"@`"P`'`````````````````(/L%%>+?"0<5E-5BT0D+"7__P``@\`$B]@E +M__\``%#_5QR+\('C__\``$.!X___``!3_U<<P>`(@\0(9@OP@>;__P``9O?& +M`0!FB70D(`^%>`(``(M$)"PE__\``%#_5QR(1"0G@\0$BT0D+"7__P``@\`" +MB]@E__\``%#_5QR+\('C__\``$.!X___``!3_U<<BU0D*(/$",'@"('B__\` +M`&8+\(M$)"`E__\``('F__\``(/``H/""HOH)?__```[P@^-\0```(M$)"PE +M__\``(/`!&:+\(M$)"`E__\``(/`"HE$)!B+QB7__P``4/]7'(O8B\8E__\` +M`$`E__\``%#_5QS!X`B#Q`AF"]B+Q8'C__\``"7__P``.\,/A:@!``"+1"0L +M)?__``"#P`HE__\``%!7Z!1N``"#Q`B+U8'B__\``#O0#X5]`0``BT0D+"7_ +M_P``4/]7'(A$)"=J8?]7'(M$)#0E__\``(/``B7__P``4/]7'#/2@\0,BE0D +M(SO0#X5!`0``BT0D+"7__P``@\`#)?__``!0_U<<BU0D'(/$!&:#Q0*+Q27_ +M_P``.\(/C"[___]F,_:-7QR)?"00BVPD+('E__\``(M$)"R#Q00E__\``(/` +M"F:)1"0<C4<$B_B+QB7_````4(O%)?__``!0_Q=J8?\3BT0D*"7__P``4/\3 +MBM`SP(K"]]`E_P```%"+1"0P)?__``!0_Q=J8?\3B\4E__\``%#_$XK0,\"* +MPHO6-?X```"#Q"`E__\``('B__\``#O"=7R#Q@)F@?X``7*-BW0D+(M\)!"+ +M1"0@@>;__P``)?\```"#Q@10B\8E__\``%#_5P2+1"0H@>;__P``)?__``!& +MP?@(@>;__P``)?\```!05O]7!#/`@\00BD0D(U"+1"0P)?__``!0_U<$N`$` +M``"#Q`A=6UY?@\04PSO_75M>,\!?@\04PSO_._^!_P````"#[%!7BWPD6%93 +M56:+AW(+``!FJ1``=$0SP&:+1Q:#P`PE__\``%"+AUP+``#_4!R+\#/`9HM' +M%H/`#27__P``4(N'7`L``/]0','@"&8+\('F__\``(/$".LDD#/`9HM'%H/` +M#"7__P``4(N'7`L``/]0((OP@>;__P``@\0$9HN'<@L``&:I$`!FB70D7G1# +M,\!FBT<6@\`*)?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`LE__\``%"+AUP+ +M``#_4!S!X`AF"_"!YO__``"#Q`CK(S/`9HM'%H/`"B7__P``4(N'7`L``/]0 +M((OP@>;__P``@\0$9HN'<@L``&:I$`!FB70D7'0[:@$SP&:+1Q:#P`PE__\` +M`%"+AUP+``#_4`1J`#/`9HM'%H/`#27__P``4(N'7`L``/]0!(/$$.L?._]J +M`3/`9HM'%H/`#"7__P``4(N'7`L``/]0"(/$"&:+=S2+QH'F__\``,'F""7_ +M_P``P?@(@>8`_P``)?\````+QHOP9HN'<@L``('F__\``&:I$`!T3HO&)?\` +M``!0,\!FBT<6@\`*)?__``!0BX=<"P``_U`$@>;__P``,\#!_@B!YO\```!6 +M9HM'%H/`"R7__P``4(N'7`L``/]0!(/$$.LCD('F__\``#/`5F:+1Q:#P`HE +M__\``%"+AUP+``#_4`B#Q`AJ"HN'7`L``/]0-+Z\____@\0$O1````!FA:]R +M"P``=$4SP&:+1Q:#P`(E__\``%"+AUP+``#_4!R+V#/`9HM'%H/``R7__P`` +M4(N'7`L``/]0','@"&8+V('C__\``(/$".LE._\SP&:+1Q:#P`(E__\``%"+ +MAUP+``#_4""+V('C__\``(/$!(O#@>/__P``P>,()?__``#!^`B!XP#_```E +M_P````O#9HE$-%2#Q@(/C&'___]FBX=R"P``OD0```!FJ1``=$TSP(I$)%Y0 +M,\!FBT<6@\`,)?__``!0BX=<"P``_U`$,\!FBT0D9L'X""7_````4#/`9HM' +M%H/`#27__P``4(N'7`L``/]0!(/$$.LDD#/`9HM$)%Y0,\!FBT<6@\`,)?__ +M``!0BX=<"P``_U`(@\0(9HN'<@L``&:I$`!T5(M$)%PE_P```%`SP&:+1Q:# +MP`HE__\``%"+AUP+``#_4`2+1"1D)?__``#!^`@E_P```%`SP&:+1Q:#P`LE +M__\``%"+AUP+``#_4`2#Q!#K*(/'`(M$)%PE__\``%`SP&:+1Q:#P`HE__\` +M`%"+AUP+``#_4`B#Q`B+1"04B(?<$```BD0D%8B'W1```(I$)!:(A]X0``"* +M1"07B(??$```BT0D&(B'X!```(I$)!F(A^$0``"+1"0\9HF'XA```&:+1"0V +M9JD`0'11BD0D1HB'Y!```(I$)$>(A^40``"+1"1(B(?F$```BD0D28B'YQ`` +M`(I$)$J(A^@0``"*1"1+B(?I$```9HM$)#9FB8>."P``75M>7X/$4,.0,\F( +MC^00``"(C^40``"(C^80``"(C^<0``"(C^@0``"(C^D0``#KPX'_`````('_ +M`````(/L&%>+?"0@9HN'H`L``&:I(``/A(\```!FQT<0``G'1V@`````9B7? +M_V:)AZ`+``"+AY0+``")1Q(SP&B0````9HM'%H/`!R7__P``4(N'7`L``/]0 +M!(/$"%^#Q!C#D&;'1Q``",=':`````!F);__9HF'H`L``(N'D`L``(E'$C/` +M:)````!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(7X/$&,,[_V:+AZ`+``!F +MJ4``=:MFBX>@"P``9JF``'1F9B5__V:)AZ`+``!FBX=R"P``9JD`@'0&C4=8 +MZPJ0BX=D"P``@\!84.AA9P``9L='$``*B4<2,\"Z`````(/$!(E7:&B0```` +M9HM'%H/`!R7__P``4(N'7`L``/]0!(/$"%^#Q!C#9HN'H`L``&:I`(!T;V8E +M_W]FB8>@"P``9HN'F@L``&:I`@!T"S/`9HN'F`L``.L.,\!FBX>8"P``#0`` +M`(!0Z.1F``!FQT<0``;'1V@`````B4<2,\"#Q`1HD````&:+1Q:#P`<E__\` +M`%"+AUP+``#_4`2#Q`A?@\08PV:+AZ`+``!FJ0`!#X3L_O__9B7__C/)9HF' +MH`L``&:+AW(+``!FJ0$`=01FN1``,\"*AWT+``")1"04J0$```!T!&:#R0*+ +M1"04J0(```!T!&:#R01FBX>:"P``9JD$`'4.9H/)0&:I"`!T!&:#R2!FQT<0 +M``W'1V@`````B\&!X?__``#!X0@E__\``,'X"('A`/\``"7_````"\$E__\` +M`(E'$C/`:)````!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(7X/$&,,[_X/L +M"%>+?"009HM'"F8]@`!T8F:+1P)F/4,`=%@SP&:+1PQ0,\!FBT<*4#/`9HM' +M"%!J!&H!:@97Z)-<``"#Q!Q?@\0(PX/&`,=';`````!HB````#/`9HM'%H/` +M!R7__P``4(N'7`L``/]0!(/$"%^#Q`C#BT=HA<!T#<=':`````!7_]"#Q`1F +MBX>@"P``9H7`=-MFBT<"9CU0`'+19HM'$&:%P'6A5^CC_/__@\0$7X/$",.# +MQP`[_X'_`````(/L$%>+?"085E-59HN'<@L``&:I$`!T/&H!,\!FBT<6@\`, +M)?__``!0BX=<"P``_U`$:@`SP&:+1Q:#P`TE__\``%"+AUP+``#_4`2#Q!#K +M((/'`&H!,\!FBT<6@\`,)?__``!0BX=<"P``_U`(@\0(9HN'<@L``&:I$`!T +M/FC@````,\!FBT<6@\`*)?__``!0BX=<"P``_U`$:@4SP&:+1Q:#P`LE__\` +M`%"+AUP+``#_4`2#Q!#K(CO_:.`%```SP&:+1Q:#P`HE__\``%"+AUP+``#_ +M4`B#Q`B^^/___[T0````9H6O<@L``'1%,\!FBT<6@\`")?__``!0BX=<"P`` +M_U`<B]@SP&:+1Q:#P`,E__\``%"+AUP+``#_4!S!X`AF"]B!X___``"#Q`CK +M)3O_,\!FBT<6@\`")?__``!0BX=<"P``_U`@B]B!X___``"#Q`1FB5PT&(/& +M`GR%,\"^"````&:+1"064(M$)!@E__\``%`SP&:+1"0:4(M$)!PE__\``%!J +M`6H$5^A\6@``@\0<75M>7X/$$,.0@^PX5XM\)$!64U5FBX=R"P``9JD0`'0\ +M:(`````SP&:+1Q:#P`HE__\``%"+AUP+``#_4`1J$#/`9HM'%H/`"R7__P`` +M4(N'7`L``/]0!(/$$.L@:(`0```SP&:+1Q:#P`HE__\``%"+AUP+``#_4`B# +MQ`AFBX=R"P``9JD0`'0W,\!FBT<6@\`")?__``!0BX=<"P``_U`<,\!FBT<6 +M@\`#)?__``!0BX=<"P``_U`<@\0(ZQT[_S/`9HM'%H/``B7__P``4(N'7`L` +M`/]0((/$!&:+AW(+``!FJ1``=$0SP&:+1Q:#P`(E__\``%"+AUP+``#_4!R+ +M\#/`9HM'%H/``R7__P``4(N'7`L``/]0','@"&8+\('F__\``(/$".LDD#/` +M9HM'%H/``B7__P``4(N'7`L``/]0((OP@>;__P``@\0$B\:(1"1&9HN'<@L` +M`&:I$`!T1C/`9HM'%H/``B7__P``4(N'7`L``/]0'(OP,\!FBT<6@\`#)?__ +M``!0BX=<"P``_U`<P>`(9@OP@>;__P``@\0(ZR:#QP`SP&:+1Q:#P`(E__\` +M`%"+AUP+``#_4""+\('F__\``(/$!(O&B$0D16:+AYH+``!FJ0$`='MFBX=R +M"P``9JD0`'1%,\!FBT<6@\`")?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`,E +M__\``%"+AUP+``#_4!S!X`AF"_"!YO__``"#Q`CK)3O_,\!FBT<6@\`")?__ +M``!0BX=<"P``_U`@B_"!YO__``"#Q`2+QHA$)$3&1"1#`3/`,]**1"1&BI>Z +M"P``.\(/A%X#``"+[XV%F@L``(V]MPL``(E$)"R-A;H+``")1"0TB40D*(V% +MF`L``(E$)#"+1"0TNA\```"*""+1BD0D0XORA,!U"(7V#X6.````C02UJ!`` +M`&:+\&:+A7(+``!FJ1``=%"+QB7_````4#/`9HM%%H/`"B7__P``4(N%7`L` +M`/]0!('F__\``#/`P?X(@>;_````5F:+11:#P`LE__\``%"+A5P+``#_4`2# +MQ!#K)8/'`('F__\``#/`5F:+11:#P`HE__\``%"+A5P+``#_4`B#Q`C&1"1# +M`(M$)"C^`+H?````(A>-%%+!X@.-A!6\"P``B40D'&:+A7(+``!FJ1``=$8S +MP&:+11:#P`(E__\``%"+A5P+``#_4!R+V#/`9HM%%H/``R7__P``4(N%7`L` +M`/]0','@"&8+V('C__\``(/$".LF@\<`,\!FBT46@\`")?__``!0BX5<"P`` +M_U`@B]B!X___``"#Q`2+1"0<9HE8"F:+A7(+``!FJ1``=$0SP&:+11:#P`(E +M__\``%"+A5P+``#_4!R+V#/`9HM%%H/``R7__P``4(N%7`L``/]0','@"&8+ +MV('C__\``(/$".LDD#/`9HM%%H/``B7__P``4(N%7`L``/]0((O8@>/__P`` +M@\0$9O?#`/YU"HM$)!S&0`X`ZR"*A7T+``"H!'0*N`(```#K"(/'`+@!```` +MBU0D'(A"#HM$)!R+5"0P9HM`"F:+$B7__P``@>+__P``.\)^#HM$)!S&0`X# +M_X7$$```9O?#`!YU#6;WPP!`=`;_A<@0``!F]\,`$'0&_X7,$```N@,```"+ +M1"0<9B/3B%`/BT0D+&;W``(`=11F]\,`_G0NBT0D'&:+0`IFA<!U(8J5MPL` +M`(M$)!S^PHB5MPL``,=`$`$```#ID0```(/'`#/2BT0D',=`$`````"+1"0P +M9HL0BT0D'&:+2`J!X?__``"+PCO(?P*+P8O(BT0D'(E$)#B%R7Y&C9VW"P`` +MC7`0BT0D.+H?````9HM`""7__P``*\B*`_[`B`.*!R+0C112P>(#C805O`L` +M`(E$)#B+1"0<BT`00(7)B09_PXM$)!QFBU`*9H/J!&:)4`HSP(M4)#2*1"1& +MBA*!XO\````[P@^%SOS__XO]9HN'F@L``&:I`0`/A!D"``"*AYP+```\`G5S +M,]*+1"1$)?\```"*E\,.```[PG14B^^-G<,.``"-O<,.``"-M;X.``"*"[@? +M````(L&-%$"*A<,.``#!X@+^P(@'C8P5Q`X``&;'008``(H6BD$$`L(STH@& +MBT0D1"7_````BA,[PG7`75M>7X/$.,,[_\9$)$,!,]*+1"1$)?\```"*E\,. +M```[PG3<B^^-A<,.``"-G<,.``")1"0TC446C;V^#@``B40D+(H3N!\````B +MPHOPC11VP>("C805Q`X``(E$)"2*1"1#A,!U"(7V#X6*````C8:($```9HOP +M9HN%<@L``&:I$`!T38O&)?\```!0,\!FBT46@\`*)?__``!0BX5<"P``_U`$ +M@>;__P``,\#!_@B!YO\```!69HM%%H/`"R7__P``4(N%7`L``/]0!(/$$.LB +M@>;__P``,\!69HM%%H/`"B7__P``4(N%7`L``/]0"(/$",9$)$,`BI7##@`` +MBT0D-/["B!"+1"0L9HL`)?__``"#P`(E__\``%"+A5P+``#_4!R#Q`0EB``` +M`#V(````=`Z+1"0D9L=`!@(`ZSP[_XM$)"QFBP`E__\``(/``B7__P``4(N% +M7`L``/]0'(/$!(/@1(/X1'0'N`,```#K`C/`BU0D)&:)0@8STHM$)"2*#XI` +M!`+!B`>+1"1$)?\```"*$SO"#X6E_O__75M>7X/$.,.*E\,.``"X'P```"+" +M,]**E\`.``"-!$#!X`*-G`?$#@``,\"*1"1%.\(/A"K^__^+ZXV?O@X``(E\ +M)#"-M\`.``"!Q\`.```SP(I5!?["BL*(504STHI5!#O"=2AFQT4&``"+;"0P +MN1\```#^A<,.```BC<,.``"-#$G!X0*-K`W$#@``,]*+1"0PBH"^#@``_L"( +M`XM$)#"*@,`.``#^P(@',\"*1"1%BA8[PG6975M>7X/$.,.0C70F`%=6BW0D +M#&:+?@J+QX'G__\``,'G""7__P``P?@(@><`_P``)?\````+QXOX@>?__P`` +M9O?'``5T7VH`:@!J`('G__\``%=J`&H#5NAP40``5N@J4```9L=&`D4`:@!6 +MBX9L"P``_U`$9L=&!`,`@\0H7E_#5N@&4```9L=&`D4`:@!6BX9L"P``_U`$ +M9L=&!`,`@\0,7E_#:@!J`&H`B\<E__\``%!J`&H#5N@040``@\0<9O?'``AU +MNL:&CQ````!>7\.!_P````"!_P````"#[!0SP%>+?"0<5E/&1QH`QT0D%`$` +M``!FBT<6@\`&)?__``!0BX=<"P``_U`<@\0$BMCVPX!U##/`6UY?@\04PX/' +M`+A_````(L,E_P```%`SP&:+1Q:#P`8E__\``%"+AUP+``#_4`1FBX=R"P`` +M@\0(9JD"``^$F@$``&:I$`!T23/`9HM'%H/`""7__P``4(N'7`L``/]0'(OP +M,\!FBT<6@\`))?__``!0BX=<"P``_U`<P>`(9@OP@>;__P``B70D&(/$".LF +M._\SP&:+1Q:#P`@E__\``%"+AUP+``#_4"`E__\``(E$)!2#Q`2+1"009HE$ +M)!XE__\```T`"```9HE$)!IFBX=R"P``9JD0`'1/,\"*1"0:4#/`9HM'%H/` +M""7__P``4(N'7`L``/]0!#/`9HM$)"+!^`@E_P```%`SP&:+1Q:#P`DE__\` +M`%"+AUP+``#_4`2#Q!#K)H/'`#/`9HM$)!I0,\!FBT<6@\`()?__``!0BX=< +M"P``_U`(@\0(,\!FBT0D'@T``0``9HE$)!IFBX=R"P``9JD0`'1/,\"*1"0: +M4#/`9HM'%H/`""7__P``4(N'7`L``/]0!#/`9HM$)"+!^`@E_P```%`SP&:+ +M1Q:#P`DE__\``%"+AUP+``#_4`2#Q!#K)H/'`#/`9HM$)!I0,\!FBT<6@\`( +M)?__``!0BX=<"P``_U`(@\0(N`\````BPX/X#'=V_R2%D````#O_5^BN\O__ +M@\0$ZV*05^A"]/__:@$SP&:+1Q:#P`<E__\``%"+AUP+``#_4`17Z"+T___' +M1"0D`@```(/$$.LND%?HKO'__X/$!.LBD(M';(7`=!K'1VP`````5__0@\0$ +MZPL[_U?HFOS__X/$!&H@,\!FBT<6@\`')?__``!0BX=<"P``_U`$,\!FBT<6 +M@\`')?__``!0BX=<"P``_U`<@\0,J00```!U(&B$````,\!FBT<6@\`')?__ +M``!0BX=<"P``_U`$@\0(6UZ+1"0,7X/$%,.#["Q7BWPD-%:+="0\4XM<)$15 +MBH=Z"P``/`1U#XN':`L``&:+0!#K#8/&`(N':`L``&:+0!)FB4<8,\!H@``` +M`&:+1Q:#P`@E__\``%"+AUP+``#_4`1J#XN'7`L``/]0-#/`9HM'%H/`""7_ +M_P``4(N'7`L``/]0'(/@9(/$$(/(`8A$)#MFBX=R"P``9JD!`'4+BE0D.X#* +M`HA4)#LSP(I$)#M0,\!FBT<6@\`()?__``!0BX=<"P``_U`$:AZ+AUP+``#_ +M4#1J`#/`9HM'%H/`"27__P``4(N'7`L``/]0!&H>BX=<"P``_U`T9L=$)%`` +MP&:+AW(+``"#Q!AFJ0`$="-FJ0`(=21F@4PD.``(9HM'!F8]"P!T$V:!3"0X +M``SK"H/'`&:!3"0X`!"+ZXU<)#:-0P%05?_6@\0(A<!U"U-5_]:#Q`B%P'0* +MQT0D(`$```#K",=$)"``````BT0D((7`#X3<````Z=\#``"#QP"-;"0VN`$` +M```#Q5!3_]:#Q`B%P'4+55/_UH/$"(7`=`>]`0```.L",^V%[0^$<@(``.FE +M`P``D(M$)#!F_TPD,&:%P`^$6@(``(OKC5PD-K@!`````\-05?_6@\0(A<!U +M"U-5_]:#Q`B%P'0'NP$```#K`C/;A=L/A5X#``"+1"0P9O],)#!FA<!UP.M& +M._]FBT0D+F:%P'2>Z6'___^0:B8SP&:+1Q:#P`@E__\``%"+AUP+``#_4`1F +MQT<"(@!FQT<$```SP(/$"%U;7E^#Q"S#D(O=Z<D!``"0C6PD-K@!`````\50 +M4__6@\0(A<!U"U53_]:#Q`B%P'0'O0$```#K`C/MA>T/A<X"``"+1"0P9O], +M)#!FA<`/A(0!``")="00OA````!FA;=R"P``B^MFBUPD-G1+,\"*PU`SP&:+ +M1Q:#P`(E__\``%"+AUP+``#_4`2!X___```SP,'["('C_P```%-FBT<6@\`# +M)?__``!0BX=<"P``_U`$@\00ZR.0@>/__P``,\!39HM'%H/``B7__P``4(N' +M7`L``/]0"(/$"(M$)#"+W6;_3"0P9H7`#X5O____BW0D$.GA````D(M$)#!F +M_TPD,&:%P`^$S@```(OKC5PD-K@!`````\-05?_6@\0(A<!U"U-5_]:#Q`B% +MP'0'NP$```#K`C/;A=L/A=(!``!FBX=R"P``9JD0`&:+7"0V=$PSP(K#4#/` +M9HM'%H/``B7__P``4(N'7`L``/]0!('C__\``#/`P?L(@>/_````4V:+1Q:# +MP`,E__\``%"+AUP+``#_4`2#Q!#K)#O_@>/__P``,\!39HM'%H/``B7__P`` +M4(N'7`L``/]0"(/$"(M$)#!F_TPD,&:%P`^%//___^DS_O__@\<`C6PD,K@! +M`````\504__6@\0(A<!U"U53_]:#Q`B%P'0'O0$```#K`C/MA>T/A08!``"- +M;"0TN`$````#Q5!3_]:#Q`B%P'4+55/_UH/$"(7`=`F]`0```.L$._\S[87M +M#X72````C6PD,+@!`````\504__6@\0(A<!U"U53_]:#Q`B%P'0)O0$```#K +M!#O_,^V%[0^%G@```+@!````9B-$)#!FB40D+HM$)#`E__\``,'X`6:)1"0P +M9H7`#X0Y_?__BT0D.&:%1"0R#X4:_?__9HM$)#)FB40D*F:+AW(+``!FJ1`` +M=%\SP(I$)"I0,\!FBT<6@\`,)?__``!0BX=<"P``_U`$,\!FBT0D,L'X""7_ +M````4#/`9HM'%H/`#27__P``4(N'7`L``/]0!(/$$.LV@\<`75M>N`$```!? +M@\0LPX/'`#/`9HM$)"I0,\!FBT<6@\`,)?__``!0BX=<"P``_U`(@\0(BT0D +M-&:)1"0J9HN'<@L``&:I$`!T3S/`BD0D*E`SP&:+1Q:#P`HE__\``%"+AUP+ +M``#_4`0SP&:+1"0RP?@()?\```!0,\!FBT<6@\`+)?__``!0BX=<"P``_U`$ +M@\00ZR:#QP`SP&:+1"0J4#/`9HM'%H/`"B7__P``4(N'7`L``/]0"(/$"&:+ +M1"0N9H7`#X0?_?__Z3+\__\[_X/L(%>+1"0LQT0D$`````!6BW0D+%-5QD0D +M+P%FBP`S_V:%P`^$Q`,``(V&F@L``(E$)!2+1"0XC5@$9HM#"&:%P`^$C@,` +M`+@?````BHZ_#@``(L&+5"0<9HE$)"R*1"0O0H3`B50D'`^$P0```(M$)!1F +M]P`0`'0*BT,$N@@```#K!8M#!#/2B!"+1"0L)?__``"-!,4`$@``9HE$)"AF +MBX9R"P``9JD0`'13BT0D*"7_````4#/`9HM&%H/`!"7__P``4(N&7`L``/]0 +M!(M$)#`E__\``,'X""7_````4#/`9HM&%H/`!27__P``4(N&7`L``/]0!(/$ +M$.LG._^+1"0H)?__``!0,\!FBT86@\`$)?__``!0BX9<"P``_U`(@\0(QD0D +M+P#IV0```)!FBX9R"P``9JD0`'0[:@`SP&:+1A:#P`(E__\``%"+AEP+``#_ +M4`1J$#/`9HM&%H/``R7__P``4(N&7`L``/]0!(/$$.LB._]H`!```#/`9HM& +M%H/``B7__P``4(N&7`L``/]0"(/$"(M$)"QFA<!U9V:+AG(+``!FJ1``=#IJ +M`#/`9HM&%H/`!"7__P``4(N&7`L``/]0!&H2,\!FBT86@\`%)?__``!0BX9< +M"P``_U`$@\00ZR&0:``2```SP&:+1A:#P`0E__\``%"+AEP+``#_4`B#Q`@S +MR6:+CG(+``#WP2((``!T!XMK!.L$._^+*XO%P>@0]\$0````9HE$)"AT5(M$ +M)"@E_P```%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`2+1"0P)?__``#!^`@E +M_P```%`SP&:+1A:#P`,E__\``%"+AEP+``#_4`2#Q!#K*(/'`(M$)"@E__\` +M`%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`B#Q`AFBX9R"P``9JD0`&:);"0H +M=%&+1"0H)?\```!0,\!FBT86@\`")?__``!0BX9<"P``_U`$@>7__P``,\#! +M_0B!Y?\```!59HM&%H/``R7__P``4(N&7`L``/]0!(/$$.LG._^+1"0H)?__ +M``!0,\!FBT86@\`")?__``!0BX9<"P``_U`(@\0(9HM#"&:)1"0H9HN&<@L` +M`&:I$`!T48M$)"@E_P```%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`2+1"0P +M)?__``#!^`@E_P```%`SP&:+1A:#P`,E__\``%"+AEP+``#_4`2#Q!#K)8M$ +M)"@E__\``%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`B#Q`AF_XZ\#@``BH:_ +M#@``_L"(AK\.``"#PPR+1"0X1V:+`"7__P``._@/C$W\__]FBX::"P``9JD! +M`'0)9K\`<.L'@\<`9K\`T&:+AG(+``!FJ1``=%>+QR7_````4#/`9HM&%H/` +M`B7__P``4(N&7`L``/]0!('G__\``#/`P?\(@>?_````5V:+1A:#P`,E__\` +M`%"+AEP+``#_4`2#Q!!=6UZ+1"007X/$(,.!Y___```SP%=FBT86@\`")?__ +M``!0BX9<"P``_U`(@\0(Z]"#[!2X'P```%>+?"0<5E.*E[D+``"+7"0H(L(# +MP(T$0`4H$0``9HOP9HN'<@L``&:I$`!T3XO&)?\```!0,\!FBT<6@\`$)?__ +M``!0BX=<"P``_U`$@>;__P``,\#!_@B!YO\```!69HM'%H/`!27__P``4(N' +M7`L``/]0!(/$$.LD._^!YO__```SP%9FBT<6@\`$)?__``!0BX=<"P``_U`( +M@\0(_H>Y"P``,\!FBX=R"P``B40D%*D""```=`2+,^L#BW,$B\;!Z!!FB40D +M'(M$)!2I$````'14BT0D'"7_````4#/`9HM'%H/``B7__P``4(N'7`L``/]0 +M!(M$)"0E__\``,'X""7_````4#/`9HM'%H/``R7__P``4(N'7`L``/]0!(/$ +M$.LH@\<`BT0D'"7__P``4#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+ +MAW(+``!FJ1``=$Z+QB7_````4#/`9HM'%H/``B7__P``4(N'7`L``/]0!(O& +M)?__``#!^`@E_P```%`SP&:+1Q:#P`,E__\``%"+AUP+``#_4`2#Q!#K))"+ +MQB7__P``4#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+AW(+``!FJ1`` +M9HMS"'10B\8E_P```%`SP&:+1Q:#P`(E__\``%"+AUP+``#_4`2+QB7__P`` +MP?@()?\```!0,\!FBT<6@\`#)?__``!0BX=<"P``_U`$@\00ZR:#QP"+QB7_ +M_P``4#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+1P)F/5``#X6*```` +M:@$SP&:+1Q:#P`<E__\``%"+AUP+``#_4`1FB[>@"P``@\0(B\9F#0"`9H7V +M9HF'H`L``'5.9HM'`F8]4`!R1,:'NPL```!FBT<09H7`="O'1VP`````:(@` +M```SP&:+1Q:#P`<E__\``%"+AUP+``#_4`2#Q`CK"SO_5^@:X?__@\0$9L=' +M`F``6UY?@\04PSO_._^!_P````"#[!!7BWPD&%939HN'<@L``&:I$`!T.6H! +M,\!FBT<6@\`,)?__``!0BX=<"P``_U`$:@`SP&:+1Q:#P`TE__\``%"+AUP+ +M``#_4`2#Q!#K'6H!,\!FBT<6@\`,)?__``!0BX=<"P``_U`(@\0(9HN'<@L` +M`&:I$`!T.FH`,\!FBT<6@\`*)?__``!0BX=<"P``_U`$:@HSP&:+1Q:#P`LE +M__\``%"+AUP+``#_4`2#Q!#K(9!H``H``#/`9HM'%H/`"B7__P``4(N'7`L` +M`/]0"(/$"&:+AW(+``!FJ1``=#]J`#/`9HM'%H/``B7__P``4(N'7`L``/]0 +M!&B?````,\!FBT<6@\`#)?__``!0BX=<"P``_U`$@\00ZR.#QP!H`)\``#/` +M9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+AW(+``!FJ1``=#MJ`#/`9HM' +M%H/``B7__P``4(N'7`L``/]0!&H`,\!FBT<6@\`#)?__``!0BX=<"P``_U`$ +M@\00ZQ\[_VH`,\!FBT<6@\`")?__``!0BX=<"P``_U`(@\0(9HN'<@L``&:I +M$`!T.FH`,\!FBT<6@\`")?__``!0BX=<"P``_U`$:@`SP&:+1Q:#P`,E__\` +M`%"+AUP+``#_4`2#Q!#K'I!J`#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$ +M"&:+AW(+``!FJ1``=#IJ`#/`9HM'%H/``B7__P``4(N'7`L``/]0!&H`,\!F +MBT<6@\`#)?__``!0BX=<"P``_U`$@\00ZQZ0:@`SP&:+1Q:#P`(E__\``%"+ +MAUP+``#_4`B#Q`AFBX=R"P``9JD0`&:+=QAT3HO&)?\```!0,\!FBT<6@\`" +M)?__``!0BX=<"P``_U`$B\8E__\``,'X""7_````4#/`9HM'%H/``R7__P`` +M4(N'7`L``/]0!(/$$.LDD(O&)?__``!0,\!FBT<6@\`")?__``!0BX=<"P`` +M_U`(@\0(9HN'<@L``&:I$`!FBW<8=%"+QB7_````4#/`9HM'%H/``B7__P`` +M4(N'7`L``/]0!('F__\``#/`P?X(@>;_````5F:+1Q:#P`,E__\``%"+AUP+ +M``#_4`2#Q!#K)8/'`('F__\``#/`5F:+1Q:#P`(E__\``%"+AUP+``#_4`B# +MQ`AFBX=R"P``9JD0`'0Y:@4SP&:+1Q:#P`(E__\``%"+AUP+``#_4`1J!3/` +M9HM'%H/``R7__P``4(N'7`L``/]0!(/$$.L@:`4%```SP&:+1Q:#P`(E__\` +M`%"+AUP+``#_4`B#Q`@STF:+EW(+``#WP@"```!T"XUW$(U?".L/@\8`BX=D +M"P``C7`0C5@(B\;!Z!#WPA````!FB40D&'12BT0D&"7_````4#/`9HM'%H/` +M`B7__P``4(N'7`L``/]0!(M$)"`E__\``,'X""7_````4#/`9HM'%H/``R7_ +M_P``4(N'7`L``/]0!(/$$.LFD(M$)!@E__\``%`SP&:+1Q:#P`(E__\``%"+ +MAUP+``#_4`B#Q`AFBX=R"P``9JD0`'1.B\8E_P```%`SP&:+1Q:#P`(E__\` +M`%"+AUP+``#_4`2+QB7__P``P?@()?\```!0,\!FBT<6@\`#)?__``!0BX=< +M"P``_U`$@\00ZR20B\8E__\``%`SP&:+1Q:#P`(E__\``%"+AUP+``#_4`B# +MQ`B+P\'H$&:+\&:+AW(+``!FJ1``=%"+QB7_````4#/`9HM'%H/``B7__P`` +M4(N'7`L``/]0!(O&)?__``#!^`@E_P```%`SP&:+1Q:#P`,E__\``%"+AUP+ +M``#_4`2#Q!#K)H/'`(O&)?__``!0,\!FBT<6@\`")?__``!0BX=<"P``_U`( +M@\0(9HN'<@L``&:I$`!FB_-T38O&)?\```!0,\!FBT<6@\`")?__``!0BX=< +M"P``_U`$@>;__P``,\#!_@B!YO\```!69HM'%H/``R7__P``4(N'7`L``/]0 +M!(/$$.LB@>;__P``,\!69HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+AW(+ +M``!FJ1``=$5H@````#/`9HM'%H/`!B7__P``4(N'7`L``/]0!&B0````,\!F +MBT<6@\`')?__``!0BX=<"P``_U`$@\006UY?@\00PY!H@)```#/`9HM'%H/` +M!B7__P``4(N'7`L``/]0"(/$"%M>7X/$$,.0._^!_P````"#[`Q7BWPD%%93 +M9HN'<@L``&:I$`!T13/`9HM'%H/`#"7__P``4(N'7`L``/]0'(OP,\!FBT<6 +M@\`-)?__``!0BX=<"P``_U`<P>`(9@OP@>;__P``@\0(ZR4[_S/`9HM'%H/` +M#"7__P``4(N'7`L``/]0((OP@>;__P``@\0$9HN'<@L``&:I$`!T1#/`9HM' +M%H/`"B7__P``4(N'7`L``/]0'(O8,\!FBT<6@\`+)?__``!0BX=<"P``_U`< +MP>`(9@O8@>/__P``@\0(ZR20,\!FBT<6@\`*)?__``!0BX=<"P``_U`@B]B! +MX___``"#Q`1FBX=R"P``9JD0`&:)7"06=#MJ`3/`9HM'%H/`#"7__P``4(N' +M7`L``/]0!&H`,\!FBT<6@\`-)?__``!0BX=<"P``_U`$@\00ZQ\[_VH!,\!F +MBT<6@\`,)?__``!0BX=<"P``_U`(@\0(9HN'<@L``&:I$`!T/FCN````,\!F +MBT<6@\`*)?__``!0BX=<"P``_U`$:@4SP&:+1Q:#P`LE__\``%"+AUP+``#_ +M4`2#Q!#K(CO_:.X%```SP&:+1Q:#P`HE__\``%"+AUP+``#_4`B#Q`AJ"HN' +M7`L``/]0-&:+AW(+``"#Q`1FJ1``=#DSP&:+1Q90BX=<"P``_U`<B]@SP&:+ +M1Q9`)?__``!0BX=<"P``_U`<P>`(9@O8@>/__P``@\0(ZQLSP&:+1Q90BX=< +M"P``_U`@B]B!X___``"#Q`1FBX=R"P``9JD0`'10B\8E_P```%`SP&:+1Q:# +MP`PE__\``%"+AUP+``#_4`2!YO__```SP,'^"('F_P```%9FBT<6@\`-)?__ +M``!0BX=<"P``_U`$@\00ZR6#QP"!YO__```SP%9FBT<6@\`,)?__``!0BX=< +M"P``_U`(@\0(9HN'<@L``&:I$`!T63/`BD0D%E`SP&:+1Q:#P`HE__\``%"+ +MAUP+``#_4`0SP&:+1"0>P?@()?\```!0,\!FBT<6@\`+)?__``!0BX=<"P`` +M_U`$@\00B\-;7B7__P``7X/$#,.0,\!FBT0D%E`SP&:+1Q:#P`HE__\``%"+ +MAUP+``#_4`B#Q`CKS(/'`('_`````('_`````(/L#%>+?"045E-59HN'H`L` +M`&:%P'0^9HM'$&:%P'0LQT=L`````&B(````,\!FBT<6@\`')?__``!0BX=< +M"P``_U`$@\0(ZPR#QP!7Z,[6__^#Q`1FBX>T"P``9H7`#X3/````,^VX'P`` +M`"*'M@L``(OP9HN'M`L``&:%P'XIC9^T"P``C01VP>`#C80'O`L``%!7Z(;R +M__]&@\0(@^8?10^_`SOH?-UJ`3/`9HM'%H/`!R7__P``4(N'7`L``/]0!&;' +M1P)@`&:+MZ`+``"#Q`B+QF8-`(!FA?9FB8>@"P``=55FBT<"9CU0`')+QH>[ +M"P```&:+1Q!FA<!T*<=';`````!HB````#/`9HM'%H/`!R7__P``4(N'7`L` +M`/]0!(/$".L25^CRU?__@\0$ZP>09L='`E``5^A`T?__9HNWC@L``(/$!(O& +M@>;__P``P>8(:@`E__\``('F`/\``,'X""7_````"\:+\#/`@>;__P``BH>< +M"P``4&:+AW(+``!FJ0$`=`JX$````.L(@\<`N`0````E__\``%"+QB7__P`` +M4&H`:@!7Z*\T``"#Q!R*AWT+``"H`W1J5^CL^O__9HF'D!```(/$!&:+MZ`+ +M``"+QF8-``%FA?9FB8>@"P``=4%FBT<"9CU0`'(WQH>["P```&:+1Q!FA<!T +M+\=';`````!HB````#/`9HM'%H/`!R7__P``4(N'7`L``/]0!(/$"%U;7E^# +MQ`S#5^CJU/__@\0$75M>7X/$#,.#QP"!_P````"!_P````!0BU0D"(M$)`QF +MBXJ@"P``9@O!9H7)9HF"H`L``'5!9HM"`F8]4`!R-\:"NPL```!FBT(09H7` +M="O'0FP`````:(@````SP&:+0A:#P`<E__\``%"+@EP+``#_4`2#Q`B#Q`3# +M4NAFU/__@\0$@\0$PX/'`('_`````('_`````(/L%+C_````5XM\)!Q39B-' +M"HK8,\"*PSV`````#X2!````@_@"="1J`&H`:@`-``8``"7__P``4&H!:@)7 +MZ$TS``"#Q!Q;7X/$%,-J`&H`:@`SP&:+1PK!^`@-``<``"7__P``4&H`:@)7 +MZ"`S``!H_P```#/`9HM'%H/`!R7__P``4(N'7`L``/]0!&;'1P)%`&;'1P0% +M`(/$)%M?@\04PSO_9HM'"F:I`(!T"L:'G`L```+K")#&AYP+```!9HN'<@L` +M`&:I`@AT!#/`ZP6X`$```(E$)`AFBX>:"P``9JD!`'0*N`"```#K!8/'`#/` +M9L='$``$QT=H``````M$)`B+R"7__P``P?@(@>'__P``P>$()?\```"!X0#_ +M```+P8E'$C/`:)````!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(,\#'1VP` +M````9L='!`$`9L='`D0`:(@```!FBT<6@\`')?__``!0BX=<"P``_U`$@\0( +M6U^#Q!3#D(/L#%>+?"045E-FBX=R"P``9JD!`'0)9L='.```ZP>09L='.``0 +M9HN'F@L``&:I!`!U(F:+1SAF#0!`9HN7F@L``&;WP@@`9HE'.'0(9@T`(&:) +M1SAFB[>8"P``N0`:``!FB4](BH>("P``9HE/2KD9````B$<ZBH>)"P``B$<[ +MBH>*"P``B$<\BH>+"P``B$<]BH>,"P``B$<^BH>-"P``B$<_BX>0"P``B4=` +MBX>4"P``B4=$B\8E__\``('F__\``,'X"(A/4L'F""7_````@>8`_P``B$]3 +M"\8SR6:)1TR^`@```&:)3TYFB4]0H`````"(1QR@`0```(A''8J&`````(A$ +M-QR*A@$```"(1#<=BH8"````B$0W'HJ&`P```(/&!(/^$HA$-QM\T&:+AW(+ +M``!FJ0"`#X28````C7<<B]:+QL'J",'H&('B`/\```O"B];!X@C!YAB!X@`` +M_P`+P@O&C7<XB4=49L='$``#9L='!#P`9L='`D,`B]:+QL'H&+L`````P>H( +MB5]H@>(`_P``"\*+UL'B",'F&('B``#_``O""\:)1Q(SP&B0````9HM'%H/` +M!R7__P``4(N'7`L``/]0!(/$"%M>7X/$#,.#Q@"+AV0+``"^'`````/PB]:+ +MQL'J",'H&('B`/\```O"B];!X@C!YAB!X@``_P`+P@O&B4=4BX=D"P``C7`X +MZ5/___\[_XUT)@"#[!@SP%>+?"0@5E-59HM'`H/X0P^$@00```^/6`0``(/X +M)'1O#X\M`0``@_@B#X2(````#X^>````@_@A#X6=!P``,\!FBT<6@\`&)?__ +M``!0BX=<"P``_U`<BMBX<````(/$!"+#@_AP#X1D`@``5^@Z,```9L='!``` +M9L='`B0`N.@#``"#Q`1=6UY?@\08PSO_9HM'!&;_1P1F/0(`=@QFQT<$``!F +MQT<")0!=6UZXZ`,``%^#Q!C#D&:+1P1F_T<$9CT"`';D9L='!```9L='`B,` +MZ]:#^",/A?\&``!FBT<$9O]'!&8]'@`/AXL````SP&:+1Q:#P`8E__\``%"+ +MAUP+``#_4!R*V+@P````@\0$(L.#^#`/A+4```"X?P```"+#@_A`#X6D`0`` +M9L='`C``:@!J`&H`:@!J`&H!5^BH+@``@\0<N.@#``!=6UY?@\08PX/X00^$ +MYP````^/V0(``(/X)0^%<`8``&:+1P1F_T<$9CT>`'8N9L='`A``:@!J`&H` +M:``"``!J`&H!5^A7+@``@\0<N.@#``!=6UY?@\08PX/'`#/`9HM'%H/`!B7_ +M_P``4(N'7`L``/]0'(K8N#````"#Q`0BPX/X,'4[9L='`A``:@!J`&H`N!\` +M```BPPT``0``)?__``!0:@!J`5?H\RT``(/$'+CH`P``75M>7X/$&,.#QP"X +M?P```"+#@_A`#X6T````9L='`C``BY=@"P``4HN'7`L``/]0/(/$!+CH`P`` +M75M>7X/$&,,[_S/`9HM'%H/`!B7__P``4(N'7`L``/]0'(/$!(K8]L,0=#)J +M`&H`:@"X#P```"+##0`!```E__\``%!J`6H"5^AD+0``@\0<N.@#``!=6UY? +M@\08P_;#8'1#9HM'!&;_1P1F/60`=B5J`&H`:@!H``(``&H!:@)7Z"PM``"# +MQ!RXZ`,``%U;7E^#Q!C#75M>N&0```!?@\08PX/&`&:+1Q!FA<!U/HM'$CW! +MXM2+=30SP&:+1P@]__\``'4G,\!FBT<*/='7``!U&C/`9HM'##W%V0``=0TS +MP&:+1PX]P]0``'1%:@!J`&H`9HN'<@L``&:I`(!T"K@`!```ZPB#QP"X``,` +M`"7__P``4&H!:@)7Z),L``"#Q!RXZ`,``%U;7E^#Q!C#@\<`:B`SP&:+1Q:# +MP`<E__\``%"+AUP+``#_4`1HA````#/`9HM'%H/`!R7__P``4(N'7`L``/]0 +M!&;'1RX`"F;'1S`*`&:+AW(+``"#Q!!FJ0"`=`6-1R[K"8N'9`L``(/`+F;' +M1Q``"V;'1P0"`&;'1P)"`(O(P>@8B]'!Z@B!X@#_```+PHO1P>((P>$8@>(` +M`/\`"\*Z``````O!B5=HB4<2,\!HD````&:+1Q:#P`<E__\``%"+AUP+``#_ +M4`2#Q`BXZ`,``%U;7E^#Q!C#D(/X0@^%EP,``&:+1P1F_T\$9H7`#X54_/__ +M:@!J`&H`:``$``!J`6H"5^B!*P``@\0<Z3?\__^0@_A0#X30`0``#X_!`0`` +M@_A%='P/CTX#``"#^$0/A44#``!FBT<$9O]/!&:%P`^%`OS__V:+AW(+``!F +MJ1``#X3'````,\!FBT<6@\`()?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`DE +M__\``%"+AUP+``#_4!S!X`AF"_"!YO__``")="0@@\0(Z:$```"09HM'!&;_ +M3P1FA<`/A97[__]FBT<&9CT+`'4\,\!FBT<6@\`()?__``!0BX=<"P``_U`< +M@\@()?\```!0,\!FBT<6@\`()?__``!0BX=<"P``_U`$@\0,5^A+ZO__9L=' +M!```9L='`D$`@\0$N&0```!=6UY?@\08PX/'`#/`9HM'%H/`""7__P``4(N' +M7`L``/]0("7__P``B40D'(/$!&:+AW(+``!FJ1``=$,SP&:+1Q:#P`8E__\` +M`%"+AUP+``#_4!R+Z#/`9HM'%H/`!R7__P``4(N'7`L``/]0','@"&8+Z('E +M__\``(/$".LC,\!FBT<6@\`&)?__``!0BX=<"P``_U`@B^B!Y?__``"#Q`2! +MY?__``"+1"08527__P``4&H`:``%``!J`6H"5^BS*0``@\0<Z6GZ__^#QP"# +M^&`/A8\!``!FBX>@"P``9H7`#X0_`0``BH>["P``BLC^P3P"B(^["P``#XXG +M`0``9HN'<@L``&:I$`!T2C/`9HM'%H/`""7__P``4(N'7`L``/]0'(OP,\!F +MBT<6@\`))?__``!0BX=<"P``_U`<P>`(9@OP@>;__P``B70D((/$".LG@\<` +M,\!FBT<6@\`()?__``!0BX=<"P``_U`@)?__``")1"0<@\0$9HN'<@L``&:I +M$`!T0S/`9HM'%H/`!B7__P``4(N'7`L``/]0'(OH,\!FBT<6@\`')?__``!0 +MBX=<"P``_U`<P>`(9@OH@>7__P``@\0(ZR,SP&:+1Q:#P`8E__\``%"+AUP+ +M``#_4""+Z('E__\``(/$!('E__\``(M$)!A5)?__``!0,\!FBX>@"P``4&H! +M:@%J!U?H8B@``(/$'+CH`P``75M>7X/$&,,[_XI'&X3`#X0#^?__BD<:BM#^ +MPCP"B%<:#X[Q^/__:@!J`&H`:@-J`6H'5^@A*```@\0<N.@#``!=6UY?@\08 +MPY!=6UXSP%^#Q!C#._^-="8`@^P85XM\)"!6BW0D*%-5B\8E__\``%#_5QPS +MTB7^````BA4`````"\(E^P```(K8,\"*PU"+QB7__P``4/]7!+@!````@\0, +M(L.B`````(O&)?__``!0_U<<,](E_@```(H5``````O")?T```"*V#/`BL-0 +MB\8E__\``%#_5P2X`0```(/$#"+#H@````"+QB7__P``4/]7'#/2)?X```"* +M%0`````+PB7^````BM@SP(K#4(O&)?__``!0_U<$N`$```"#Q`PBPZ(````` +MB\8E__\``%#_5QPSTB7^````BA4`````"\(E[P```(K8,\"*PU"+QB7__P`` +M4/]7!+@!````@\0,(L.B`````(O&)?__``!0_U<<B\:#Q`0E__\``%#_5QR+ +MQH/$!"7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QPSTB7^ +M````BA4`````"\*#R!"*V#/`BL-0B\8E__\``%#_5P2X`0```(/$#"+#H@`` +M``"+QB7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QR+QH/$ +M!"7__P``4/]7'(O&@\0$)?__``!0_U<<,](E_@```(H5``````O"@\@"BM@S +MP(K#4(O&)?__``!0_U<$N`$```"#Q`PBPZ(`````B\8E__\``%#_5QR+QH/$ +M!"7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QR+7"0X@\0$ +M@>/_````QT0D'`$```#!XPB!RX````!FA=L/A'<!``"+1"0<A<!T(8O&B^LE +M__\``%#_5QPSTB7^````BA4`````"\*#R`'K(8O&B^LE__\``%#_5QPSTB7^ +M````BA4`````"\(E_@```(K8,\"*PU"+QB7__P``4/]7!+@!````@\0,(L.B +M`````(O&)?__``!0_U<<,](E_@```(H5``````O")?T```"*V#/`BL-0B\8E +M__\``%#_5P2X`0```(/$#"+#H@````"+QB7__P``4/]7'(O&@\0$)?__``!0 +M_U<<B\:#Q`0E__\``%#_5QR+QH/$!"7__P``4/]7'(O&@\0$)?__``!0_U<< +M,](E_@```(H5``````O"@\@"BM@SP(K#4(O&)?__``!0_U<$N`$```"#Q`PB +MPZ(`````B\8E__\``%#_5QR+QH/$!"7__P``4/]7'(O&@\0$)?__``!0_U<< +MB\:#Q`0E__\``%#_5QR+Q8'E__\``"4`@```@\0$C5PM`(E$)!QFA=L/A8G^ +M__]=6UY?@\08PSO_._^!_P````"#[!17BWPD'%:+="0D4U6+QB7__P``4/]7 +M'(A$)"<E_P```(/(("7_````4(O&)?__``!0_U<$Q@4``````(M4)#RX/P`` +M`"+"#8`````E_P```%"+QB7__P``4%?HOOO__XM$)$R#Q!B%P(U0_XE4)#0/ +MA$P!```S[8EL)!B+QB7__P``4/]7'#/2)?X```"*%0`````+PB7]````BM@S +MP(K#4(O&)?__``!0_U<$N`$```"#Q`PBPZ(`````B\8E__\``%#_5QR+QH/$ +M!"7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QR+QH/$!"7_ +M_P``4/]7'#/2)?X```"*%0`````+PH/(`HK8,\"*PU"+QB7__P``4/]7!+@! +M````@\0,(L.B`````(O&)?__``!0_U<<B\:#Q`0E__\``%#_5QR+QH/$!"7_ +M_P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``('E__\``%#_5QP#[8/@ +M`3/;@\0$BMB%VW0$9H/-`8M,)!A!B4PD&(/Y$`^,V_[__XM$)#AFB2B-2`*+ +M1"0TB4PD.(7`C5#_B50D-`^%M/[__XO&)?__``!0_U<<,](E_@```(H5```` +M``O")>\```"*V#/`BL-0B\8E__\``%#_5P2X`0```(/$#"+#H@````"+QB7_ +M_P``4/]7'#/2)?X```"*%0`````+PB7[````BM@SP(K#4(O&)?__``!0_U<$ +MN`$```"#Q`PBPX'F__\``*(`````,\"*1"0C4%;_5P2#Q`A=6UY?@\04PX/L +M#%>+?"045HMT)!R+QB7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\` +M`%#_5QR#Q`2!YO__``!6_U<<@\0$7E^#Q`S#._^-="8`@^P(5U93BUPD&&8S +M_X/#`HO/@\,"@\,"9HMS^HO&@>;__P``P>8()?__``#!^`B!Y@#_```E_P`` +M``O&B_!FBT/Z@>;__P``9@/^9@O(9HMS_(O&@>;__P``P>8()?__``#!^`B! +MY@#_```E_P````O&B_!FBT/\@>;__P``9@/^9@O(9HMS_HO&@>;__P``P>8( +M)?__``#!^`B!Y@#_```E_P````O&B_!FBT/^@>;__P``9@/^9@O(@>?__P`` +M9HLSB\:!YO__``#!Y@@E__\``,'X"('F`/\``"7_````"\:+\('F__\``#O^ +M=`DSP%M>7X/$",,STHO!9HL36R7__P``7@O"7X/$",.#QP"#["17BWPD+%93 +M58ML)$"+1"0\)?__``!0_U<<B$0D-X/$!(M$)#PE__\``(/`#&:)1"0JB]@E +M__\``%#_5QR+\('C__\``$.!X___``!3_U<<P>`(@\0(9@OPBT0D/('F__\` +M`&:)="0P)?__``"#P`IFB40D+(O8)?__``!0_U<<B_"!X___``!#@>/__P`` +M4_]7','@"(/$"&8+\&H`@>;__P``9HET)#)FBW0D+HO&)?__``!0_U<$:@"! +MYO__``!&@>;__P``5O]7!(MT)#R#Q!"+QFH`)?__``!0_U<$:@"!YO__``!& +M@>;__P``5O]7!(M$)$R#Q!`E__\``#/V@\`"C5\<9HO0BT0D/(EL)!`E__\` +M`(E\)!2+^HUH`XO')?__``!0_Q.+Q27__P``4/\3B$0T((/$"$:#_@A\WV:+ +M="0JBWPD%(M$)#"+;"00)?\```!0B\8E__\``%#_5P2+1"0X@>;__P``)?__ +M``!&P?@(@>;__P``)?\```!05O]7!(MT)#R#Q!`SP(I$)"Y0B\8E__\``%#_ +M5P0SP('F__\``&:+1"0V1L'X"('F__\``"7_````4%;_5P0SP(/$$(I$)#-0 +MBT0D0"7__P``4/]7!(U$)"!0Z`W]__^#Q`R%P'0^B\5%BU0D&(@0B\5%BE0D +M&8@0B\5%BE0D&H@0B\6*5"0;18@018M4)!R(5?^*5"0=B%4`75M>7X/$),.# +MQP"X!@```(O]O@4```"%P'3EB\9.Q@<`1X7`=?5=6UY?@\0DPY"-="8`@^P< +M,\E7BWPD+%9358M$)#1FBV@0BT0D-,9'`03&1S`!9L='$B``9HE/%H'E_/\` +M`&:);Q!FB4\4BT`4@^#PB4<8A<!T#F;'1QP`(,9''F#K##O_9L=''```QD<> +M(,9''P"-1"04B]U0:@1J/('C__\``(/#$8M4)#R!X___``"-=R)34NAF^?__ +MC40D*%#H#/S__X/$&(7`=#5&C5PD%$-&0T9#1D-#1HI#^XA&^XI#_(A&_(I# +M_8A&_8I#_HA&_HI#_XA&_XH#B`;K'(/'`+@&````NP4```"%P'0+B\-+Q@8` +M1H7`=?6+Q27__P``@\`0)?__``!0BT0D-/]0'(/$!*F`````=`;&1RP0ZP3& +M1RP$B@^`^0IU)<9'(01=6UXSP%^#Q!S#@\8`QD<?`<9'(00SP%U;7E^#Q!S# +M._^-1"0F@>7__P``4(M$)#1J`6H&@\41@>7__P``55#HC?C__S/`@\049HM$ +M)":I``$``'0<J0`"``!U#HM$)#1FBT`$9JD$`'4'N`$```#K`C/`A<!UEL9' +M'P#&1R'_BD<>#`*(1QZ+1"0T9HM`!&:I!`!U$%U;7K@"````7X/$',.#QP!= +M6UXSP%^#Q!S#._^#[`Q7BWPD((U$)`2+5"044(M$)"!J!"7_````4(M$)"0E +M__\``%!2Z//W__^-1"084.B9^O__@\08A<!T-D>-3"0$04=!1T%'04%'BD'[ +MB$?[BD'\B$?\BD']B$?]BD'^B$?^BD'_B$?_B@&(!U^#Q`S#D+@&````N04` +M``"%P'3LB\%)Q@<`1X7`=?5?@\0,PSO_@?\`````@?\`````@^P(5S/_5HMT +M)!135<9&&P!J"%;HQR0``(/$"*D`"```#X2L````O1````"+QT<]Z`,``'XB +M:@!J`&H`:@%J`6H&5NA8&P``N`$```"#Q!Q=6UY?@\0(PV:%KG(+``!T0S/` +M9HM&%H/`""7__P``4(N&7`L``/]0'(O8,\!FBT86@\`))?__``!0BX9<"P`` +M_U`<P>`(9@O8@>/__P``@\0(ZR,SP&:+1A:#P`@E__\``%"+AEP+``#_4""+ +MV('C__\``(/$!/?#``@```^%6?___UU;7C/`7X/$",.#QP"#[`A7BWPD$%9F +MBX=R"P``9JD0`'1&,\!FBT<6@\`&)?__``!0BX=<"P``_U`<B_`SP&:+1Q:# +MP`<E__\``%"+AUP+``#_4!S!X`AF"_"+_H'G__\``(/$".LDD#/`9HM'%H/` +M!B7__P``4(N'7`L``/]0((OX@>?__P``@\0$]\>`````7K@`````#Y7`7X/$ +M",.0@?\`````@?\`````@^P(5XM\)!!69HN'<@L``&:I$`!T1C/`9HM'%H/` +M""7__P``4(N'7`L``/]0'(OP,\!FBT<6@\`))?__``!0BX=<"P``_U`<P>`( +M9@OP@>;__P``@\0(ZR:#QP`SP&:+1Q:#P`@E__\``%"+AUP+``#_4""+\('F +M__\``(/$!(O&@^#W9HOP9HN'<@L``&:I$`!T4(O&)?\```!0,\!FBT<6@\`( +M)?__``!0BX=<"P``_U`$@>;__P``,\#!_@B!YO\```!69HM'%H/`"27__P`` +M4(N'7`L``/]0!(/$$.LE@\<`@>;__P``,\!69HM'%H/`""7__P``4(N'7`L` +M`/]0"(/$"&:+AW(+``!FJ1``=$4SP&:+1Q:#P`8E__\``%"+AUP+``#_4!R+ +M\#/`9HM'%H/`!R7__P``4(N'7`L``/]0','@"&8+\(O^@>?__P``@\0(ZR,S +MP&:+1Q:#P`8E__\``%"+AUP+``#_4""+^('G__\``(/$!/?'@````%ZX```` +M``^5P%^#Q`C#D(/L"%>+?"005F:+AW(+``!FJ1``=$8SP&:+1Q:#P`@E__\` +M`%"+AUP+``#_4!R+\#/`9HM'%H/`"27__P``4(N'7`L``/]0','@"&8+\('F +M__\``(/$".LF@\<`,\!FBT<6@\`()?__``!0BX=<"P``_U`@B_"!YO__``"# +MQ`2+QH/("&:+\&:+AW(+``!FJ1``=%2+QB7_````4#/`9HM'%H/`""7__P`` +M4(N'7`L``/]0!('F__\``#/`P?X(@>;_````5F:+1Q:#P`DE__\``%"+AUP+ +M``#_4`2#Q!!>7X/$",.#QP"!YO__```SP%9FBT<6@\`()?__``!0BX=<"P`` +M_U`(@\0(7E^#Q`C#@^P,5XM\)!16BD<;A,`/A9@```!FBX=R"P``9JD0`'1' +M,\!FBT<6@\`()?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`DE__\``%"+AUP+ +M``#_4!S!X`AF"_"!YO__``")="04@\0(ZR0SP&:+1Q:#P`@E__\``%"+AUP+ +M``#_4"`E__\``(E$)!"#Q`2+1"0,)0`+```]``,``'4<N`$```"(1QM>7X/$ +M#,,[_[@!````7E^#Q`S#D&:+AW(+``!FJ1``=$<SP&:+1Q:#P`8E__\``%"+ +MAUP+``#_4!R+\#/`9HM'%H/`!R7__P``4(N'7`L``/]0','@"&8+\(O^@>?_ +M_P``@\0(ZR4[_S/`9HM'%H/`!B7__P``4(N'7`L``/]0((OX@>?__P``@\0$ +M]\>`````#X5Q____7C/`7X/$#,.0@?\`````@?\`````@^P85XM\)"!64U5F +MBX=R"P``9JD0`'1$,\!FBT<6@\`()?__``!0BX=<"P``_U`<B_`SP&:+1Q:# +MP`DE__\``%"+AUP+``#_4!S!X`AF"_"!YO__``"#Q`CK))`SP&:+1Q:#P`@E +M__\``%"+AUP+``#_4""+\('F__\``(/$!+@``P``9B/&/0`#```/A6P#``!F +MBX=R"P``B]Z!X_?_``"!RP`(``!FJ1``=$LSP(K#4#/`9HM'%H/`""7__P`` +M4(N'7`L``/]0!('C__\``#/`P?L(@>/_````4V:+1Q:#P`DE__\``%"+AUP+ +M``#_4`2#Q!#K(Y"!X___```SP%-FBT<6@\`()?__``!0BX=<"P``_U`(@\0( +M9HN'<@L``&:I$`!T13/`9HM'%H/`#B7__P``4(N'7`L``/]0'(OH,\!FBT<6 +M@\`/)?__``!0BX=<"P``_U`<P>`(9@OH@>7__P``@\0(ZR4[_S/`9HM'%H/` +M#B7__P``4(N'7`L``/]0((OH@>7__P``@\0$9HEL)"9FA>T/A$\!``!FBX=R +M"P``9JD0`'1&,\!FBT<6@\`&)?__``!0BX=<"P``_U`<B^@SP&:+1Q:#P`<E +M__\``%"+AUP+``#_4!S!X`AF"^B!Y?__``"#Q`CK)H/'`#/`9HM'%H/`!B7_ +M_P``4(N'7`L``/]0((OH@>7__P``@\0$9HN'<@L``&:I$`!FB6PD)'1#,\!F +MBT<6@\`$)?__``!0BX=<"P``_U`<B^@SP&:+1Q:#P`4E__\``%"+AUP+``#_ +M4!S!X`AF"^B!Y?__``"#Q`CK(S/`9HM'%H/`!"7__P``4(N'7`L``/]0((OH +M@>7__P``@\0$@>7__P``BT0D)"7__P``P>`0"\5F]\8`!(E$)!AT(C/`BU0D +M&&:+1"0F4#/`4F:+1Q90BX=<"P``_U`H@\0,ZR`SP(M,)!AFBT0D)E`SP%%F +MBT<64(N'7`L``/]0$(/$#%?HGO?__X/$!(7`=`LSP%U;7E^#Q!C#D&:+AW(+ +M``!FJ1``=$,SP&:+1Q:#P`@E__\``%"+AUP+``#_4!R+\#/`9HM'%H/`"27_ +M_P``4(N'7`L``/]0','@"&8+\('F__\``(/$".LC,\!FBT<6@\`()?__``!0 +MBX=<"P``_U`@B_"!YO__``"#Q`2+QH/("&:+\&:+AW(+``!FJ1``=%"+QB7_ +M````4#/`9HM'%H/`""7__P``4(N'7`L``/]0!('F__\``#/`P?X(@>;_```` +M5F:+1Q:#P`DE__\``%"+AUP+``#_4`2#Q!#K)8/'`('F__\``#/`5F:+1Q:# +MP`@E__\``%"+AUP+``#_4`B#Q`A7Z#S!__^#Q`2#R`%=6UY?@\08PSO_@?\` +M````@?\`````@^P(5XM\)!!69HN'H`L``&:%P`^$[@(``#/`9HN'/@L``(/` +M!`T```"`4#/`9HN'<`L``(/`%"7__P``4(N'7`L``/]0#&:+AZ`+``"#Q`AF +MJ0(`=!YFQX>B"P```@!7Z(LT``"^`0```(/$!.DJ`@``._]FBX>@"P``9JD$ +M`'039L>'H@L```0`O@(```#I"`(``&:+AZ`+``!FJ0@`=!]FQX>B"P``"`!7 +MZ&`U``"^`P```(/$!.G?`0``@\8`9HN'H`L``&:I(`!T'V;'AZ(+```@`%?H +MY#8``+X%````@\0$Z;,!``"#Q@!FBX>@"P``9JE``'0?9L>'H@L``$``5^@( +M-P``O@8```"#Q`3IAP$``(/&`&:+AZ`+``!FJ8``=$=FQX>B"P``@`!J$C/` +M9HN'<`L``(/`&"7__P``4(N'7`L``/]0#(/$"+X'````9HN'H`L``&8-`0!F +MB8>@"P``Z3(!```[_V:+AZ`+``!FJ0`!=!]FQX>B"P````%7Z(@X``"^"``` +M`(/$!.D'`0``@\8`9HN'H`L``&:I$`!T,V;'AZ(+```0`&H(,\!FBX=P"P`` +M@\`8)?__``!0BX=<"P``_U`,@\0(O@0```#IQ````&:+AZ`+``!FJ0!`=#-F +MQX>B"P```$!J"#/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0#(/$"+X.```` +MZ80```!FBX>@"P``9JD!`'0O9L>'H@L```$`:@@SP&:+AW`+``"#P!@E__\` +M`%"+AUP+``#_4`R#Q`@S]NM*._]J`VH`,\!FBX>@"P``4&H%:@!J!E?HH@\` +M`(/$'#/`9L>'H@L```$`:@AFBX=P"P``@\`8)?__``!0BX=<"P``_U`,@\0( +M,_8SP&:+ASX+``!0,\!FBX=P"P``@\`4)?__``!0BX=<"P``_U`,5C/`9HN' +M<`L``(/`&"7__P``4(N'7`L``/]0##/`,\EFBX>B"P``B(^["P``]]!F(X>@ +M"P``@\009HF'H`L``(B/3`L``%Y?@\0(PX/'`(/L"#/`BTPD#&:+00*#^$%T +M=H/X0G1]@_A##X2`````@_A$#X2#````@_A%#X2&````@_A)````@_A0 +M=`6#^&!U/F;'00(S`&:+D:`+``!F@\H09HN!H@L``&:)D:`+``!FA<!U&F:+ +M00)F/3``<A#&@;L+````4>AP_/__@\0$@\0(PY!FQT$",0"#Q`C#._]FQT$" +M,@"#Q`C#._]FQT$",P"#Q`C#._]FQT$"-`"#Q`C#._]FQT$"-0"#Q`C#._]F +MQT$"-@"#Q`C#._^#[!0SP%>+?"0<4V:+1P*#^$0/A(P````/C]("``"#^#8/ +MA.$!```/CY\"``"#^#1T<@^/6`(``(/X(0^%MP0``&:+1P1F_T<$9CT*``^& +MI00``#/`9HN'<`L``(/`,B7__P``4(N'7`L``/]0((/(#R7__P``4%>+AVP+ +M``#_4#1FQT<"$`!J`&H`:@!H``(``&H`:@%7Z)0-``"#Q"CI5`0``#/`9HN' +M<`L``(/`,B7__P``4(N'7`L``/]0((/$!(O09O?"`@`/A?$```"*A[L+``"* +MR/[!/`.(C[L+```/CA$$``!FQT<"$`!7Z/T-``"+AV`+``!0BX=<"P``_U`\ +M@\0(,\!J!&H`9HM'`E!J!6H`:@97Z!,-```SP&:+ASX+``!0,\!FBX=P"P`` +M@\`4)?__``!0BX=<"P``_U`,,\!FBX=`"P``4#/`9HN'<`L``(/`%"7__P`` +M4(N'7`L``/]0#(/$+&H/5XN';`L``/]0-&H`,\!FBX=P"P``@\`()?__``!0 +MBX=<"P``_U`,@\005^A4#0``BY=@"P``4HN'7`L``/]0/,>'4`L```````"# +MQ`CI.@,``#O_@>+__P``@\H!@>+__P``4E>+AVP+``#_4#1F_T<",\EFB4\$ +MB8]0"P``5XN';`L``/]0+&;'1P0``&;_1P*#Q`SI\@(``#O_9HM'!&;_1P1F +M/0H`#X;>`@``,\!FBX=P"P``@\`R)?__``!0BX=<"P``_U`@@\@!)?__``!0 +M5XN';`L``/]0-,>'4`L```````!FQT<"$`!J`&H`:@!H``(``&H`:@%7Z,,+ +M``"#Q"A7Z'H,``"+CV`+``!1BX=<"P``_U`\@\0(Z6H"```[_X/X-0^%7P(` +M`&:+1P1F_T<$9CT!``^&30(``%>+AVP+``#_4"QFQT<"-@!FQT<$``"#Q`3I +M+P(``(/'`(/X0G0/#X\A`@``@_A!#X48`@``9HM'!&;_1P3I"P(``(/'`(/X +M4`^$-P$``'\U@_A%#X7T`0``9HM'!&;_1P1F/04`#X;B`0``5XN';`L``/]0 +M+&;'1P)&`(/$!.G*`0``._^#^&`/A;\!``!FBX=R"P``BI=,"P``_L)FJ2`` +MB)=,"P``#X38````9HN'M`L``&:%P`^$R````(J'3@L``*@!#X2Z````:@$S +MP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP&:+AW`+``"#P!HE__\``%"+ +MAUP+``#_4"!J`"4`#P``B]@SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`2# +MQ!1F@?L``7949L='`D,`_X?8$```9HN'H`L``&8-$`!FB8>@"P``9HN'H@L` +M`&:%P`^%[@```&:+1P)F/3``#X+@````QH>["P```%?H^_?__X/$!.G+```` +M@\8`9HN'H`L``&:%P'1$BH>["P``BM#^PCP>B)>["P``?C!J`#/`9HN'H@L` +M`%`SP&:+AZ`+``!0:@%J`6H'5^B^"0``N.@#``"#Q!Q;7X/$%,,SP#/2BH?! +M#@``BI?"#@``.\)T!OZ'30L``(N'1`L``*D!````C5`!B9=$"P``=$AH%`,` +M`#/`9HN'<`L``(/`%"7__P``4(N'7`L``/]0#(N'1`L``,'H`5`SP&:+AW`+ +M``"#P!@E__\``%"+AUP+``#_4`R#Q!!;N.@#``!?@\04PY"!_P````"!_P`` +M``"#[`A7BWPD$&H/5XN';`L``/]0-(M$)!R#Q`B%P'0Y:@`SP&:+AW`+``"# +MP`@E__\``%"+AUP+``#_4`R#Q`A7Z)L)``"+EV`+``!2BX=<"P``_U`\@\0( +MQX=0"P```````%^#Q`C#D#O_@?\`````@^PT5XM\)#Q64U5FBT<"9CTA`'5R +M:``#`(`SP&:+AW`+``"#P!0E__\``%"+AUP+``#_4`QJ!8U$)"!0,\!FBX=P +M"P``@\`8)?__``!0BX=<"P``_U`PBT0D+&:)ASP+``!FBT0D+F:)ASX+``"+ +M1"0P9HF'0`L``(M$)#AFB8=""P``@\04,\!FBX=`"P``#0```(!0,\!FBX=P +M"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P"P``@\`8)?__``!0BX=<"P`` +M_U`DB_"X_P```&8CQH/$#$B#^`9W;_\DA<0````[_S/`9HN'<`L``(/`&"7_ +M_P``4(N'7`L``/]0)(/$!(O0@_H(#X2;````9L='`A``:@`E__\``,'J$%"! +MXO__``!2:``!``!J`&H!5^AX!P``@\0<ZQ&#QP"#^$9U"5?H93@``(/$!#/` +M9HN'0`L``%`SP&:+AW`+``"#P!0E__\``%"+AUP+``#_4`R!YO__```SP('. +M`(```('F__\``%9FBX=P"P``@\`8)?__``!0BX=<"P``_U`(@\0075M>7X/$ +M-,,SP&:+1P*#^"%T*8/X-G6$9L='`C``5^BH!P``BY=@"P``4HN'7`L``/]0 +M/(/$".EN____9L='`C``:@!J`&H`:@!J`&H!5^BX!@``@\0<Z4[___\SP&:+ +MAW`+``"#P!@E__\``%"+AUP+``#_4"3!Z!!FB40D1#/`9HM'`H/$!(/X,G0[ +M@_A"#X2"````@_A0=`F#^&`/A3`#``"+1"1`9JD`@`^$(@,``&:I``@/A!P" +M``#&AY\+``!DZ2\"``"+1"1`9JD`@'0X9HN'H`L``&8-$`!FB8>@"P``9HN' +MH@L``&:%P'4:9HM'`F8],`!R$,:'NPL```!7Z/7S__^#Q`1FQT<",P#IE?[_ +M_X/'`(M$)$!FJ0"`#X0J`0``9JD`"'0,QH>?"P``9.LB@\<`BT0D0&:I``%T +M"K@0````ZPB#QP"X!````(B'GPL``(M$)$!FJ0`"=`O&AYP+```"ZPD[_\:' +MG`L```%FQT<"4`#'AT0+````````BX<H"P``C8\H"P``B8<P"P``,]*)ARP+ +M``"*A[8+``"(A[<+``"+GR@+``!FB5,$BP&+6R@[V'7S9HN'M`L``&:%P'1/ +M,]NX'P```"*'M@L``(OH9HN'M`L``&:%P'XTB70D$(V'M`L``(OPC41M`,'@ +M`XV$![P+``!05^AX-```18/$"(/E'T,/OP8[V'S<BW0D$%?HKR8``&H`,\"* +MAYP+``!0,\"*AY\+``!0,\!FBX>."P``4&H`:@!7Z,<$``"#Q"#I7?W__X/& +M`&;'1P)#`+@/````9B-$)$"#^`UU,XJ'G@L``(B'GPL``(J'G@L``(3`=5%J +M`&H`:@!H``@``&H`:@)7Z'P$``"#Q!SK-X/&`(J'G0L``(B'GPL``&H`:@!J +M`+C_````9B-$)$P-``<``"7__P``4&H`:@)7Z$,$``"#Q!QFQT<$``#IT_S_ +M_Y"+1"1`9JD``70*N!````#K"(/'`+@$````B(>?"P``BT0D0&:I``)T"\:' +MG`L```+K"3O_QH><"P```6H`,\"*AYP+``!0,\"*AY\+``!0,\!FBX>."P`` +M4&H`:@!7Z-$#``"#Q!SI9_S__Y`SP&:+1P*#^#-T.8/X0W0B@_A0=`6#^&!U +M=FH`:@!J`&@`"```:@!J`U?HF0,``(/$'&;'1P)$`%?H2@(``(/$!.L'D&;' +M1P(T`&:+AZ`+``!F#0!`9HF'H`L``&:+AZ(+``!FA<`/A?K[__]FBT<"9CTP +M``^"[/O__\:'NPL```!7Z#'Q__^#Q`3IU_O__Y!J`(O&)?__``!0,\!FBT<" +M4&H%:@!J!E?H&P,``(/$'.FQ^___@\<`,\!FBX=P"P``@\`8)?__``!0BX=< +M"P``_U`D:@!J`,'H$&H`B]@E__\``%!J`&H#5^C:`@``9HM'`H/$(&8]4``/ +M@F?[__]F]\,+#W0.9L='`D,`Z57[__^#Q@#&AX\0````Z4;[___&ATP+```` +MZ3K[__^!_P````"!_P````"#[`@SP%>+?"005E-FBX<^"P``#0```(!0,\!F +MBX=P"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P"P``@\`8)?__``!0BX=< +M"P``_U`DB_`SP&:+AW`+``"#P!@E__\``%"+AUP+``#_4"0STH/$$&:+EZ(+ +M``"+SH/A?[@!````T^"+V"7__P``.\)T'VH!,\!FB\)0B\,E__\``%!J!6H` +M:@97Z.4!``"#Q!QFQX>B"P````!FBT<"9CTQ`'539L='`C``5^B#`@``BY=@ +M"P``4HN'7`L``/]0/(/$"%M>7X/$",.0B\:#X'^#^`=U"5?HZ"<``(/$!(/F +M?X/^#G0)5^AW[___@\0$6UY?@\0(PY"+QL'H$*D`(```=<AJ`H'C__\``,'N +M$('F__\``%93:@5J`&H&5^A1`0``@\0<6UY?@\0(PX/'`(UT)@"#[!0STC/) +M5XM\)!Q64U6*E\$.``"*A[8+``"(C[D+``"(A[<+```SP(J'P@X``(B/N@L` +M`#O"#X2)````B^^-A6`+``"-M<(.``")1"0<C87"#@``C;W!#@``B40D&(V= +MO`X``(J5P@X``+D?````(LIJ`8T,2<'A`HV$#<0.``")1"08BPB+1"0@48L` +M4(N%7`L``/]01(M$)"2#Q`R*E<(.``#^PH@0,]*+1"049@^V0`1F`P-FB0,S +MP(H&BA<[PG6AB_UFBY>\#@``BH?"#@``9H/Z((B'PPX``'0D)?\```!0,\"* +MA\$.``!0,\!FB\)0:@)J`6H&5^A`````@\0<9L>'O`X``"``,\F(C[X.``"( +MC[\.``"(C\`.``"(C\$.``"(C\,.``"(C\(.``!=6UY?@\04PSO_C70F`(/L +M$%>+1"0<5HMT)!QFB40D"(M$)"0S_XA$)`IFBX:8"P``9HE$)`R+1"0H9HE$ +M)!"+1"0L9HE$)!*+1"0P9HE$)!2+1"0T9HE$)!:+1"0DA,!T+L:&G`L```!F +MBT8"9L=&`C``9CU``+@`````#Y?`:@"+^%:+AFP+``#_4`2#Q`B*AIP+``"( +M1"0+C40D"%"+EF`+``!2BX9<"P``_U`X@\0(A?]T"5;H$@```(/$!%Y?@\00 +MPY`[_X'_`````(/L%#/`,])7BWPD'%9358J7N`L``(J'M@L``#O"#X2'```` +MB^^-A;8+``"-G;8+``")1"0<C86T"P``C;6X"P``C;U@"P``B40D&(J5M@L` +M`+D?````(LIJ`8T,2<'A`XV$#;P+``"+2!11:@%J`(L'4(N%7`L``/]02(M$ +M)#"#Q!2*E;8+``#^PH@0BT0D&&:+E;0+``!F2F:)$#/2,\"*%HH#.\)UHXO] +M9HN'M`L``&:%P'0K,\"*A[H+``!0,\"*A[<+``!0,\!FBX>T"P``4&H#:@%J +M!E?H8O[__X/$'#/)9HF/M`L``(B/M@L``(B/MPL``(B/N`L``%?H_OS__X/$ +M!%U;7E^#Q!3#@\<`5U:+="0,N!\```"+3"00(H;!#@``C01`P>`"C;P&Q`X` +M`(M$)!2)!XI$)!C&1P4`B$<(BH;!#@``_L"(AL$.``!15HN&;`L``/]0((A' +M!(/$"%Y?PX/'`#O_@?\`````QP7\`P``````_X/L#%>_@````%93QT0D%``` +M``!5B_>!YH"`@(`S_HO6P>H/`_\S^O?&@````'0&@?<$P1VWBTPD&+X!```` +MT^:[``$``"O>@?L``0``#XVC````B\.+#)T`````*\:+US/10XD4A0````"! +M^_T```!]78O#BPR=`````"O&B]<ST8D4A0````"+UXO#@\,$*\:-+(4````` +MBP2=]/___S/0B94$````B]<S%)WX____B94(````B]>+#)W\____,]&!^_T` +M``")E0P```!\HX'[``$``'T?B\.+#)T`````*\:+US/10XD4A0````"!^P`! +M``!\X8M4)!A"B50D&(/Z"`^,#/___UU;7E^#Q`S#._^-="8`5U93BT0D&%6+ +M="08BUPD%(/^$(LX#XR2````]\,#````="2+QS/2P>@(BA.!Y_\```!.,]=# +M,P25`````/?#`P```(OX==R+QL'X`H7`C6C_=%>#PP0S>_R+QX'G_P```,'H +M"#,$O0````"+^,'H"('G_P```#,$O0````"+^,'H"('G_P```#,$O0````"+ +M^,'H"('G_P```#,$O0````"+^(O%387`=:F#Y@.+QDZ%P'0BB\<STL'H"(H3 +M@>?_````0S/7,P25`````(OXB\9.A<!UWHM$)!R).%U;7E_#@\<`@?\````` +M@?\`````4(M$)!3'!"0`````5[\!````5HUP_U-5BVPD((7`=%.+5"0<BUPD +M&(U$)!"-2@
^)3"0<C1124,'B`X7VC9P3O`L``'0(,\!FBT,(ZP*+Q2O' +M4(L+`_E7Z+'^__\SP(/$#&:+0P@S_ROHB\9.A<!UK5U;7HM$)`0]./LBA+@` +M````#Y7`7X/$!,.-="8`5U93BT0D%(M,)!"+.(I`#Z@!#X2'````BD<(J(!T +M#;L?````BE<.(MKK`Y`SVXM$)!2-4Q5FBT`*)?__```[PG5=OOK___\SP#/2 +MBH0QB`L``(I4-P@[PG5"1GSJ,\"-?!\.O@8```"*!R7O````/>0```!U*3/` +MBD<!)>\````]Y````'48BD<"/`-U$8M'`ST`!)`'=!#K!3O_@\8&,\!;7E_# +M@\<`6UZX`0```%_#@\<`@?\`````@?\`````5XM\)`Q6BW0D#&:+1PAF/34` +M<S**AGT+```D_(B&?0L``&@``0``5HN&;`L``/]0'&H`:@!J`&H#:@!J!5;H +M+?K__X/$)#/`BQ>*0@$EP````(/X0'595U;HXO[__X/$"(7`=#**AGT+```D +M_(B&?0L``&@``0``5HN&;`L``/]0'&H`:@!J`&H!:@!J!5;HW/G__X/$)(J& +M?0L``*@!=0N*1P^H`W4$QD<.`5Y?PY"*AGT+``"H`G7RZ^R-="8`@^P8,\`S +MTE>+?"0@5E-5BI?##@``BH?"#@``.\(/A((```")?"0@B\<%P@X``(E$)"2+ +M;"0@C3"->`&-6/J*E<(.``"Y'P```"+*C0Q)P>$"C8P-Q`X``&8/MD$$9@,# +M9HD#BT0D)(J5P@X``/["B!"*00B$P'4=,\!FBT$&4(L)48N%8`L``%"+A5P+ +M``#_4$2#Q`PSP#/2B@:*%SO"=9V+?"0@,\`STHJ'M@L``(J7MPL``#O"#X0B +M`0``B7PD$(V'8`L``(E$)""-A[<+``")1"0<C8=R"P``B40D&(O'C9^V"P`` +MC;A]"P``C;"T"P``NA\```"+;"00B@N+1"08(M&-%%+!X@-F]P"``(VL%;P+ +M``!T7(I%#H3`=56+31`SP%%FBT4*4(M$)!B*@+8+```E_P```%"+1"0<4.BL +M_/__@\00A<!T'8M$)!#_@,@0``"*%_;"!'0(QD4.`NL&.__&10X!9HM5"F:# +MZ@1FB54*BD40B@L"P8@#9HL&9BM%$&:)!HH'J`-T#E6+5"044NBH_?__@\0( +M,\"*10Y0BTT448M%$%`SP&:+10I0BT0D,(L0BT0D(%*+@%P+``#_4$B+5"0P +M@\04,\"*$HH#@>+_````.\(/A13___]=6UY?@\08PY`[_X'_`````(M$)`B+ +M5"0$A<"-2/]T"XO!2<8"`$*%P'7UPY"-="8`9HM,)`2+P8'A__\``,'A""7_ +M_P``P?@(@>$`_P``)?\````+P27__P``PY"-="8`5S/`9HM$)`Q0BT0D#/]0 +M'(OX,\!FBT0D$$`E__\``%"+1"00_U`<P>`(9@OXB\<E__\``(/$"%_#@\<` +MC70F`#/`BD0D#%`SP&:+1"0,4(M$)`S_4`0SP&:+1"04P?@()?\```!0,\!F +MBT0D%$`E__\``%"+1"04_U`$@\00PY"+3"0$B]&+P<'J",'H&('B`/\```O" +MB]'!X@C!X1B!X@``_P`+P@O!PX/'`(UT)@!7BWPD"%9FBX=R"P``9JD0`'15 +M,\`STF:+1Q9FBU0D$`/")?__``!0BX=<"P``_U`<B_`SP&:+1Q8STF:+5"04 +MC400`27__P``4(N'7`L``/]0','@"&8+\(O&)?__``"#Q`A>7\,[_S/`,])F +MBT<69HM4)!`#PB7__P``4(N'7`L``/]0("7__P``@\0$7E_#@\<`@?\````` +M@?\`````5XM\)`AFBX=R"P``9JD0`'1:,\`STF:+5"0,BD0D$%`SP&:+1Q8# +MPB7__P``4(N'7`L``/]0!#/`,])FBT0D&,'X"&:+5"04)?\```!0,\!FBT<6 +MC40"`27__P``4(N'7`L``/]0!(/$$%_#,\`STF:+1"004#/`9HM'%F:+5"00 +M`\(E__\``%"+AUP+``#_4`B#Q`A?PY`[_X'_`````%>+?"0(:/\````SP&:+ +M1Q:#P`<E__\``%"+AUP+``#_4`2+1"04@\0(A<!T7C/`9HM'!H/X`G18@_@# +M=4YH_@```#/`9HN'<`L``(/`'27__P``4(N'7`L``/]0!&B`````,\!FBX=P +M"P``@\`?)?__``!0BX=<"P``_U`$:C*+AUP+``#_4#2#Q!1?PX/'`&H',\!F +MBX=P"P``@\`")?__``!0BX=<"P``_U`$:(`````SP&:+AW`+``"#P`,E__\` +M`%"+AUP+``#_4`1J,HN'7`L``/]0-(/$%%_#@\<`BU0D!#/`9HM"%E"+DEP+ +M``!2Z,F-__^#Q`C#D(UT)@!7BWPD"%?HE9#__S/`@\0$BY>4$```BD=8`\*+ +MEZ`0``")AY00```SP(N/G!```(I'6@/!BX^L$```B8><$```,\"*1UL#PHN7 +MJ!```(F'H!```#/`BD=>`\*+E[`0``")AZ@0```SP(I'7P/!BX^\$```B8>L +M$```,\"*1V`#PHN7N!```(F'L!```#/`BD=B`\*+E\`0``")A[@0```SP(I' +M9`/!B8>\$```,\"*1V4#PHF'P!```(J'?@L``(3`="'&AWX+````C8>4$``` +M4(N78`L``%*+AUP+``#_4$"#Q`A?PSO_._^!_P````!FBTPD"(M4)`2+P8'A +M__\``,'A""7__P``P?@(@>$`_P``)?\````+P6:)0A"+1"0,B4(2BT0D$(E" +M:#/`:)````!FBT(6@\`')?__``!0BX)<"P``_U`$@\0(PXUT)@"+5"0$9HM" +M$&:%P'0KQT)L`````&B(````,\!FBT(6@\`')?__``!0BX)<"P``_U`$@\0( +MPX/'`%+HLI/__X/$!,,[_X'_`````('_`````%"+5"0(BT)LA<!T#<=";``` +M``!2_]"#Q`2#Q`3#@\<`BT0D#(M4)`A`4%+_5"0,@\0(A<!U%8M,)`R+1"0( +M45#_5"0,@\0(A<!T";@!````PX/'`#/`PY`[_X'_`````%>+?"0(,\`SR6:+ +M1Q:)3VAFB8^@"P``@\`(B4]L)?__``!0BX=<"P``_U`<@\@()?\```!0,\!F +MBT<6@\`()?__``!0BX=<"P``_U`$9HN'<@L``(/$#&:I`@!T/#/`9HM'%H/` +M"27__P``4(N'7`L``/]0'(/(`27_````4#/`9HM'%H/`"27__P``4(N'7`L` +M`/]0!(/$#%?HH;'__V;'1P)!`&;'1P0``(/$!%_#BU0D"(M,)`124>A!_/__ +MBT0D#&;'0`(A`(/$",.#QP!0BT0D"%=64XU8'%6+;"0<9C/_,_:+Q27__P`` +M4/\3P?@$@>?__P``P><$@\0$"_A&@_X$?-^^_/___XM,)""+QXO1)?__``"! +MXO__```[PG0NB\>!Y___``#!_P0E__\``,'@#`O'1HOX?-.^!````#/`75M> +M7X/$!,.0ZP4[_X/&!%U;7K@!````7X/$!,-3,\!FBT0D#%"+1"0,_U`<,](E +M_@```(H5``````O",]**5"04"\**V#/`BL-0,\!FBT0D%%"+1"04_U`$N`$` +M```BPX/$#*(`````6\,[_U,SP&:+1"0,4(M$)`S_4!PSTB7^````BA4````` +M"\(STHI4)!3WTH'B_P```"/"BM@SP(K#4#/`9HM$)!10BT0D%/]0!+@!```` +M(L.#Q`RB`````%O#._\[_X'_`````#/`9HM$)`A0BT0D"/]0'(/@`8/$!,,[ +M_SO_@?\`````@^P85U9356@VE```BT0D-"7__P``BU0D,(/`'B7__P``4%+H +M>/[__X/$#(7`=!U=6UZX`P```%^#Q!C#N`(```!=6UY?@\08PX/'`&A&D@`` +MBT0D-"7__P``BTPD,(/``B7__P``4%'H,_[__X/$#(7`=<B+1"0P)?__``"# +MP`-FB40D("7__P``4(M$)##_4!S&1"0I!XK8B$0D*XM$)#"+="0D@\`$B40D +M'(UX&#/`BL.#X+^)1"08@\0$,\`STHI4)"6*PS/")?\```!0B\8E__\``%"+ +M1"0@_Q!J8?\7B\8E__\``%#_%S/2@\00BE0D)3/"BU0D%(K8,\"*PX/@OSO0 +M=3'^3"0E=;`SP(I$)"=0BT0D)"7__P``4(M$)#3_4`2#Q`BX`0```%U;7E^# +MQ!C#@\<`,\"*1"0G4(M$)"0E__\``%"+1"0T_U`$BT0D."7__P``@\`")?__ +M``!0BT0D./]0'(K8,\"(7"0SN3\````BV8A,)#&(7"0RBL-0BT0D0"7__P`` +M@\`")?__``!0BT0D0/]0!(M\)$2+1"1`@>?__P``@\<"C7`<@\`$B40D+(/$ +M%#/`,]**5"0EBL,SPB7_````4(O')?__``!0BT0D(/\0:F'_%HO')?__``!0 +M_Q8STH/$$(I4)"4SPC/2BM@SP(I$)":*TSO"#X6I````_DPD)76M,\"*1"0G +M4(M$)#0E__\``(/``B7__P``4(M$)#3_4`2+1"0H)?__``!0BT0D./]0'(K0 +MBT0D.+_V____@\0,C7`<B5PD$(O:BVPD((O%)?__``!0_Q8STH/$!(K3.\)U +M,D=\Z(M<)!"_"@```/;#!G4-75M>N`D```!?@\08P_;#!'1"75M>,\!?@\08 +MPY#K!3O_@\<*75M>N&,```!?@\08PS/`BD0D)U"+1"0T)?__``"#P`(E__\` +M`%"+1"0T_U`$@\0(BT0D,"7__P``0&:)1"0B)?__``!0BT0D,/]0',9$)"D' +MBMB+1"0P9HML)":(7"0KC7@<C7`$,\"*PX/@OXE$)!R#Q`0SP#/2BE0D)8K# +M,\(E_P```%"+Q27__P``4/\6:F'_%XO%)?__``!0_Q>*5"0U@\00BMB+PS+" +MBU0D&(K8,\"*PX/@OSO0#X7I````_DPD)76N,\"*1"0G4#/`9HM$)"90BT0D +M-/]0!+_X____BT0D-&:+;"0JBEPD+XA<)"Z-<!R#P`2)1"0@@\0(BD0D)C1` +MB$0D)C/`BL.#\$`E_P```%"+Q27__P``4(M$)"#_$&IA_Q:+Q27__P``4/\6 +MBMB#Q!`SP#/2BD0D)HK3.\)U-$=\MS/`OP@```"*1"0G4#/`9HM$)"90BT0D +M-/]0!(/$"+@'````75M>7X/$&,,[_^L%._^#QP@SP(I$)"<EOP```%`SP&:+ +M1"0F4(M$)#3_4`2#Q`BX!0```%U;7E^#Q!C#._\SP(I$)"=0,\!FBT0D)E"+ +M1"0T_U`$@\0(N&,```!=6UY?@\08PSO_@?\`````@?\`````@^P(,\!75HMT +M)!1FBT86@\`()?__``!0BX9<"P``_U`@@\0$B_AF]\=``0^%%@$``&B````` +M,\!FBT86@\`()?__``!0BX9<"P``_U`$:"P!``"+AEP+``#_4#0SP&:+1A:# +MP`@E__\``%"+AEP+``#_4!RZ`P```(/@9&8CUPO0,\"*PE`SP&:+1A:#P`@E +M__\``%"+AEP+``#_4`0SP&:+1A:#P!4E__\``%"+AEP+``#_4!PE_P```%`S +MP&:+1A:#P!4E__\``%"+AEP+``#_4`0SP&:+1A:#P!`E__\``%"+AEP+``#_ +M4""#Q"@E"`$``#T(`0``=4R_Z/___S/`9HM&%H/`'"7__P``4(N&7`L``/]0 +M)#/`9HM&%H/`$"7__P``4(N&7`L``/]0((/$"*D``0``=`I'?,._&````.L# +M@\<8,\!FBX9P"P``@\`2)?__``!0BX9<"P``_U`<@^`_4#/`9HN&<`L``(/` +M$B7__P``4(N&7`L``/]0!(/$#%Y?@\0(PSO_C70F`(/L%#/`5XM\)!Q64U5F +MBT<6@\`5)?__``!0BX=<"P``_U`<@\0$BMCVPT`/A6<!```SP&:+1Q:#P!`E +M__\``%"+AUP+``#_4""#Q`2+\&:I``$/A#,!```SP&:+1Q:#P!@E__\``%"+ +MAUP+``#_4"0SP&:+1Q:#P!@E__\``%"+AUP+``#_4"0SP&:+1Q:#P!@E__\` +M`%"+AUP+``#_4"0SP&:+1Q:#P!@E__\``%"+AUP+``#_4"0SP&:+1Q:#P!@E +M__\``%"+AUP+``#_4"0SP&:+1Q:#P!@E__\``%"+AUP+``#_4"2#Q!B+Z&;W +MQ@@`=72^XO___S/`9HM'%H/`$"7__P``4(N'7`L``/]0)(/$!"4(`0``/0`! +M``!U:#/`9HM'%H/`&"7__P``4(N'7`L``/]0)(/$!#O%=4E&?+<SP+X>```` +M9HM'%H/`%27__P``4(N'7`L``/]0'(K8@\0$ZS([_V:+AW(+``!FJ0`(=2,[ +M_7<2C8?L$```.\5S%>L&@\<`@\8>,\!=6UY?@\04PX/'`#/`BL-0,\!FBT<6 +M@\`5)?__``!0BX=<"P``_U`$@\0(N`$```!=6UY?@\04PX/'`#O_@?\````` +M@^PD,\!7BWPD+%935<9'&P!FBT<6@\`0)?__``!0BX=<"P``_U`<B$0D-S/` +M9HM'%H/`#B7__P``4(N'7`L``/]0((OP,\!FBT<6@\`8)?__``!0BX=<"P`` +M_U`DB]B#Q`R*1"0SJ`@/A7H!```SP(I$)#/!^`2#X`.(1"0QBH=X"P``BE0D +M,830#X00`0``@\,$BT/\B40D)#/`BL+WV(/@`V:)1"0J)?__``"#^`%T:H/X +M`@^$E0```(/X`P^%NP```#/`,])FBT<6BE0D,8U$$!\E__\``%"+AUP+``#_ +M4!R*R(M$)"C!Z`@STHK1P>(8"\(STE`SP&:+1Q:*5"0YC400'"7__P``4(N' +M7`L``/]0#(/$#.ME._^+1"0D,]+!Z!@E_P```%`SP&:+1Q:*5"0UC400'"7_ +M_P``4(N'7`L``/]0!(/$".LR@\<`BT0D)#/2P>@0)?__``!0,\!FBT<6BE0D +M-8U$$!PE__\``%"+AUP+``#_4`B#Q`@STHO&9HM4)"HE__\``#O"?`=F*_+K +M!3O_9C/VQD0D,0`SP(I$)#&#P`-F`_!F]\;\_W0L@>;__P``,\#!_@*!YO__ +M``!64V:+1Q:#P!PE__\``%"+AUP+``#_4!B#Q`Q=6UY?@\0DPY`SP(I$)#/! +M^`2#X`,+V&:%]G4-9L=$)"@!`.G=````D&;'1"0H``"+TXO&@>+__P``)?__ +M``#WVH/B`X/"7#O"#X^V````:F&+AUP+``#_4!QJ88N'7`L``/]0'#/`9HM' +M%H/`#B7__P``4(N'7`L``/]0((O()?__``"#Q`R+UH'B__\``#O"='*)7"00 +MB]F]^/___V:%VW16:F&+AUP+``#_4!QJ88N'7`L``/]0'&IABX=<"P``_U`< +M:F&+AUP+``#_4!PSP&:+1Q:#P`XE__\``%"+AUP+``#_4""#Q!1%B]A\K[T( +M````ZP:#QP"#Q0AF_T0D*(M<)!"+1"0H9H7`#X2"````,\!FBT<6@\`$)?__ +M``!0BX=<"P``_U`@B^@SP&@0`0``9HM'%H/`!"7__P``4(N'7`L``/]0"#/` +M9HM'%E"+AUP+``#_4""+R(O#]]AF`\@SP('E__\``+K_````58'F`/\``&:+ +M1Q9F(]&#P`0+\B7__P``4(N'7`L``/]0"(/$&/?#`P```'1-,\!FBT<6@\`< +M)?__``!0BX=<"P``_U`DB40D*(/$!(O#N@,```"#X`.-;"0D9B/3`^B#^@1T +M%KD$````14-F3HI%_XA#_W0%0CO1=>]F]\;\_W0LB\8E__\``,'X`B7__P`` +M4#/`4V:+1Q:#P!PE__\``%"+AUP+``#_4#"#Q`R+QB7\_P```]AF]\8#``^$ +MT/W__S/`9HM'%H/`'"7__P``4(N'7`L``/]0)(E$)"B#Q`0STF;WQ@,`C40D +M)`^.H/W__XUH`;\#````9B/^0HH`B50D'(UW_8@#0SO6?2NY!````(I%`$6( +M`T.*10!%B`-#BD4`18@#0XI%``/118@#0SO6?-Z)5"0<BU0D'#O7#XU-_?__ +MBTPD'(I%`$5!B`.)3"0<0SO/?.Q=6UY?@\0DPSO_:,`````SP(M4)`AFBT(6 +M@\`4)?__``!0BX)<"P``_U`$@\0(PX/'`#O_@?\`````5XM\)`A6BH=\"P`` +MA,!U'6H`,\!FBT<6@\`4)?__``!0BX=<"P``_U`$@\0(,\`S]F:+1Q:#P`8E +M__\``%"+AUP+``#_4""#Q`2I@````'035^A)DO__@\@!@\0$B_#K)8/&`(I' +M&X3`=0U7Z-_X__^#Q`2%P'0.5^BB^O__O@$```"#Q`2*AWP+``"$P'4@:,`` +M```SP&:+1Q:#P!0E__\``%"+AUP+``#_4`2#Q`B+QEY?PX/'`#O_@?\````` +M:,`````SP(M4)`AFBT(6@\`4)?__``!0BX)<"P``_U`$@\0(PX/'`#O_@?\` +M````5XM\)`AJ`#/`9HN'<`L``(/`+B7__P``4(N'7`L``/]0!&@```"`,\!F +MBX=P"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P"P``@\`8)?__``!0BX=< +M"P``_U`D,\!FBX=P"P``@\`4)?__``!0BX=<"P``_U`D@\08/00``("X```` +M``^4P%_#._^-="8`5XM\)!!6,_93BUPD$%6+;"08B\='4%7_TX/$"(7`=`RX +M`0```%U;7E_#._]&@_X$?.!=6UXSP%_#@\<`C70F`(/L)%=64U6+1"0XBI!. +M"P``@.+(B)!."P``9HN0<@L``&;WPH``=$"+@!0+```STHE$)##WV(/@!XE$ +M)"2+1"0XBTPD)(N`$`L``(E$)"R+1"0XBX`8"P``*\&Y+````/?QB40D(.LM +MQT0D("````"+1"0XBX!D"P``@\`(B40D,/?8@^`'B40D)(M$)#B#P`B)1"0L +MBU0D,#/VBWPD)`/7B50D,(M4)"`[U@^.X````(E\)!"+1"0XC7K_BU0D,(ET +M)!2-L'(+``"+;"0DBTPD+`/I,]N-7!,0BTPD$(M$)"P#R&;W!H``=!EFQT$& +M``!FQT$$`(!FQP$0`(E9".L3@\<`,])FB5$&9HD1B5$(9HE1!(M4)!"+1"04 +M@\(L.\>)5"00=15FQT$"``"+5"0PB6DH@\H#B5$,ZSV+5"040HT$4HT4U0`` +M```#T,'B`HM$)#`#T(E1#&;W!H``=0:#R@.)40QFQT$"``"+5"00BT0D+`/0 +MB5$H@\,LBTPD%$&+1"0@B4PD%#O(#XQ)____BUPD)(M$)#B+5"0L,_8#VHM, +M)"")F"@+```[SHM#*(M`*(M`*(M`*(MX*'YZB5\@BT,HBV\H1HE8)(UY_8M; +M*#OW?4.)72"+;2B+0RB#Q@0[]XE8)(M;*(E=((MM*(M#*(E8)(M;*(E=((MM +M*(M#*(E8)(M;*(E=((M#*(MM*(E8)(M;*'R]BT0D(#OP?1B)72"+0RB+;2A& +MB5@DBU0D((M;*#OR?.B+1"0XBU0D,(F0-`L``&:+@'(+``!FJ8``=`4S_^L& +MD+^`!0``,_:+1"0XBXAD"P``BT0D.(U,.0@#^(O9]]F#X0<#V8U\#PB)?"0H +M,_^)7"0P,\F#QRR+5"0H@_X?C6PZU&:)30*)30AFB4T`B5T<9HE-!'469HE- +M!HM4)#"#R@.)50R+5"0HZQH[_V:)30:+1"0PC10XBT0D*(/*`XE5#(T4.(/# +M+$:)52B#_B!\I(M<)"B+1"0XON#___^)F!P+``"+0RB+0"B+0"B+0"B+>"B) +M7R"+?RB+0RB#Q@2)6"2+6RB)7R"+?RB+0RB)6"2+6RB)7R"+?RB+0RB)6"2+ +M6RB)7R"+0RB+?RB)6"2+6RA\OXM$)#B^(````(M4)#")D#@+``"*D$X+``"` +MR@B+B!P+``")B"0+``")B"`+``"(D$X+``!=6UY?@\0DPY`[_X'_`````(/L +M2#/`5XM\)%!FBX<\"P``#0```(!0,\!FBX=P"P``@\`4)?__``!0BX=<"P`` +M_U`,:A&-1"004#/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0,(M$)!R#Q!2( +MA]P0``"*1"0)B(?=$```BD0D"HB'WA```(I$)`N(A]\0``"+1"0,B(?@$``` +MBD0D#8B'X1```(M$)#!FB8?B$```9HM$)"IFJ0!`=$^*1"0ZB(?D$```BD0D +M.XB'Y1```(M$)#R(A^80``"*1"0]B(?G$```BD0D/HB'Z!```(I$)#^(A^D0 +M``!FBT0D*F:)AXX+``!?@\1(PSO_,\F(C^00``"(C^40``"(C^80``"(C^<0 +M``"(C^@0``"(C^D0``#KQ5>+?"0(:APSP&:+AW`+``"#P!@E__\``%"+AUP+ +M``#_4`PSP&:+1P90,\!FBX>:"P``4#/`BH>?"P``4(N';`L``/]0,%`SP&:+ +MAW`+``"#P!@E__\``%"+AUP+``#_4`R+EX(+```SP%)FBX=P"P``@\`8)?__ +M``!0BX=<"P``_U`,,](SP&:+EY@+``!FBX>&"P``@\($P>(0"\)0,\!FBX=P +M"P``@\`8)?__``!0BX=<"P``_U`,:```#P`SP&:+AW`+``"#P!@E__\``%"+ +MAUP+``#_4`PSP&:+AW`+``"#P"@E__\``%"+AUP+``#_4"`E\/```%`SP&:+ +MAW`+``"#P!@E__\``%"+AUP+``#_4`R#Q$!?PSO_C70F`(/L"#/`5XM\)!!6 +M4VHJ9HN'<`L``(/`&"7__P``4(N'7`L``/]0##/V@\0(9HNWB`L``(J'GPL` +M`,'F$#P$=`.#SA`SVXJ??0L``/?#`@```'0#@\X$]\,!````=`.#S@(SVV:+ +MGYH+``#WPT````!T!H'.``0``/?#(````'0&@<X`@```5C/`9HN'<`L``(/` +M&"7__P``4(N'7`L``/]0#(N7B@L``#/`4F:+AW`+``"#P!@E__\``%"+AUP+ +M``#_4`R+CY`+```SP%%FBX=P"P``@\`8)?__``!0BX=<"P``_U`,BX>4"P`` +M4#/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0##/V@\0@BY8`````,\!29HN' +M<`L``(/`&"7__P``4(N'7`L``/]0#(/$"(/&!(/^$GS39L='`D(`6UY?@\0( +MPY`[_X'_`````&H(,\"+5"0(9HN"<`L``(/`&"7__P``4(N"7`L``/]0#(/$ +M",.#QP`[_X'_`````&H(,\"+5"0(9HN"<`L``(/`&"7__P``4(N"7`L``/]0 +M#(/$",.#QP`[_X'_`````%>+?"0(:@HSP&:+AW`+``"#P!@E__\``%"+AUP+ +M``#_4`R+EY0+```SP%)FBX=P"P``@\`8)?__``!0BX=<"P``_U`,@\007\.# +MQP"-="8`5XM\)`AJ"C/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0#(N7D`L` +M`#/`4F:+AW`+``"#P!@E__\``%"+AUP+``#_4`R#Q!!?PX/'`(UT)@!75HMT +M)`PSP&:+AG`+``"#P!@E__\``%"+AEP+``#_4"2+^"7_````BY:4$```BXZ8 +M$````\*+EIP0``")AI00``"+Q\'H""7_`````\&)AI@0``"+Q\'H$,'O&"7_ +M`````\*+EJ`0``")AIP0```SP&:+AG`+``"!Y_\````#^H/`&(F^H!```"7_ +M_P``4(N&7`L``/]0)(OX)?\```"+CJ00``"+EJ@0```#P8N.L!```(F&I!`` +M`(O'P>@()?\````#PHN6K!```(F&J!```(O'P>@0P>\8)?\````#PH'G_P`` +M`(F&K!```#/`9HN&<`L```/Y@\`8B;ZP$```)?__``!0BX9<"P``_U`DB_@E +M_P```,'O"(N6M!````/"BY:X$```@>?_````B8:T$````_J)OK@0``!6Z"_Z +M__^#Q!"*AGX+``"$P'0AQH9^"P```(V&E!```%"+CF`+``!1BX9<"P``_U!` +M@\0(7E_#._^!_P````"!_P````!J$C/`BU0D"&:+@G`+``"#P!@E__\``%"+ +M@EP+``#_4`R#Q`C#@\<`._^!_P````!7BWPD"&H*,\!FBX=P"P``@\`8)?__ +M``!0BX=<"P``_U`,@\0(BH>?"P``N@`!```\!'0$9H/*$#/)BH]]"P``]\$" +M````=`1F@\H$]\$!````=`1F@\H"@>+__P``,\!29HN'<`L``(/`&"7__P`` +M4(N'7`L``/]0"(/$"%_#D&H(,\"+5"0(9HN"<`L``(/`&"7__P``4(N"7`L` +M`/]0#(/$",.#QP`[_X'_`````&:+1"0(BU0D!&8+@J`+``!FB8*@"P``9HN" +MH@L``&:%P'4:9HM"`F8],`!R$,:"NPL```!2Z`;%__^#Q`3#._]7BWPD"%?H +MQ=?__XN78`L``%*+AUP+``#_4#R#Q`A?PU>+?"0(4S+;#[Z'3@L``*F````` +M="NI!````'03BH=."P``#""(ATX+``#K%(/&`(J'3@L``"1?@,L$B(=."P`` +MBH=."P``J$!T-*@"=`T,$(B'3@L``.LF@\8`BH=."P``)*^(ATX+``"*AW@+ +M``"H`G0(@,L!ZP:#QP"`RP*$VW0C,\"*PU`SP&:+AW`+``"#P"@E__\``%"+ +MAUP+``#_4`2#Q`@SP(J73PL``(K#]]`BPHB'3PL``%M?PX/'`(/L(%=64U5F +MQT0D+@@`QT0D*``````S]HM$)#2+N"0+``"+1"0XB7PD)&:+`&:%P`^$S@`` +M`(M$)#@SR8U8!&:+0PB)7"0<9H7`#X28````,\!!9HM#"(/`!F8!1"0NBT0D +M%(E$)!"+1"08B40D%(E<)!AFBT,(9HD'BP.)1PAFBT<&9B4``6:)1P:+1"0D +MB4<8._AU.F:+1P9F#0`$9HE'!HM$)#1FBX":"P``9JD0`'0,9HM'!F8-`$!F +MB4<&9HM'!F8-`#AFB4<&ZQ:#Q@!FQT<$`("+1R2#P`R+$(/B_(D0B^^+?RB# +MPPR+1"0X1F:+`"7__P``._`/C#____^)3"0H,]LSP&:+70!FBT4(`\.#X`-F +MB_"+QB7__P``.\-^`V:+\S/`BU0D-&:+1"0NBY)4"P``P>(".\(/AOX"``!F +M@_X##X/T`@``9H7V#X3K`@``@_L$?F)FBU4`BT0D&&:#Z@1FB54`BU4,@^+\ +MB54,BU0D&(OO9L<'!`"+0`1FBU((@>+__P``BT00_&;'1P0`@(E'%(M$)"2) +M1QB+5"0H9HM'!F8E``%"9HE'!HE4)"CI?@(``(/'`(/[`GY/BT0D&&:+0`AF +M/0,`=2V+3"08BU0D&(M)!(M2!&:+$HI)`H'A_P```('B__\``,'A$`O1B544 +MZ3L"``"+5"08BU($BQ*)513I*@(``(/'`(M%)&:+,(O6@>+__P```]J+^X/_ +M!'YMC5;^9HD0BT0D&&:+50"#P@)FB54`9HM`"&8]`0!U$HM$)!B+0`2*`"7_ +M````ZQ$[_XM$)!B+0`1FBP`E__\``(M,)!2+5"04P>`09HM)"(M2!('A__\` +M`&:+5`K^@>+__P``"]")513IHP$``(/_`@^.QP```(O]BVTDBTPD*(M$)!A) +MBU4,@\H#B4PD*(E5#&:+0`AF/0$`=1:+1"08BT`$B@B!X?\```"+\>L/@\<` +MBT0D&#/VBT`$9HLPBT0D%&:+0`AF/0$`=1K!Y@B+5"04BU($BA*!XO\````+ +MUHE5%.M'D(M$)!1FBT`(9CT"`'4:P>80BU0D%(M2!&:+$H'B__\```O6B544 +MZQXSR8M$)!3!YA@STHM`!&:+$(I(`L'A$`O1"]:)511FBP]F`TT`9HE-`.G5 +M````._^+1"04BU0D&(MM)(M`!(M2!(H(BA*!X?\```"+1"0H@>+_````2(E$ +M)"B+123!X@B+\0ORBU4,@\H#B54,9H,X`G8]BTPD$(M4)!#!YA"+121FBTD( +MBU($@>'__P``9HM4"OZ!XO__```+\HEU%&:+$&:#Z@)FB1!FQT4`!`#K4XM4 +M)"B+;21*B50D*(M5#(/*`V:#?0`!B54,=13!Y@B+3"00BTD$B@F!X?\```#K +M$\'F$(M,)!"+201FBPF!X?__``!FBU4`"_&#P@*)=11FB54`BU4<@\(4B54( +MQD40`(M$)#1FBX!R"P``9JF``'17BU4,BTPD*(/B_(E5#&:+509F@<H``F:) +M50:+;2B+5"0<9L=%``$`BQ)FQT4$`(")50AFBU4&9H'B``%FB54&9H'*@$9! +M9HE5!HM4)"2)51B)3"0HZPZ09HM5!F:!RH`"9HE5!HM5*(M$)#2)D"0+``"+ +M1"0D9L=`!`"`BU4,@\H#B54,BT`D@\`,BQ"#XOR)$(M$)#2*D$X+``#VP@AT +M=X#B]XB03@L``(N0.`L``%**@'@+``"H`G0)N#@```#K!SO_N#0```"+5"0X +M9HN2<`L``('B__\```/0BT0D.('B__\``%*+@%P+``#_4`R#Q`B+1"0T9HN0 +MO`X``&8K5"0H9HF0O`X``%U;7HM$)!Q?@\0@PSO_BT0D-(J03@L``(#*0(B0 +M3@L``(M$)"2+0"!FBT`$9JD`@'6WBTPD-%'HIOG__X/$!.NHD%>+?"0,5HMT +M)`PSR5-FB4\*B4\0B$\.9HN&<@L``&:I@`!T*&;'1PP``&:+1@)F/5``#X6$ +M````BYXH"P``C;XH"P``Z8D```"#Q@!FBT<(BYXP"P``9HD#BT<$9L=#!`"` +MB4,(BT,,@\@#B4,,BT,D@\`,BQ"#XOR)$(M#*(F&,`L``&:+1@)F/5``=&UF +MBT8"9CU@`'4DBH9."P``#("(ADX+``"+0R!FBT`$9JD`@'4)5NCG^/__@\0$ +M6UY?PV;'0P(``(M##(/@_(E##(M;*&;'0P8``&;'0P0`@&;'`Q``BU,HBP<[ +MT'749L=#`@``BT,,@\@#B4,,BXXT"P``,\!19HN&<`L``(/`/"7__P``4(N& +M7`L``/]0#&;'1@)@`(J&3@L```P$@\0(B(9."P``6UY?PSO_@?\`````5XM\ +M)`@SP&:+AT(+``!0,\!FBX=P"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P +M"P``@\`8)?__``!0BX=<"P``_U`D)?__``"#Q`Q?PY!7BWPD"#/)9L='`D$` +M9HF/H@L``(J'G0L``(B'GPL``#/`9L>'H`L```X`9HE/!%%FBX=P"P``@\`N +M)?__``!0BX=<"P``_U`$5^BAO/__@\0,7\.!_P````"!_P````"#["`STE>+ +M?"0H5E-5B50D&`^_A[0+``")5"00B40D'(7`=#F*C[<+``"!X?\```"+P8/@ +M'XT$0,'@`XVL![P+```#31")3"0@@^$?C01)P>`#C80'O`L``(E$)"B+MRP+ +M``!FBT8$9JD`0`^$Y`(``(V?3@L``(M$)!R%P`^$7`$``(M4)"B+1"0H,\EF +MBU(,9HM`"('B__\``&:+#B7__P```]$[P@^-]P```&:+AYH+``!FJ0(`=$J+ +M1"0HBU0D*,9%#@-FBT`(9HM2#"7__P``@>+__P``*\(/A/,```!0BT0D+#/2 +M9HM0#(L(`]&-1A!24.C\____@\0,Z=(````[_XM$)!R+51!"2(E$)!R%P(E5 +M$'\,QD4.`>FS````@\<`BT0D*(M4)"AFBT`(9HM2#"7__P``@>+__P``*\)0 +MB40D*(M$)"R+"`/1C4804E#H_/___XM$)"R+3"0P0#/2B40D+(/@'V:+%BO1 +MC01`P>`#C4P.$(V$![P+``")1"0T9HE0#('B__\``%*+1"0XBP!04>C\____ +M@\08ZS.#QP`SP#/29HL&4(M$)"QFBU`,BP@#T8U&$%)0Z/S___]FBPZ+1"0T +M9@-(#(/$#&:)2`QFBPYF`TT*9HE-"HH#)/Z(`V:+1@1FJ8`9=$V+1"0<A<!T +M%8J'?0L``*@$=`?&10X"ZP60QD4.`6:+1@1FJ8``=`;_A\P0``!FBT8$9JD` +M`70&_X?($```9HM&!&:I`!!T!O^'Q!```&:+1@1FJ0`"#X2S````BTPD$(M$ +M)!Q!A<")3"00#X2>````,])FBU8&@>(`\```P?H(B%4/9HM&!F:I``)T!H#* +M`HA5#V:+1@9FJ0#P=`F*50^`R@&(50]FBT8&9JD0`'0)BE4/@,H$B%4/BU40 +MBT0D'$)(B540B40D'(I%$(J7MPL```+"B(>W"P``N!\````BA[<+``"-!$#! +MX`.-K`>\"P``BT0D($")1"0@@^`?C01`P>`#C80'O`L``(E$)"AFQT8$`(!F +MQP80`(M&#(/(`XE&#(M&)(/`#(L0@^+\B1"+1B!FBT`$9JD`@'0$_T0D&(H3 +MBW8H]L($=`Z`XOOVPB"($W0$_T0D&&:+1@1FJ0!`#X4B_?__BT0D&(FW+`L` +M`(7`=`E7Z$?T__^#Q`1=6UZ+1"0$7X/$(,,[_X'_`````(/L#+@?````5U93 +MBUPD',=$)!0`````58NS+`L``"*#MPL``(T$0,'@`XV\`[P+``!FBT8$9JD` +M0`^$00$``(ONC;.W"P``B5PD%('#3@L``/]'$(H#)/Z(`V:+101FJ8`9=%2+ +M1"04BH!]"P``J`1T!L9'#@+K!,9'#@%FBT4$9JF``'0*BT0D%/^`S!```&:+ +M101FJ0`!=`J+1"04_X#($```9HM%!&:I`!!T"HM$)!3_@,00``!FBT4`9@-' +M"F:)1PIFBT4$9JD``G1SBA:*1Q`"PHM,)!B(!C/`9HM%!D$E`/```(E,)!C! +M^`B(1P]FBU4&9O?"``)T!0P"B$</9HM%!F:I`/!T"(I'#PP!B$</9HM%!F:I +M$`!T"(I'#PP$B$</BWPD%+D?````(H^W"P``C0Q)P>$#C;P/O`L``&:+501F +M@>+_OV:)502*`Z@$BVTH=!4D^Z@@B`-T#8M4)!12Z,?R__^#Q`1FBT4$9JD` +M0`^%U_[__XOUBUPD%(FS+`L``%U;7HM$)`Q?@\0,PSO_@?\`````@?\````` +M@^PPN!\```!7BWPD.%9358NO(`L``,=$)#P`````(H?##@``C01`P>`"C80' +MQ`X``(E$)#AFBT4$9JD`0'4-BT4H9HM`!&:I`$!T"+@!````ZP.0,\"%P`^$ +M;`$``(V'3@L``(V?(`L``(VW30L``(E$)!R+AR`+``!FBT`$9JD`0'4&_X?4 +M$```Q@8`BX<@"P``9HM`!&:I`"`/A#<!``#_A]`0``"+1"0XQD`%`(N'(`L` +M`(MP&(DSBT8<,]N)1"0T,\!FBX=P"P``@\`I)?__``!0BX=<"P``_U`<B^B* +MAW@+``"#Q`2H`G0'N`$```#K!;@"````A>AU8(V/<`L``(V'>`L``(ET)!2+ +M\8E\)!"-EUP+``")1"0HB_HSP$-FBP:#P"DE__\``%"+!_]0'(OHBT0D+(/$ +M!(H(]L$"=`FX`0```.L'._^X`@```(7H=,J+="04BWPD$#/;BT0D.(I`!(3` +M=!R+3"0XN@"```"#P01FB58$,\!#B@&+=B@[V'SPBT0D-%"*AW@+``"H`G0' +MN#@```#K!;@T````,])FBY=P"P```]"!XO__``!2BX=<"P``_U`,BT0D)(H0 +M@,H"@\0(B!!=6UZ+1"0P7X/$,,,[_XM$)!R*$/;"`G03@.+]]L(0B!!T"5?H +MG?#__X/$!(M$)#B*4`7^PHA0!3/`BL*+5"0XBE($@>+_````.\)U*_Z'PPX` +M`+@?````(H?##@``C01`P>`"C80'Q`X``(E$)#B+1"0\0(E$)#R+AR`+``!F +MQT`$``"+AR`+``"+0"B)`XNO(`L``&:+101FJ0!`=1>+12AFBT`$9JD`0+@` +M````#Y3`ZP0[_S/`A<`/A.K]___I.____Y"#[`A7BWPD$%93QT0D$``````S +MVV8YGT@+``!T$V:+MT@+``!FB9]("P``ZR.#QP`SP&:+AW`+``"#P!`E__\` +M`%"+AUP+``#_4""+\(/$!&;WQO]N=15;7C/`7X/$",.X`@```%M>7X/$",-F +MBT<"9CU@`'4E9HN'<@L``&:I@`!T#5?HQ_?__XO8@\0$ZPM7Z#K[__^+V(/$ +M!&;WQ@@`=`E7Z+C#__^#Q`1F]\8@`'0SBH=X"P``J`)T"+@!````ZP:0N`(` +M``"#R`2(AT\+``"*ATX+``"HP'0)5^@>[___@\0$9HM'`F8]4`!R#5?H>_S_ +M_XE$)!2#Q`1F]\8`('0)5^@WO?__@\0$9O?&`0!T?0^_A[0+```[PWX89HM' +M`F8]8`!U#HJ'3@L```P!B(=."P``:@$SP&:+AW`+``"#P"XE__\``%"+AUP+ +M``#_4`1J`#/`9HN'<`L``(/`&B7__P``4(N'7`L``/]0"&H`,\!FBX=P"P`` +M@\`N)?__``!0BX=<"P``_U`$@\08A=L/A<C^__^+1"00A<`/A;S^__];7E^X +M`0```(/$",-7BWPD"&:+AT@+``!FA<!U*C/`9HN'<`L``(/`$"7__P``4(N' +M7`L``/]0((/$!&:%P&:)AT@+``!T";@!````7\,[_S/`7\,[_X'_`````&H` +M,\"+5"0(9HN"<`L``(/`""7__P``4(N"7`L``/]0##/`@\0(PY`[_X'_```` +M`(/L#%>+?"045E.*1P2H"'0C,\"+-XI'!(/@]XA'!(K8,\"*PU`SP&:+1@10 +MBP;_4`2#Q`B+%U+H1!@``(L/4>@\&```BS<SP(/$"&:+1@10BP;_4!PE_P`` +M`(/$!(I?!(A$)!<SP(#+`8LWB%\$BL-0,\!FBT8$4(L&_U`$BP>#Q`A0Z/@7 +M``"+%U+H\!<``(L/@\0(4>CE%P``,\"+-XI?!(/$!(#C_HA?!(K#4#/`9HM& +M!%"+!O]0!(L'@\0(4.B[%P``BQ=2Z+,7``"*1"0?@\0(J(!T"+@!````ZP.0 +M,\!;7B7_````7X/$#,,[_X/L&%>+?"0@5E/&1"0C`(M$)"R+-R7_````P?@( +MBM@SP(I'!(/@]XA'!(K0,\"*PE`SP&:+1@10BP;_4`0SP(LWBE<$@\0(@,H! +MB%<$BL)0,\!FBT8$4(L&_U`$BQ>#Q`A2Z"D7``"+#U'H(1<``(L'@\0(4.@6 +M%P``,\"+-XI'!(/$!(/("(A'!(K0,\"*PE`SP&:+1@10BP;_4`2+%X/$"%+H +MZ!8``#/`BS>*5P2#Q`2`XOZ(5P2*PE`SP&:+1@10BP;_4`2+#X/$"%'HOA8` +M`(L'4.BV%@``N`<```"#Q`@BPP/`B$0D(HK0,\"*P@V@````)?\```!05^@O +M"@``5^@)_O__@\0,A<!T"KX"````Z>D```#&1"0?`(M<)"PSP(K#)8````"$ +MP'0*,\"*1P2#X/?K"#/`BD<$@\@(BM"+-XA'!#/`BL)0,\!FBT8$4(L&_U`$ +MBQ>#Q`A2Z"T6```SP(LWBE<$@\0$@,H!B%<$BL)0,\!FBT8$4(L&_U`$BP^# +MQ`A1Z`,6``"+!U#H^Q4``(L7@\0(4NCP%0``,\"+-XI7!(/$!(#B_HA7!(K" +M4#/`9HM&!%"+!O]0!(L/@\0(4>C&%0``BP=0Z+X5``"*5"0G@\0(,\#^PHK# +MB%0D'P/`@/H(BM@/@C'___]7Z!K]__^+\('F_P```(/$!(7V#X7F````,\"+ +M-XI'!(/@]XA'!(K8,\"*PU`SP&:+1@10BP;_4`0SP(LWBE\$@\0(@,L!B%\$ +MBL-0,\!FBT8$4(L&_U`$BP^#Q`A1Z#T5``"+!U#H-14``(L7@\0(4N@J%0`` +M,\"+-XI'!(/$!(/("(A'!(K8,\"*PU`SP&:+1@10BP;_4`2+#X/$"%'H_!0` +M`#/`BS>*7P2#Q`2`X_Z(7P2*PU`SP&:+1@10BP;_4`2+!X/$"%#HTA0``(L7 +M4NC*%```BEPD*H/$"#/`BL,-H0```"7_````4%?H3@@``%?H*/S__X/$#(7` +M=`VX_P```%M>7X/$&,.0,MLSP(I$)",#P(A$)"-7Z`#\__^*3"0G@\0$"LC^ +MPXA,)".`^PARVC/`BS>*1P2#X/>(1P2*V#/`BL-0,\!FBT8$4(L&_U`$,\"+ +M-XI?!(/$"(#+`8A?!(K#4#/`9HM&!%"+!O]0!(L'@\0(4.@B%```BQ=2Z!H4 +M``"+#X/$"%'H#Q0``#/`BS>*7P2#Q`2`X_Z(7P2*PU`SP&:+1@10BP;_4`2+ +M!X/$"%#HY1,``(L74NC=$P``,\"+-XI'!(/$"(/("(A'!(K8,\"*PU`SP&:+ +M1@10BP;_4`0SP(LWBE\$@\0(@,L!B%\$BL-0,\!FBT8$4(L&_U`$BP^#Q`A1 +MZ)`3``"+!U#HB!,``(L7@\0(4NA]$P``,\"+-XI'!(/$!(/@]XA'!(K8,\"* +MPU`SP&:+1@10BP;_4`2+#X/$"%'H3Q,``#/`BS>*7P2#Q`2`X_Z(7P2*PU`S +MP&:+1@10BP;_4`2+!X/$"%#H)1,``(L74N@=$P``@\0(,\!;7HI$)!M?@\08 +MPY"!_P````"!_P````"#[!`SP%>+?"085E.*1P2+-X/@]XA'!(K8,\"*PU`S +MP&:+1@10BP;_4`0SP(LWBE\$@\0(@,L!B%\$BL-0,\!FBT8$4(L&_U`$BQ># +MQ`A2Z*P2``"+#U'HI!(``(L'@\0(4.B9$@``,\"+-XI'!(/$!(/("(A'!(K8 +M,\"*PU`SP&:+1@10BP;_4`2+%X/$"%+H:Q(``#/`BS>*7P2#Q`2`X_Z(7P2* +MPU`SP&:+1@10BP;_4`2+#X/$"%'H01(``(L'4.@Y$@``BU0D,(/$"+@'```` +M(L(#P(K0,\"*P@V@````)?\```!05^BR!0``5^B,^?__@\0,A<!T#;@"```` +M6UY?@\00PY"+7"0DB%PD&S+;,\"*1"0;)8````"$P'0+,\"*1P2#X/?K"9`S +MP(I'!(/("(K0BS>(1P0SP(K"4#/`9HM&!%"+!O]0!(L/@\0(4>BI$0``,\"+ +M-XI7!(/$!(#*`8A7!(K"4#/`9HM&!%"+!O]0!(L'@\0(4.A_$0``BQ=2Z'<1 +M``"+#X/$"%'H;!$``#/`BS>*5P2#Q`2`XOZ(5P2*PE`SP&:+1@10BP;_4`2+ +M!X/$"%#H0A$``(L74N@Z$0``,\"#Q`C^PXI$)!L#P(#["(A$)!L/@C+___]7 +MZ)KX__^#Q`0E_P```%M>7X/$$,.#QP`[_X'_`````(/L"#/`5XM\)!!64XI' +M!(LW@^#WB$<$BM@SP(K#4#/`9HM&!%"+!O]0!#/`BS>*7P2#Q`B`RP&(7P2* +MPU`SP&:+1@10BP;_4`2+%X/$"%+HK!```(L/4>BD$```BP>#Q`A0Z)D0```S +MP(LWBD<$@\0$@\@(B$<$BM@SP(K#4#/`9HM&!%"+!O]0!(L7@\0(4NAK$``` +M,\"+-XI?!(/$!(#C_HA?!(K#4#/`9HM&!%"+!O]0!(L/@\0(4>A!$```BP=0 +MZ#D0``"#Q`A;7E^#Q`C#@\<`@?\`````@?\`````@^P0,\!75E.+7"0D58ML +M)"2+="0P9HM%!%"+10#_4!R);"04@\0$)?\```#&1"04!(A$)!\SP&H$9HM% +M!%"+10#_4`0SP(/$"(K#`\"*V(M$)"R+T/[*A,"(5"0L=$F*P_[#)?\```!0 +MC40D%%#H'?C__XOXBL,E_P```/[#4(U$)!Q0Z`?X___!X`B#Q!!F"_AFB3Z+ +M1"0L@\8"B\C^R83`B$PD+'6W,\"*1"0?4#/`9HM%!%"+10#_4`2#Q`A=6UY? +M@\00PY`[_X'_`````(/L$%>+?"085E-FBW0D)(O&@>;_````)?__``#!^`@E +M_P```%!65^@D_/__@\0,A<!T%5M>0%^#Q!##D+@!````6UY?@\00PXM<)"B( +M7"0;,MLSP(I$)!LE@````(3`=`LSP(I'!(/@]^L)D#/`BD<$@\@(BM"+-XA' +M!#/`BL)0,\!FBT8$4(L&_U`$BQ>#Q`A2Z+D.```SP(LWBE<$@\0$@,H!B%<$ +MBL)0,\!FBT8$4(L&_U`$BP^#Q`A1Z(\.``"+!U#HAPX``(L7@\0(4NA\#@`` +M,\"+-XI7!(/$!(#B_HA7!(K"4#/`9HM&!%"+!O]0!(L/@\0(4>A2#@``BP=0 +MZ$H.```SP(/$"/[#BD0D&P/`@/L(B$0D&P^",O___U?HJO7__X/$!(7`#X4+ +M____,\"+-XI'!(/("(A'!(K8,\"*PU`SP&:+1@10BP;_4`0SP(LWBE\$@\0( +M@,L!B%\$BL-0,\!FBT8$4(L&_U`$BQ>#Q`A2Z-4-``"+#U'HS0T``(L'@\0( +M4.C"#0``,\"+-XI'!(/$!(/@]XA'!(K8,\"*PU`SP&:+1@10BP;_4`2+%X/$ +M"%+HE`T``#/`BS>*7P2#Q`2`X_Z(7P2*PU`SP&:+1@10BP;_4`2+#X/$"%'H +M:@T``(L'4.AB#0``BS^#Q`AJ"HL'_U`T@\0$,\!;7E^#Q!##._\[_X'_```` +M`(/L"#/`5XM\)!!64XI'!(LW@\@(B$<$BM@SP(K#4#/`9HM&!%"+!O]0!#/` +MBS>*7P2#Q`B`RP&(7P2*PU`SP&:+1@10BP;_4`2+%X/$"%+H[`P``(L/4>CD +M#```BP>#Q`A0Z-D,```SP(LWBD<$@\0$@^#WB$<$BM@SP(K#4#/`9HM&!%"+ +M!O]0!(L7@\0(4NBK#```,\"+-XI?!(/$!(#C_HA?!(K#4#/`9HM&!%"+!O]0 +M!(L/@\0(4>B!#```BP=0Z'D,``"#Q`A;7E^#Q`C#@\<`@?\`````@?\````` +M@^P,5XM\)!164\9$)!<`BT0D("6`````A,!T##/`BD<$@^#WZPH[_S/`BD<$ +M@\@(BMB+-XA'!#/`BL-0,\!FBT8$4(L&_U`$BQ>#Q`A2Z`T,```SP(LWBE\$ +M@\0$@,L!B%\$BL-0,\!FBT8$4(L&_U`$BP^#Q`A1Z.,+``"+!U#HVPL``(L7 +M@\0(4NC0"P``,\"+-XI?!(/$!(#C_HA?!(K#4#/`9HM&!%"+!O]0!(L/@\0( +M4>BF"P``BP=0Z)X+``"+1"0H@\0()?\````#P(I4)!?^PHA$)""(5"07@/H( +M#X(H____6UY?@\0,PSO_4#/`5XM\)`Q64XI?!(LW@,L!B%\$BL-0,\!FBT8$ +M4(L&_U`$BQ>#Q`A2Z$$+``"+#U'H.0L``(L'@\0(4.@N"P``,\"+-XI?!(/$ +M!(#C_HA?!(K#4#/`9HM&!%"+!O]0!(L7@\0(4N@$"P``BP]1Z/P*``"#Q`A; +M7E^#Q`3#._]7BWPD"%93,\"+-XI?!(#+`8A?!(K#4#/`9HM&!%"+!O]0!(L7 +M@\0(4NC""@``BP]1Z+H*``"#Q`A;7E_#@\<`5XM\)`A64S/`BS>*7P2`X_Z( +M7P2*PU`SP&:+1@10BP;_4`2+%X/$"%+H@@H``(L/4>AZ"@``@\0(6UY?PX/' +M`(I$)`A3BTPD"(3`="<SP(I!!(/@]XK8BQ&(000SP(K#4#/`9HM"!%"+`O]0 +M!(/$"%O#._\SP(I!!(/(".O7._^#[!`SP%=64XM<)"15BVPD)(MT)#!FBT4$ +M4(M%`/]0'(EL)!2#Q`0E_P```,9$)!0$B$0D'S/`:@1FBT4$4(M%`/]0!(M$ +M)#2#Q`B+T/[*A,"(5"0L=&$SP(H&4(K#)?\```!&4(U$)!A0Z''Z___^PX/$ +M#(OXA?]T+C/`BD0D'U`SP&:+1010BT4`_U`$BT0D-(/$",'G""7_````0`O' +M75M>7X/$$,.+1"0LB\C^R83`B$PD+'6?,\"*1"0?4#/`9HM%!%"+10#_4`2# +MQ`@SP%U;7E^#Q!##@\<`C70F`(/L-#/)5XM\)$16BT0D1%-5BW0D2,9'`03& +M1S`#9HM`$&;'1Q)``&:)3Q8E_/\``&:)1Q"+1"1,9HE/%(M`%&;'1QP`0,9' +M'J*#X/")1QB+1"1,BT`PB4<HBT<8A<!T%HM$)$QFBT`$9JD"`'0(BD<>#$"( +M1QYJ`#/`9HM'$(/`+B7__P``4/]6!,9''Q`SP&:+1Q"#P"DE__\``%#_5AR# +MQ`PE\````(/X$'4(BD<?#""(1Q\SP&:+1Q"#P`(E__\``%#_5AR#R`8E_P`` +M`%`SP&:+1Q"#P`(E__\``%#_5@0SP&:+1Q"#P!(E__\``%#_5B!FB40D3B7_ +M_P``@\@@)?__``!0,\!FBT<0@\`2)?__``!0_U8(B70D.#/`9HM'$&H"@\`P +M9HE$)$`SP&:+1Q"#P"XE__\``%#_5@2-1"0X4(U$)$1J!&H@4.C>]___BT0D +M2(/$,#/2)?__``!FBU0D&@/"BU0D'('B__\```/",])FBU0D'B7__P``.\)U +M+8M$)!B(1R**1"09B$<CBD0D&HA')(I$)!N(1R6+1"0<B$<FBD0D'8A')^L/ +MD#/)9HE/(F:)3R1FB4\FC6PD(#/`QD0D0@%FBT4$LQ>)="0PC70D0U"+10#_ +M4!R);"04@\0$BM`SP,9$)!0$BL*(1"1!,\!J!&:+1010BT4`_U`$@\0(L`&* +MT/[*A,"(5"1"="J*P_[#)?\```!0C40D%%#HF.___X@&@\0(1HI$)$**R/[) +MA,"(3"1"==8SP(I$)$%0,\!FBT4$4(M%`/]0!(MT)#B#Q`BX!P```")$)$.* +M@`````#&1R'_B$<L:@`SP&:+1Q"#P"XE__\``%#_5@0SP&:+1"1&4#/`9HM' +M$(/`$B7__P``4/]6"(M$)%R#Q!!FBT`$9JD$`'0*,\!=6UY?@\0TPUU;7K@" +M````7X/$-,.#QP`[_X'_`````(/L%#/`5XM\)"A6BW0D(%.+7"0L9HM&!%"+ +M!O]0'(ET)!"#Q`2*T#/`QD0D$`2*PHA$)!\SP&H$9HM&!%"+!O]0!(K#_LN# +MQ`B$P'0JBT0D*(O0)?\```!0C40D$/["B%0D+%#HA^[__X@'BL.#Q`A'_LN$ +MP'76,\"*1"0?4#/`9HM&!%"+!O]0!(/$"%M>7X/$%,.!_P````"!_P````"# +M[!!7BWPD&%9358ML)"AFBT<"9CTP`'0?75M>N`$```!?@\00PSO_N`0```!= +M6UY?@\00PX/&`(N'&`L``(7`=0UFBX=R"P``9JE``'79QH=]"P```(M$)"R) +MAY`+``"+1"0PB8>4"P``9HN'<@L``&:I`0!T#6;'AY@+``!01NL+._]FQX>8 +M"P``E!$SP(M4)#1FBX>8"P``@>+__P``.\)^"XM$)#1FB8>8"P``N`D```!F +M(T0D.(/X"70/N`P```!F(T0D.(/X#'4/75M>N`,```!?@\00PSO_BT0D.(7M +M9HF'F@L``'1%5>C_1@``@\0$A<!U.(I%`$5%B(>("P``145%BD7\B(>)"P`` +MBD7]B(>*"P``BD7^B(>+"P``BD7_B(>,"P``BD4`ZT.0BH>""P``B(>("P`` +MBH>#"P``B(>)"P``BH>$"P``B(>*"P``BH>%"P``B(>+"P``BH>&"P``B(>, +M"P``BH>'"P``,_8STHB'C0L``(V?B`L``$.*2_\ZRG06B50D&.L>75M>N`(` +M``!?@\00PX/'`$:#_@9\W,=$)!@!````BT0D&(7`==J*AX@+``"H@'70BX=H +M"P``BT@\A<ET!U?_4#R#Q`2+AV@+``"*0`N(AW@+``!7BX=L"P``_U`49L>' +MO`X``"``,\F#Q`0SP(B/M@L``&:)C[0+``"(C[<+``"(C[@+``"(C[H+``"( +MC[D+``"(C[X.``"(C[\.``"(C\`.``"(C\$.``"(C\(.``"(C\,.``!=6UY? +M@\00PSO_@^P<5U9358ML)#"+50"!^B"!``!T6EU;7C/`7X/$',-&@_X1<F@S +M]HM$)#B+WJD$````#X3^````A=L/A/8```!FO@`*B\8E__\``%!5Z!U.``"# +MQ`B%P'16BT0D*"7__P``]]!F(_CIJP```(/'`,=$)!P`````9L=$)"@PSHM$ +M)#2_#P```(E$)!0S]HL<M0````"%VW2-9HM#"&8]`P`/A7G___^+\^EZ____ +M._]H-I0``(O&)?__``"#P!XE__\``%!5Z%6]__^#Q`R%P'1&BTPD%(O&427_ +M_P``4%7_4Q2+1"0H@\0,0(E$)!R+1"0\BU0D'#O0#XU&`0``BT0D*(M,)!0E +M__\``/?09B/X@\$TB4PD%(M$)"B#QB`E__\``,'X!&:)1"0H9H'^X`L/A@[_ +M___'1"08`````&;WQP$`#X3@````:$:2``"+1"0<9HL$10````!FB40D*B7_ +M_P``@\`")?__``!05>BLO/__@\0,A<!U-V:+1"0F9JD$`'0*N!P```#K"(/' +M`+@0````,])FBU0D)@/0@>+__P``4E7H94?__X/$"(7`='@SP&:+1"0F4%7H +MP+W__X/$"#/VB\B+'+4`````A=MT&#/`B]%FBT,(@>+__P``.\)T"$:#_A%R +MW3/;A=MT.HM$)#B+$X70=#"+5"04,\!FBT0D)E)05?]3%(M,)"B#Q`Q!BT0D +M/(E,)!P[R'TFBU0D%(/"-(E4)!2!Y___``"+3"08P?\!08E,)!B#^00/C/K^ +M__^+1"0<75M>7X/$',.#QP"!_P````"!_P````"#[`A75HM$)!2+$('Z(($` +M`'057KC_____7X/$",,[_S/`7E^#Q`C#N.`/``"+3"049B-$)!PE__\``%!1 +MZ,Y+``"#Q`B%P'77BT0D'"7__P``4(M$)!A0Z,.\__^#Q`B+R&:#^6-TN#/V +MBSRU`````(7_=!@SP(O19HM'"('B__\``#O"=`A&@_X1<MTS_X7_=(V+5"08 +MBT0D'%(E__\``%"+3"0<4?]7%(/$#%Y?@\0(PY"!_P````"!_P````"+3"0$ +M,\"+D5`+``!29HN!<`L``(/`""7__P``4(N!7`L``/]0#(/$",,[_XUT)@"+ +M5"0$,\!FBT($4(L"_U`<)?\```"#Q`3#@\<`C70F`#/`BU0D!(I$)`A0,\!F +MBT($4(L"_U`$@\0(PY"-="8`5XM\)`AJ88L'_U`<:F&+!_]0'&IABP?_4!QJ +M88L'_U`<@\007\,[_SO_@?\`````,\!FBT0D"%"+1"0(BP#_4#2#Q`3#@\<` +M._^!_P````"#[!PSP%=64XMT)"Q5BUPD-&:+AG`+``"#P#(E__\``%"+AEP+ +M``#_4""+TR7__P``@>+__P``(\*#R`*+^"7__P``4#/`9HN&<`L``(/`,B7_ +M_P``4(N&7`L``/]0"('C__\``#/`@\L"9HE<)#9H4```@&:+AG`+``"#P!0E +M__\``%"+AEP+``#_4`R[]/___X/$%#/`9HN&<`L``(/`&"7__P``4(N&7`L` +M`/]0)(E$'""#Q`2#PP1\V<=$)"0`````,]*+QV:+5"0J)?__``"[#````#O" +M#X0B`0``B^\S_V:+^L'G$('/QP<``&A0``"`,\!FBX9P"P``@\`4)?__``!0 +MBX9<"P``_U`,:+A`8(XSP&:+AG`+``"#P!@E__\``%"+AEP+``#_4`QHV+MR +M`#/`9HN&<`L``(/`&"7__P``4(N&7`L``/]0#%<SP&:+AG`+``"#P!@E__\` +M`%"+AEP+``#_4`R!Y?W_```SP%5FBX9P"P``@\`R)?__``!0BX9<"P``_U`( +MNT3]__^#Q"@SP&:+AG`+``"#P!(E__\``%"+AEP+``#_4""#Q`1#?-\SP+N\ +M`@``9HN&<`L``(/`,B7__P``4(N&7`L``/]0((M4)"B#Q`2+Z"7__P``0HE4 +M)"0STF:+5"0J.\)T#8M$)"2#^&0/C.[^__]H4```@#/`9HN&<`L``(/`%"7_ +M_P``4(N&7`L``/]0#+OT____@\0(BTP<'#/`46:+AG`+``"#P!@E__\``%"+ +MAEP+``#_4`R#Q`B#PP1\V%V[#````%M>7X/$',,[_X/L"#/`5XM\)!!64U5J +M`&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP&:+AW`+``"#P#(E__\``%"+ +MAUP+``#_4""+\&:!YO[_B\8E__\``%`SP&:+AW`+``"#P#(E__\``%"+AUP+ +M``#_4`AF@>;]_S/`@>;__P``5F:+AW`+``"#P#(E__\``%"+AUP+``#_4`B* +MATX+```D_HB'3@L``#/`9HN'<`L``(/`$B7__P``4(N'7`L``/]0((/$((OP +M9H'.``*[#P```&:#SA!F(]Z#^P=^!;L'````A=MT#XU+_[L!````T^/K"(/' +M`+L!````9H'F_^.*AW\+``"$P'0J,]*+PR7__P``BI=_"P``.\)\%V:!S@`8 +M9HN'@`L``&:I$`!T!6:!S@`$@>;__P``,\!69HN'<`L``(/`$B7__P``4(N' +M7`L``/]0"(/$"(J'?`L``(3`=2-HG"```#/`9HN'<`L``(/`""7__P``4(N' +M7`L``/]0#(/$",>'4`L``)P@``"!X___```SP$.*AW\+``"+TXOS@>+__P`` +M.\)^!&8/MMB!YO__``"X_0```"O&@>/__P``B^@E__\``(F'5`L``#/`P>,( +M"]Z!X___``!39HN'<`L``(/`(B7__P``4(N'7`L``/]0"('E__\``#/`@<T` +M?P``@>7__P``56:+AW`+``"#P"`E__\``%"+AUP+``#_4`AJ`#/`9HN'<`L` +M`(/`'B7__P``4(N'7`L``/]0"(/$&+Y<````9HN'<@L``&:I@`!U`X/.`E8S +MP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`QJ`#/`9HN'<`L``(/`!B7__P`` +M4(N'7`L``/]0"(N''`L``(/FXXF')`L``(F'(`L``(J'3@L```P(B(=."P`` +M,\!69HN'<`L``(/`)"7__P``4(N'7`L``/]0#&;'AT@+`````(/$&%U;7E^# +MQ`C#@\<`@?\`````@?\`````@^P,5U9358U$)!B+;"0H4%6+5"0LBW0D*%+H +M<<3__X/$#(7`#X7&````:````("+1"0<)?__``"->`,SP&:+AG`+``#!_P*# +MP!0E__\``%"+AEP+``#_4`R+3"0@,\!19HN&<`L``(/`&"7__P``4(N&7`L` +M`/]0#(/$$+L!````._M^1HU$)!A0BT0D*%50Z/O#__^#Q`R%P'0'C4?_.]AU +M38M4)!@SP%)FBX9P"P``@\`8)?__``!0BX9<"P``_U`,@\0(0SO??+I6BX9L +M"P``_U`L9L=&`B$`9L=&!```,\"#Q`1=6UY?@\0,PSO_75M>N`$```!?@\0, +MPX/'`%>_PB```%:^!````&:+5"00BDPD#&8C\H7V=`:!YW____^$R74*@<\` +M`@``ZPT[_X#Y$'4&@<\``0``P><0@<\`,0``9O?""`!T!H'G_^___X7V=`:! +MY__?__]FBT0D%&8]#P!U`X//!(O'7E_#._^#[!PSP#/)5XM\)"Q6BW0D+%.+ +M7"0LQD<!!,9',`)FBT809L='$D``9HE/%B7\_P``9HE'$&:)3Q2+1A1FQT<< +M`$#&1QZB@^#PB4<8BT8PB4<HBT<8A<!T$F:+1@1FJ0(`=`B*1QX,0(A''FH` +M,\!FBT<0@\`N)?__``!0_U,$QD<?`#/`9HM'$(/`*27__P``4/]3'(/$#"7P +M````@_@0=0B*1Q\,.(A''S/`9HM'$(/`$B7__P``4/]3(&:)1"0H)?__``"# +MR"`E__\``%`SP&:+1Q"#P!(E__\``%#_4PB)7"0D9HM'$&:)1"0HC40D'%"- +M1"0H:@1J(%#HS^?__XM$)"R#Q!PSTB7__P``9HM4)!(#PHM4)!2!XO__```# +MPC/29HM4)!8E__\``#O"=2Z+1"00B$<BBD0D$8A'(XI$)!*(1R2*1"03B$<E +MBT0D%(A')HI$)!6(1R?K$#O_,\EFB4\B9HE/)&:)3R:-1"0F4(U$)!QJ`6H- +M4.A/Y___,\"#Q!!FBT0D)HE$)`RI`0```'0&,\#K&SO_BT0D#*D"````=`FX +M$````.L'._^X!````,9'(?^(1RR+1"0D)?__``!0,\!FBT<0@\`2)?__``!0 +M_U,(9HM&!(/$"&:I!`!T"S/`6UY?@\0<PSO_6UY?N`(```"#Q!S#C70F`(M$ +M)`3'@%`+````````PY"#[`@SP%=6BW0D%&:+AG`+``"#P!(E__\``%"+AEP+ +M``#_4""+^"7__P``@\@@)?__``!0,\!FBX9P"P``@\`2)?__``!0BX9<"P`` +M_U`(BX9<"P``BU0D)(E$)!1FBX9P"P``4FH(:CAFB40D)(U$)"!0Z.CO__^! +MY___```SP%=FBX9P"P``@\`2)?__``!0BX9<"P``_U`(@\0D7E^#Q`C#D('_ +M`````('_`````(/L"#/`5U93BW0D&&:+AG`+``"#P!(E__\``%"+AEP+``#_ +M4""+^"7__P``@\@@)?__``!0,\!FBX9P"P``@\`2)?__``!0BX9<"P``_U`( +MBX9<"P``BU0D*(E$)!AFBX9P"P``4FH(:CAFB40D*(U$)"10Z(?K__^+V#/` +M@>?__P``5V:+AG`+``"#P!(E__\``%"+AEP+``#_4`B#Q"2+PUM>7X/$",.# +MQP"-="8`@^P05S/_5HMT)!Q358ML)"AFBT4P9JD`@'0DC5TP:F2+AEP+``#_ +M4#2+QT>#Q`2#^&0/CY`"``!F]P,`@'7?:F2+AEP+``#_4#1J`C/`9HN&<`L` +M`(/`+B7__P``4(N&7`L``/]0!&H6,\!FBX9P"P``@\`6)?__``!0BX9<"P`` +M_U`$:@8SP&:+AG`+``"#P!8E__\``%"+AEP+``#_4`1J`#/`9HN&<`L``(/` +M+B7__P``4(N&7`L``/]0!+D`@```,\!FB4U<9HF-B````&H!9HN&<`L``(/` +M*"7__P``4(N&7`L``/]0"(/$+#/_9HN%B````&:I`(!T)XV=B````&IDBX9< +M"P``_U`TB\='@\0$@_AD#X^;`0``9O<#`(!UWVIDBX9<"P``_U`T:@(SP&:+ +MAG`+``"#P"XE__\``%"+AEP+``#_4`1J%C/`9HN&<`L``(/`%B7__P``4(N& +M7`L``/]0!&H&,\!FBX9P"P``@\`6)?__``!0BX9<"P``_U`$:@`SP&:+AG`+ +M``"#P"XE__\``%"+AEP+``#_4`1FQX6T`````(`SVX/$)(V]X````&;W!P"` +M=0F#QRQ#@_L%?/"#^P5U`C/;C11;C13:P>("C805W@```&:+$&:!X@`!9HD0 +MC11;C13:P>("9L>$%>(``````(T46XT4VL'B`HV$%>````")1"0<9L<``(`S +MP&H%9HN&<`L``(/`*"7__P``4(N&7`L``/]0"(M$)"2#Q`@S_V;W``"`=">) +M7"00B]AJ9(N&7`L``/]0-(O'1X/$!(/X9']*9O<#`(!UXXM<)!`SP(T,6V:+ +MA;`````STHT,V8/`!,'A`F:+E`W<````.\)T$+@$````75M>7X/$$,.#QP!= +M6UXSP%^#Q!##._]=6UZX`P```%^#Q!##@\<`75M>N`(```!?@\00PX/'`%U; +M7K@!````7X/$$,.#QP`[_X'_`````(/L9#/`5XM\)&Q64U5FBX=P"P``4(N' +M7`L``/]0(&:)1"1T,\!FBX=P"P``@\`D)?__``!0BX=<"P``_U`DB40D8#/` +M9HN'<`L``(/`!"7__P``4(N'7`L``/]0)(E$)&`SP&:+AW`+``"#P`@E__\` +M`%"+AUP+``#_4"!FB40D?C/`9HN'<`L``(/`*B7__P``4(N'7`L``/]0(&:) +MA"2`````,\!FBX=P"P``@\`2)?__``!0BX=<"P``_U`@9HF$)((````SP&:+ +MAW`+``"#P`PE__\``%"+AUP+``#_4"2+GQ0+``"+EQ`+``#WVXE$)&PSP&:+ +MAW`+``"#XP>#P!"+CQ0+``"--!HE__\``%"+AUP+```#V8E<)'S_4"!H__\` +M`#/`9HN'<`L``(/`$"7__P``4(N'7`L``/]0"&H`,\!FBX=P"P``4(N'7`L` +M`/]0"&@=X`<`,\!FBX=P"P``@\`D)?__``!0BX=<"P``_U`,:@`SP&:+AW`+ +M``"#P`0E__\``%"+AUP+``#_4`QJ`#/`9HN'<`L``(/`""7__P``4(N'7`L` +M`/]0"&H`,\!FBX=P"P``@\`J)?__``!0BX=<"P``_U`(,\!FBX=P"P``@\`R +M)?__``!0BX=<"P``_U`@)?]_``!0,\!FBX=P"P``@\`R)?__``!0BX=<"P`` +M_U`(,\!FBX=P"P``@\`2)?__``!0BX=<"P``_U`@)?#L``"#R`$E__\``%`S +MP&:+AW`+``"#P!(E__\``%"+AUP+``#_4`AJ`C/`9HN'<`L``(/`+B7__P`` +M4(N'7`L``/]0!#/`9HN'<`L``(/`%B7__P``4(N'7`L``/]0'(K8,\"*PX/( +M$(B$).8````E_P```%`SP&:+AW`+``"#P!8E__\``%"+AUP+``#_4`1J`#/` +M9HN'<`L``(/`+B7__P``4(N'7`L``/]0!#/`9HN'<`L``(/`#"7__P``4(N' +M7`L``/]0)"7__P``#0```P!0,\!FBX=P"P``@\`,)?__``!0BX=<"P``_U`, +M:@(SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP(K#@^#OB(0D"P$``"7_ +M````4#/`9HN'<`L``(/`%B7__P``4(N'7`L``/]0!&H`,\!FBX=P"P``@\`N +M)?__``!0BX=<"P``_U`$@<2H````,]N*@P````!#@_L*B(0>MP$``'+M,]N) +M?"00BT0D7(VNZ````(E$)&0%W````(E$)&"+1"1<!;@!``")="04B40D3(M$ +M)%P%R`$``+DL````B40D2(V&Y````(E$)!R-AN(```")1"0@C8;@````B40D +M)(V&W@```(E$)"B-AMP```")1"0LC48,B40D,(U&"(E$)#2-1@:)1"0XC48$ +MB40D/(U&`HOXBT0D/$-FQP80`(M4)$QFQP<```/Q9L<```"+1"0X`_EFQP`` +M!HM$)#2)$(M$)&0#P8E$)&2+1"0PBU0D9(/*`8D0BU0D2(M$)"QFQP`8`(M$ +M)"AFQP```(M$)"1FQP``@(M$)"!FQP```(M$)!R)$(M4)&`#T8M$)#P#P8E5 +M`(E$)#R+1"0XB50D8(M4)#0#P0/1B40D.(M$)#")5"0TBU0D*`/!`]&)1"0P +MBT0D+(E4)"B+5"0<`\$#T8E$)"R+1"0D`\$#Z8E$)"2+1"0@`\&#^P6)1"0@ +MB50D'`^,'O___XM$)%R+="04BWPD$(/(`8F&O````+D`@```9HN&M@```&8- +M``%FB8:V````BT0D7&:)3@0%W````&:)3C")AI@!``!FBX:.`0``9@T``6:) +MAHX!``"+1"1<!=P```!0,\!FBX=P"P``@\`\)?__``!0BX=<"P``_U`,BTPD +M9#/`46:+AW`+``"#P#@E__\``%"+AUP+``#_4`Q65^AR]___B_`SP&:+AW`+ +M``"#P"0E__\``%"+AUP+``#_4"0-````!5`SP&:+AW`+``"#P"0E__\``%"+ +MAUP+``#_4`QJ9(N'7`L``/]0-(N$))@````E__\``%`SP&:+AW`+``!0BX=< +M"P``_U`(BX0DB````%`SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`R+E"2, +M````,\!29HN'<`L``(/`!"7__P``4(N'7`L``/]0##/`9HN$)*X```!0,\!F +MBX=P"P``@\`()?__``!0BX=<"P``_U`(BX0DM````"7__P``4#/`9HN'<`L` +M`(/`*B7__P``4(N'7`L``/]0"#/`9HN$)+H```!0,\!FBX=P"P``@\`2)?__ +M``!0BX=<"P``_U`(:@(SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP(J$ +M)-(```!0,\!FBX=P"P``@\`6)?__``!0BX=<"P``_U`$:@`SP&:+AW`+``"# +MP"XE__\``%"+AUP+``#_4`2+C"3`````,\!19HN'<`L``(/`#"7__P``4(N' +M7`L``/]0#&H",\!FBX=P"P``@\`N)?__``!0BX=<"P``_U`$,\"*A"3S```` +M4#/`9HN'<`L``(/`%B7__P``4(N'7`L``/]0!&H`,\!FBX=P"P``@\`N)?__ +M``!0BX=<"P``_U`$@<20````A?9T'%U;B\9>7X/$9,,[_[@&````75M>7X/$ +M9,.#QP`SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4"2#Q`2#X!2#^!1UREU; +M7C/`7X/$9,,[_X'_`````#/`BU0D!&:+1"0(4#/`9HN"<`L``(/`,B7__P`` +M4(N"7`L``/]0"(/$",.0C70F`(/L%#/`5XM\)!Q64U5J`&:+AW`+``"#P"XE +M__\``%"+AUP+``#_4`0SP&:+AW`+``"#P#(E__\``%"+AUP+``#_4""+\&:! +MYO[_B\8E__\``%`SP&:+AW`+``"#P#(E__\``%"+AUP+``#_4`AF@>;]_S/` +M@>;__P``5F:+AW`+``"#P#(E__\``%"+AUP+``#_4`B*ATX+```D_HB'3@L` +M`#/`9HN'<`L``(/`$B7__P``4(N'7`L``/]0((/$((OP9H/.$+L/````9B/> +M@_L+?@6["P```(7;=`R-2_^[`0```-/CZP6[`0```&:!YO_CBH=_"P``A,!T +M*C/2B\,E__\``(J7?PL``#O"?!=F@<X`&&:+AX`+``!FJ1``=`5F@<X`!('F +M__\``#/`5F:+AW`+``"#P!(E__\``%"+AUP+``#_4`B#Q`B*AWP+``"$P'4C +M:%P@```SP&:+AW`+``"#P`@E__\``%"+AUP+``#_4`R#Q`C'AU`+``!<(``` +M@>/__P``,\"*AW\+``"-<P&+WCO#=@0SVXK8O0`(```SP"ONB:]4"P``:@)F +MBX=P"P``@\`N)?__``!0BX=<"P``_U`$,\!FBX=P"P``@\`6)?__``!0BX=< +M"P``_U`<B$0D+R7_````@\@0)?\```!0,\!FBX=P"P``@\`6)?__``!0BX=< +M"P``_U`$:`\0#P`SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`QH'Q```#/` +M9HN'<`L``(/`*"7__P``4(N'7`L``/]0#&H`,\!FBX=P"P``@\`N)?__``!0 +MBX=<"P``_U`$P>L!,\!#P>,0@<L``@``4V:+AW`+``"#P`PE__\``%"+AUP+ +M``#_4`S![0(SP,'N`;KZ`P``P>40*]8+ZE5FBX=P"P``@\`@)?__``!0BX=< +M"P``_U`,:@(SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP(I$)&<E[P`` +M`%`SP&:+AW`+``"#P!8E__\``%"+AUP+``#_4`1J`#/`9HN'<`L``(/`+B7_ +M_P``4(N'7`L``/]0!&H`,\!FBX=P"P``4(N'7`L``/]0"(/$7+Y`````9HN' +M<@L``&:I@`!U`X/.`E8SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`QJ`#/` +M9HN'<`L``(/`!"7__P``4(N'7`L``/]0#(/$$(N''`L``(F')`L``(F'(`L` +M`(J'3@L```P(B(=."P``BX<8"P``/>@!``!R"5?H`/3__X/$!('.````!S/` +M5F:+AW`+``"#P"0E__\``%"+AUP+``#_4`QFQX=("P````"#Q`A=6UY?@\04 +MPX/'`(UT)@"#[`Q75E-5C40D&(ML)"A058M4)"R+="0H4NAQL/__@\0,A<`/ +MA28!``!H````@(M$)!PE__\``(UX`S/`9HN&<`L``,'_`H/`%"7__P``4(N& +M7`L``/]0#(M,)"`SP%%FBX9P"P``@\`8)?__``!0BX9<"P``_U`,@\00NP$` +M```[^WY*C40D&%"+1"0H55#H^Z___X/$#(7`=`N-1_\[V`^%J0```(M4)!@S +MP%)FBX9P"P``@\`8)?__``!0BX9<"P``_U`,@\0(0SO??+9H\+\`@#/`9HN& +M<`L``(/`%"7__P``4(N&7`L``/]0#&B0ZE``,\!FBX9P"P``@\`8)?__``!0 +MBX9<"P``_U`,:@`SP&:+AG`+``"#P!@E__\``%"+AEP+``#_4`Q6BX9L"P`` +M_U`L9L=&`B$`9L=&!```,\"#Q!Q=6UY?@\0,PY!=6UZX`0```%^#Q`S#@\<` +M@^P(,])7BTPD&%:+="084XM<)!@S_V:#^11U!X#[9'4",MMF]\8(`'4%@/MD +M=06Z`0```&;WQ@0`=`F%TG4%OP$```!F@_D3=0V$VW4)A?]T!;D4````OL(@ +M``"%_W0&@>9_____A-NX``````^4P(E$)!"%P'04@<X`$```9H/Y$W4C@<X@ +M"```ZQN`^Q!U"X'.``$``.L.@\<`@/MD=0:!S@`"``#!YA"!S@`Q``"%TG0& +M@>;_[___A?]T!H'F_]___XM$)!"%P'4%@/MD=0QF@_D3=0:!S@!"``"`^V1U +M!H'F_^[__UN+QEY?@\0(PX/'`('_`````('_`````%>+?"0(,\#'AU`+```` +M````:@!FBX=P"P``@\`N)?__``!0BX=<"P``_U`$,\!FBX=P"P``@\`")?__ +M``!0BX=<"P``_U`<@\@&)?\```!0,\!FBX=P"P``@\`")?__``!0BX=<"P`` +M_U`$@\047\.#[`@SP%=6BW0D%&:+AG`+``"#P!(E__\``%"+AEP+``#_4""+ +M^"7__P``@\@@)?__``!0,\!FBX9P"P``@\`2)?__``!0BX9<"P``_U`(BX9< +M"P``B40D%#/`9HN&<`L``&H"@\`P9HE$)!PSP&:+AG`+``"#P"XE__\``%"+ +MAEP+``#_4`2+5"0LC40D'%)J"&HX4.AVW/__:@`SP&:+AG`+``"#P"XE__\` +M`%"+AEP+``#_4`2!Y___```SP%=FBX9P"P``@\`2)?__``!0BX9<"P``_U`( +M@\0T7E^#Q`C#._^!_P````"!_P````"#[`@SP%=64XMT)!AFBX9P"P``@\`2 +M)?__``!0BX9<"P``_U`@B_@E__\``(/(("7__P``4#/`9HN&<`L``(/`$B7_ +M_P``4(N&7`L``/]0"(N&7`L``(E$)!@SP&:+AG`+``!J`H/`,&:)1"0@,\!F +MBX9P"P``@\`N)?__``!0BX9<"P``_U`$BU0D,(U$)"!2:@AJ.%#HU=?__XO8 +M,\!J`&:+AG`+``"#P"XE__\``%"+AEP+``#_4`2!Y___```SP%=FBX9P"P`` +M@\`2)?__``!0BX9<"P``_U`(@\0TB\-;7E^#Q`C#._^!_P````!05U:+?"08 +M4[D!````BW0D&(A/,(@/B$\!9HEW$+D$````9HE/$F:%SG0)N!P```#K!SO_ +MN!````!FQT<6$`"+UC/)9HE/'('B__\```/0B\9FB5<4)?__``"#P`*)3Q@E +M__\``%"+1"08_U`<BMB+QB7__P``@\`#)?__``!0BT0D'/]0'(A$)!>#Q`BX +M`P```"+#BH``````B$<@BD0D#ZB`=!,SP(K#)?P````-``$``(OPZP209C/V +M@>;__P``P>8+B7<HBD0D#Z@(=`G&1RP0ZP>#Q@#&1RP$QD<>!#/`9HM'%(/` +M""7__P``4(M$)!C_4!R#Q`2I`@```'0PQD<A!(I''@P8B$<>C4<BBU0D%%`S +MP&:+1Q104NAO;/__@\0,N`$```!;7E^#Q`3#,\"*1"0/P?@$@^`#BH`````` +MB$<A/`1U"XI''@P0B$<>Z[F0BD<>#`.(1Q[KKCO_@^P,N0$```!7BWPD'%:+ +M="084U6(3P&(3S"+1"0DN00```!FB4<09H7(9HE/$L8'`G0)N!P```#K!SO_ +MN!````!FQT<6$`"+5"0D,\EFB4\<@>+__P```]"+1"0D9HE7%"7__P``@\`" +MB4\8B]@E__\``%#_5AR(1"0;:@6+PR7__P``4/]6!(M$)#`E__\``(/``XOH +M)?__``!0_U8<B$0D*XO#:@8E__\``%#_5@2+Q27__P``4/]6'(I4)#>#Q!SV +MP@&(1"0:=02H@'0EQD<>`&H"B\,E__\``%#_5@2+Q27__P``4/]6'(A$)"5J +M`^LCD,9''@1J`(O#)?__``!0_U8$B\4E__\``%#_5AR(1"0E:@&+PR7__P`` +M4/]6!(O%)?__``!0_U8<B$0D,(/$&+@'````(D0D&8J``````(A'((M$)!BH +M`70'QD<L$.L%D,9'+`2+1"08J(!T&+AX````BU0D&"+"#0`#``!FB40D%.L( +MD&;'1"04``"+1"04)?__``#!X`J)1RB*1"0:J$!T#L9'(02*1QX,"(A''NL5 +M,\"*1"09P?@#@^`'BH``````B$<ABD<A/`1U3(I''@P0B$<>:@:+PR7__P`` +M4/]6!(U'(H'E__\``%!J/%56Z&AN__\SP('C__\``(I$)"]04_]6!(/$(+@! +M````75M>7X/$#,.#Q@"*1QX,`^NRD('_`````('_`````%>+?"0(,\!FBX=P +M"P``@\`")?__``!0BX=<"P``_U`<)?<```!0,\!FBX=P"P``@\`")?__``!0 +MBX=<"P``_U`$@\0,7\,[_SO_@?\`````5XM\)`AJ!3/`9HN'<`L``(/``B7_ +M_P``4(N'7`L``/]0!#/`9HN'<`L``(/``R7__P``4(N'7`L``/]0'"7W```` +M4#/`9HN'<`L``(/``R7__P``4(N'7`L``/]0!(/$%%_#D('_`````('_```` +M`%`SP%>+?"0,:@)FBX=P"P``@\`")?__``!0BX=<"P``_U`$,\!FBX=P"P`` +M@\`#)?__``!0BX=<"P``_U`<BU0D'(/$#(K(N`<````BP8'B_P```(J````` +M`"7_````.\)T5HM$)!`E_P```(J``````(A$)`<\!W8*N`,```!?@\0$PS/` +M,]**P8I4)`<E^`````O")?\```!0,\!FBX=P"P``@\`#)?__``!0BX=<"P`` +M_U`$@\0(,\!?@\0$PU>+?"0(:@(SP&:+AW`+``"#P`(E__\``%"+AUP+``#_ +M4`0SP&:+AW`+``"#P`,E__\``%"+AUP+``#_4!R*R#/`@\0,BL'!^`,STH/@ +M!XI4)`R*@``````E_P```#O"=#Z*D@`````SP(K!@>+_````P>(#)<<````+ +MPB7_````4#/`9HN'<`L``(/``R7__P``4(N'7`L``/]0!(/$"%_#@\<`@?\` +M````@?\`````5XM\)`AJ`#/`9HM'%H/`'B7__P``4(N'7`L``/]0!&H(5^A9 +MD?__@\00)0`+```]``,``'42N`$```"(1QM?P[@!````7\.0:@97Z#"1__^# +MQ`BI@````'7F,\!?PSO_:@0SP(M4)`AFBT(6@\`>)?__``!0BX)<"P``_U`$ +M@\0(PSO_@?\`````@?\`````@^P0,\!7BWPD&%9356:+AW`+``"#P!XE__\` +M`%"+AUP+``#_4!R*V+@!````(L,E_P```%`SP&:+AW`+``"#P!XE__\``%"+ +MAUP+``#_4`0SP&:+1Q:#P`@E__\``%"+AUP+``#_4""+\+@``P``9B/&@\00 +M/0`#```/A8`"``"+QB7__P``#0`(```E__\``%`SP&:+1Q:#P`@E__\``%"+ +MAUP+``#_4`@SP&:+1Q:#P`XE__\``%"+AUP+``#_4"!FB40D*H/$#&:%P`^$ +M#@(``#/`9HM'%H/`!B7__P``4(N'7`L``/]0(&:)1"0@,\!FBT<6@\`$)?__ +M``!0BX=<"P``_U`@BVPD)(/$"('E__\``"7__P``P>40"^AFBX=R"P``9JD0 +M`'1<9O?&``1T*3/`9HM$)!Y0,\!59HM'%H/`$"7__P``4(N'7`L``/]0*(/$ +M#.F%`0``,\!FBT0D'E`SP%5FBT<6@\`0)?__``!0BX=<"P``_U`0@\0,Z5P! +M``"#QP`SP&:+1"0>P?@"9HE$)!BX`P```&8C1"0>9O?&``1FB40D%@^$FP`` +M`(M$)!AFA<!T,"7__P``4#/`56:+1Q:#P!`E__\``%"+AUP+``#_4#`SP&:+ +M1"0J)?S_```#Z(/$#&:+1"069JD"`'0B,\!FBT<6@\`0)?__``!0BX=<"P`` +M_U`@@\4"@\0$9HE%_F:+1"069JD!``^$NP```#/`9HM'%H/`$"7__P``4(N' +M7`L``/]0'(A%`(/$!.F8````@\<`BT0D&&:%P'0P)?__``!0,\!59HM'%H/` +M$"7__P``4(N'7`L``/]0&#/`9HM$)"HE_/\```/H@\0,9HM$)!9FJ0(`="4S +MP&:+10!0,\!FBT<6@\`0)?__``!0BX=<"P``_U`(@\4"@\0(9HM$)!9FJ0$` +M="$SP(I%`%`SP&:+1Q:#P!`E__\``%"+AUP+``#_4`2#Q`A7Z"EI__^#Q`2% +MP'0*,\!=6UY?@\00P[X!````ZPR05^BZ,___B_"#Q`0SP(K#4#/`9HN'<`L` +M`(/`'B7__P``4(N'7`L``/]0!(/$"(O&75M>7X/$$,,[_X'_`````%>+?"0( +M:G$SP&:+AW`+``"#P!TE__\``%"+AUP+``#_4`1J`C/`9HN'<`L``(/`'R7_ +M_P``4(N'7`L``/]0!&CQ````,\!FBX=P"P``@\`=)?__``!0BX=<"P``_U`$ +M,\!FBX=P"P``@\`?)?__``!0BX=<"P``_U`<@\@$)?\```!0,\!FBX=P"P`` +M@\`?)?__``!0BX=<"P``_U`$,\!FBX=P"P``@\`>)?__``!0BX=<"P``_U`< +M@\@$)?\```!0,\!FBX=P"P``@\`>)?__``!0BX=<"P``_U`$@\0P7\,[_X'_ +M`````('_`````(/L(+D!````5XM\)#!6BW0D+%-5BT0D.,8'`R7__P``B$\! +MB$\P:#:4``"#P!UFB40D+HM$)#PE__\``(/`'F:)1"0LBT0D/"7__P``@\`? +M9HE$)"J+1"0L)?__``!05NAKD?__@\0,A<!U/%U;7C/`7X/$(,,[_T.!^P`! +M```/C",!``"+="04BWPD$#/`BD0D+E`SP&:+1"0J4/]6!(/$".E)`0``D&;' +M1P2-$&;'1P8!`(M$)"@E__\``%#_5AR(1"0S)?<```!0BT0D,"7__P``4/]6 +M!&H&,\!FBT0D.E#_5@0SP&:+1"0Z4/]6'&;'1Q(@`&:)1PR+1"109HE'$#/` +M9HM$)$(SR6:)3Q9FB4\4B4\89HE/'&IP4/]6!#/`9HM$)$90_U8<B$<@:/@` +M```SP&:+1"124/]6!#/`9HM$)%)0_U8<B$0D7H/$,*@@QT0D(``````/A(P` +M``#&1Q\")=\```!0,\!FBT0D*E#_5@2+1"1`)?__``!0_U8<C6X<B7PD'(ET +M)""-5@2+1"1$NZH````E__\``(OR@\`+@\0,B_@SP(K#4(O')?__``!0_Q9J +M8?]5`(O')?__``!0_U4`,]*#Q!"*TSO"#X2B_O__QT0D(`$```"+="04BWPD +M$.FB_O__D,9''P"+1"0H)?__``!0_U8<@\0$J0$```!U"(M$)""%P'01QD<> +M",9''P+&1R$$ZR6#Q@#&1QX`:G0SP&:+1"0N4/]6!#/`9HM$)"Y0_U8<B$<A +M@\0,BD<A/`1T"(I''@P#B$<>:/T````SP&:+1"0N4/]6!(U'(E`SP&:+1"0R +M:CQ05NC+9/__:D`SP&:+1"1&4/]6!#/`9HM$)$90_U8<P>`0B4<H:D$SP&:+ +M1"124/]6!#/`9HM$)%)0_U8<P>`(BU<H"\*)1RAH]P```#/`9HM$)%Y0_U8$ +M,\!FBT0D7E#_5AR#Q#RI`0```'0)QD<L$.L'@\8`QD<L!#/`BD0D+U"+1"0L +M)?__``!0_U8$N`$```"#Q`A=6UY?@\0@PXUT)@!7BWPD"#/`9HN'<`L``(/` +M'B7__P``4(N'7`L``/]0'"7W````4#/`9HN'<`L``(/`'B7__P``4(N'7`L` +M`/]0!&C^````,\!FBX=P"P``@\`=)?__``!0BX=<"P``_U`$,\!FBX=P"P`` +M@\`?)?__``!0BX=<"P``_U`<@\A`)?\```!0,\!FBX=P"P``@\`?)?__``!0 +MBX=<"P``_U`$:A2+AUP+``#_4#2#Q"1?PU>+?"0(:G`SP&:+AW`+``"#P!TE +M__\``%"+AUP+``#_4`0SP(I$)!10,\!FBX=P"P``@\`?)?__``!0BX=<"P`` +M_U`$,\"#Q!!?PY"-="8`5XM\)`A3,\!FBX=P"P``@\`>)?__``!0BX=<"P`` +M_U`<BM@SP(K#)?<```!0,\!FBX=P"P``@\`>)?__``!0BX=<"P``_U`$:G0S +MP&:+AW`+``"#P!TE__\``%"+AUP+``#_4`0SP(I$)"10,\!FBX=P"P``@\`? +M)?__``!0BX=<"P``_U`$,\"*PU`SP&:+AW`+``"#P!XE__\``%"+AUP+``#_ +M4`2#Q"1;7\.#QP!0BT0D&%>+?"0@5HMT)!13N00```#&1P$#QD<P`8@'BT0D +M(&:)1P2+1"0<9HE'#&:%SF:)=Q!FB4\2=`BX'````.L&D+@0````9L='%A`` +MB]8SR6:)3QR!XO__```#T(O&9HE7%"7__P``B4\84(M$)!C_4!R*V(O&)?__ +M``!`)?__``!0BT0D'/]0'(A$)!>#Q`BX<````")$)`^#^'!U"\9''C#&1R$$ +MZQJ0QD<>(HM$)"!F/80*=0>P(@P!B$<>QD<A_[@#````(L.*@`````"(1R"* +M1"0/J(!T$S/`BL,E_`````T``0``B_#K!)!F,_:!YO__``#!Y@N)=RB*1"0/ +MJ`AT)<9'+!"-1R*+3"044#/`9HM'%%!1Z$!=__^#Q`Q;7E^#Q`3#.__&1RP$ +MZ]D[_X'_`````('_`````(/L#%>_`0```%9358ML)"#'1"08`````(UU!(M4 +M)"0[^G1EC4<')?\```!0:)8```#_%F@!`0``_U4<P>`(:``!``"+V/]5'(/$ +M$`O#/80*```/A*0````]A0H``'0'/88*``!U(F@"`0``_U4<P?@$@^`#B\BX +M`0```-/@"T0D'(E$)!R#Q`1'@_\(?HUJ`(OU:)8```#_5@0SVX/$"(ML)"2+ +M?"0HB\NX`0```-/@BU0D&(70=5PSP&:+!%T`````4%;H9XS__X/$"(/X!75# +M5VH$:(0*``!5,\!FBP1=`````%!6Z-7]__^X`0```(/$&%U;7E^#Q`S#D&H` +M:)8```#_%H/$"#/`75M>7X/$#,,[_T.#^P1\C5U;7C/`7X/$#,.!_P````"! +M_P````!7BWPD"(M$)`R#P`<E_P```%!HE@```/]7!(M4)!B+3"044FH%:(4* +M``!1:`(!``#_5QS!^`19@^`#9HL$10`````E__\``%!7Z$+]__^#Q""X`0`` +M`%_#._^!_P````!7BWPD"(M$)`R#P`<E_P```%!HE@```/]7!(M4)!B+3"04 +M4FH&:(8*``!1:`(!``#_5QS!^`19@^`#9HL$10`````E__\``%!7Z.+\__]J +M`&B6````_U<$@\0HN`$```!?PSO_@?\`````@?\`````@^P45[\!````5E-5 +MBVPD*,=$)!@`````C74$C5T<C4<')?\```!0:)8```#_%F@!`0``_Q/!X`B) +M1"0<:``!``#_$XM4)""#Q!`+PF:)1"0B,\!FBT0D(CV$"@``#X2-````/84* +M```/A)8````]A@H```^$MP```.D:`0``._^+3"0PBT0D'%%J!&B$"@``4(M$ +M)#PE__\``%!3Z!_\__^#Q!BX`0```%U;7E^#Q!3#@\<`:@!HE@```/\6BTPD +M.#/`46H%9HM$)#)0BT0D0%<E__\``%!5Z./[__^X`0```(/$(%U;7E^#Q!3# +M@\<`BU0D&(E\)!Q"B50D&.F6````._]H`@$``/]5'(M4)#"#Q`3!^`2!XO__ +M``"#X`-FBP1%`````"7__P``.\)TA&@"`0``_U4<BU0D,(/$!,'X!('B__\` +M`(/@`V:+!$4`````)?__```[PG4\:@!HE@```/\6BT0D.%`SP&H&9HM$)#)0 +MBT0D0%<E__\``%!5Z#O[__^#Q""X`0```%U;7E^#Q!3#@\<`1X/_"`^.?/[_ +M_VH`B]UHE@```/]3!(M$)""#Q`B%P'0W@_@!#X2^_O__BU0D,(M$)"Q2:@1H +MA`H``&H`)?__``!04^C@^O__@\08N`$```!=6UY?@\04PUU;7C/`7X/$%,,[ +M_XUT)@!7BWPD"&:+AW(+``!FJ0(`=%<SP(J'>PL``(/`!R7_````4&B6```` +MBX=<"P``_U`$:`(!``"+AUP+``#_4!R#R`XE_P```%!H`@$``(N'7`L``/]0 +M!&H`:)8```"+AUP+``#_4`2#Q!Q?PY"-="8`4%=6BW0D%%.+7"0@BWPD)('[ +M/8,)`74(Q@<'ZP:#Q@#&!PC&1P$"QD<P`6:)=Q"Y!````&:)3Q)FA<Z+1"0< +MB5\$9HE'#'0(N!P```#K!I"X$````&;'1Q80`(O6,\EFB4\<@>+__P```]"+ +MQF:)5Q0E__\``(E/&%"+1"08_U`<B$0D$XO&)?__``!`)?__``!0BT0D'/]0 +M'(K8,\"#Q`B*P\'X!(O6@^`#@>+__P``9HL$10`````E__\``#O"=`HSP%M> +M7X/$!,.0N`,```"*5"0/(L+VPT"*@`````"(1R!T"\9''C#&1R$$ZPF0QD<> +M(L9'(?_VPX!T%S/`BD0D#R7\````#0`!``"+\.L&@\<`9C/V@>;__P``P>8+ +M]L,(B7<H=`C&1RP0ZP8[_\9'+`2-1R*+3"044#/`9HM'%%!1Z&=7__^#Q`RX +M`0```%M>7X/$!,,[_X'_`````%=6BT0D$,'@#(OX)?__```%@`P``"7__P`` +M4(M$)!#_4"2#Q`2+\('^/8,)`70(@?X]@PD"=2.+QR7__P``!80,```E__\` +M`%"+1"00_U`<@\0$J0$```!U"K@!````7E_#._^!Y___``"+1"0,@<>'#``` +M@>?__P``5_]0','X!(M4)!A25H/@`XM,)!Q19HL$10`````E__\``%"+1"0@ +M4.CY_?__@\087E_#@\<`5XM$)`A64U4S_XU8)(O'P>`,B_`E__\```6`#``` +M)?__``!0_Q.#Q`2+Z(']/8,)`70,@?T]@PD"#X6!````B\8E__\```6$#``` +M)?__``!0BT0D&/]0'(/$!*D!````=%Z!YO__``"+1"04@<:'#```@>;__P`` +M5O]0','X!(/$!(/@`S/29HM4)!AFBP1%`````"7__P``.\)U(XM4)!PSP%)5 +M5XM,)"!FBT0D)%!1Z#K]__^#Q!1=6UY?PSO_1X/_$`^,0____UU;7C/`7\.# +MQP"!_P````"!_P````!7BWPD"&:+AW(+``!FJ0(`=#XSP&:+AW`+``!`)?__ +M``!0BX=<"P``_U`<@\A`)?\```!0,\!FBX=P"P``0"7__P``4(N'7`L``/]0 +M!(/$#%_#._^!_P````"!_P````!7BWPD"&H`,\!FBT<6@\`4)?__``!0BX=< +M"P``_U`$,\!FBT<6@\`()?__``!0BX=<"P``_U`@@\0,)0`+```]``,``'42 +MN`$```"(1QM?P[@!````7\.0,\!FBT<6@\`&)?__``!0BX=<"P``_U`@@\0$ +MJ8````!UUC/`7\,[_U>+?"0(BD<;A,!U(C/`9HM'%H/`!B7__P``4(N'7`L` +M`/]0((/$!*F`````=!ZX`0```%_#@\8`QD<;`5?HCHS__[@!````@\0$7\-7 +MZ*Z*__^#Q`2%P'7?,\!?PX/'`&H`,\"+5"0(9HM"%H/`%"7__P``4(N"7`L` +M`/]0!#/`@\0(PX'_`````('_`````&C`````,\"+5"0(9HM"%H/`%"7__P`` +M4(N"7`L``/]0!(/$",.#QP`[_X'_`````%>+?"0(,\!FBX=P"P``@\`2)?__ +M``!0BX=<"P``_U`<@^`_4#/`9HN'<`L``(/`$B7__P``4(N'7`L``/]0!(/$ +M#%_#@?\`````@?\`````4(M$)`B*0!N$P'4JBT0D"&:+0!8E__\``(/`%27_ +M_P``4(M$)`R+@%P+``#_4!R#Q`2HP'0*N`$```"#Q`3#D#/`@\0$PSO_._^! +M_P````!7BWPD"&H`,\!FBT<6@\`4)?__``!0BX=<"P``_U`$,\!FBT<6@\`5 +M)?__``!0BX=<"P``_U`<@\0,J,"X`````%\/E<##._\[_X'_`````%<S_U-F +MBUPD#(L,O0````"%R708,\"+TV:+00B!XO__```[PG0.1X/_$7+=,\!;7\.# +MQP!;B\%?PX/'`(UT)@!7,_]3BUPD#(L,O0````"%R70-BU$$.]-T#D>#_Q%R +MZ#/`6U_#@\<`6XO!7\.#QP!7,_]64S/2BDPD&&:+?"04P><09HM4)!`+^C/V +MBQRU`````(7;=#>+$_?"P)\``'0GBT,$B]<E`/___X'B`/___SO"=1,SP#/2 +MBD,*BM$[PG4&B\-;7E_#1H/^$7*^6UXSP%_#@?\`````@?\`````N.P0``## +M._\[_X'_`````(/L"%>+1"005HMT)"2+$(M\)!B!^B"!``!T&5ZX!````%^# +MQ`C#._^X`@```%Y?@\0(PY!H[!```%?HH7K__V;'1P(``&;'!U*4,\F+1"0< +MB(^<"P``B8=<"P``BT0D)(F'9`L``(M$)"B)AV`+```SP(F/&`L``(H&4.B0 +M_O__@\0,A<")AV@+``!TFV8/M@9FB4<&BX=H"P``BT!`B8=L"P``9HM&$&:) +MAW`+``"+AV@+``"+0$!F@S@"=1IFBT849H7`=`EFB4<6ZPN#QP!FBT809HE' +M%F:+1BYFB8>`"P``BD8MB(=_"P``BX=L"P``A<!T"6H`5_]0!(/$"(N':`L` +M`(M(.(7)=`=7_U`X@\0$BD8BB(>""P``BD8CB(>#"P``BD8DB(>$"P``BD8E +MB(>%"P``BD8FB(>&"P``BD8GB(>'"P``BD8AB(=Z"P``BD8>B(=Y"P``BD8, +MB(=["P``BD8L/`1U#6;'AW(+`````.L+._]FQX=R"P```0"*1AZH`70H9HN' +M<@L``&8-``%FB8=R"P``BT0D'#T4[_\`=@M>N`,```!?@\0(PXI&'J@(=!)F +MBX=R"P``9@T$`&:)AW(+``"*1AZH!'029HN'<@L``&8-`"!FB8=R"P``BD8? +MJ!!T$F:+AW(+``!F#4``9HF'<@L``&:+1P9F/0,`=31FBT8,9H7`=!)FBX=R +M"P``9@T(`&:)AW(+``"*1A^H`G029HN'<@L``&8-$`!FB8=R"P``,\!FBT<& +M@_@+=`6#^`QU![@!````ZP(SP(7`=!F*1A^H`7029HN'<@L``&8-`!!FB8=R +M"P``9HM'!F8]#0!R-XI&'Z@(=!=FBX=R"P``9@V``&:)AW(+``#H.7+__XI& +M'Z@@=!)FBX=R"P``9@T@`&:)AW(+``"+AVP+``"%P'065_]0#(/$!(7`=0M> +MN`$```!?@\0(PV;'1P(0`(N';`L``&:#.`%U!,9'&@!>,\!?@\0(PSO_5HMT +M)`AFBX9R"P``9JD`0'0*N`$```!>PX/'`#/`9HL&/5*4``!U)&:+1@)F/2`` +M=AJ*AGP+``"$P'4*5O^6I`L``(/$!/Z&?`L``#/`7L,SP(M4)`1FBP(]4I0` +M`'4J9HM"`F8](`!V((J"?`L``(3`=!;^R(B"?`L``(3`=0I2_Y*H"P``@\0$ +MPY"-="8`,\"+5"0$9HL"/5*4``!U&&:+0@)F/2``=@Y2_Y*L"P``@\0$PX/' +M`#/`PY"-="8`5S/_5HMT)`PSP&:+!CU2E```=21FBT8"9CT@`'8:5O^6L`L` +M`(/$!(OX@_\!?@E6Z`MU__^#Q`2+QUY?PX/'`#/`BU0D!&:+`CU2E```=2!F +MBT("9CT@`'864O^2L`L``(/$!(7`N``````/E<##D#/`PY"!_P````"!_P`` +M```SP(M4)`1FBP(]4I0``'439HM"`F8](`!V"5+HH'3__X/$!,.!_P````"! +M_P````"#[!`SR8M4)!2*@0````!!@_E+B(0*0Q```'+MBH*""P``B(),$``` +MBH*""P``B()U$```BH+<$```B()?$```BH*#"P``B()-$```BH*#"P``B()V +M$```BH+=$```B()@$```BH*$"P``B().$```BH*$"P``B()W$```BH+>$``` +MB()A$```BH*%"P``B()/$```BH*%"P``B()X$```BH+?$```B()B$```BH*& +M"P``B()0$```BH*&"P``B()Y$```BH+@$```B()C$```BH*'"P``B()1$``` +MBH*'"P``B()Z$```BH+A$```B()D$```BH),$```#("(@DP0``!FQP0D`0"+ +M@F0+``!FQT0D#$L`!400``")1"0$C8)$$```B40D"&:+@KP.``!FA<!T$FH! +M:@"-1"0(4%+HS6[__X/$$(/$$,,[_XUT)@!0,\!7BWPD#%9FBT<"A<`/A)L` +M``"#^!`/A)H```"#^#`/A)$```"#^%!T"8/X8`^%SP```(J'?0L``*@##X2; +M````5XN';`L``/]0*#/2@\0$B_`E__\``&:+EY`0```KPF:)1"0(9CV@#W97 +MBH=]"P``)/R(AWT+``!H``$``%>+AVP+``#_4!QJ`#/`9HN'D!```('F__\` +M`%!6:@)J`&H%5^A';/__@\0DZS`[_S/`7E^#Q`3#7KCH`P``7X/$!,.0BT0D +M"&8]N`MV$&:)MY`0``!7Z-7]__^#Q`2*EX\0``"*PO["J`>(EX\0``!U$FB` +M````5XN';`L``/]0'(/$"%>+AVP+``#_4!"#Q`1>7X/$!,.0._^!_P````!3 +MBT0D"&:+4`1F_T@$9H72=0JX_____UO#@\<`BU0D"(M$)`R+"KL!`````]F) +M&HH1B!!;,\##D#O_@?\`````@^P,5HMT)!1FBT8"9CT0`'4*BX9L"P``A<!U +M&%ZX`@```(/$#,,[_[@!````7H/$#,,[_XM$)!AFBP`E__\``#U2E```=>&+ +M1"08BY9L"P``9HM``F:+$B7__P``@>+__P``.\)UP8M$)!B#P`2)1"0$BT0D +M&&:+0`1FB40D"(J&>@L``#P$=5^+CF@+``"+EF@+``!FBTD,@>'__P``@<D` +M@```9@N.<@L``&:)CG(+``"+4B")EJP+``"+EF@+``"+4AB)EK`+``"+EF@+ +M``"+4BB)EJ0+``"+EF@+``"+4C#K48/'`(N.:`L``(N6:`L``&:+20YF"XYR +M"P``9HF.<@L``(M2)(F6K`L``(N6:`L``(M2'(F6L`L``(N6:`L``(M2+(F6 +MI`L``(N6:`L``(M2-(F6J`L``(U$)`10:`````!6BX9L"P``_U`8@\0,7H/$ +M#,,[_X'_`````%"+1"0(5XH0C7@!A-)U)D>*3_^$R74>1XI7_X32=19'BE?_ +MA-)U#D>*3_^$R74&B@>$P'0',\!?@\0$PU^X`0```(/$!,,[_SO_@?\````` +M5XM\)`AFBT<"9CU!`'8_BU0D#%)7BX=L"P``_U`(BT0D%(/$"(7`="57Z'%J +M__^+CV`+``!1BX=<"P``_U`\9L='!```9L='`B(`@\0(7\.+5"0$BT0D"(F" +MD`L``&:+0@)F/4$`<@]J0%*+@FP+``#_4!R#Q`C#._^!_P````"+5"0$BT0D +M"(F"E`L``&:+0@)F/4$`=@]J(%*+@FP+``#_4!R#Q`C#._^!_P````!7BWPD +M"%.*1"00BI]]"P``B(=]"P``9HM'`F8]00!V10^^PS/2BE0D$#/"J0,```!T +M$F@``0``5XN';`L``/]0'(/$"(I$)!"H`W09]L,#=117BX=L"P``_U`H9HF' +MD!```(/$!%M?PSO_@?\`````5XM\)`A69HM'`F8]00!V+(M$)!2%P'4DQH=^ +M"P```6B`````5XN';`L``/]0'+@!````@\0(7E_#@\<`5XVWE!```(M$)!2Y +M%@```(OX,\#SI5]>7\,[_SO_@?\`````BT0D!`^_@+P.``##C70F`(M,)`1F +MBT$"9CU0`',.N`$```##N`(```##._\/OY&\#@``BT0D"$IFBP`E__\``#O" +M?>!J`(M4)!!2BT0D$%!1Z-II__\SP(/$$,.-="8`BU0D!+@@````#[^2M`L` +M`"O"PY"!_P````"!_P````!75HMT)`QFBX:T"P``9CT@`'P17K@"````7\.0 +MN`0```!>7\-FBX9R"P``9JD``701BT0D&(M4)!0#PCT````!=]IFBT8"9CU! +M`',(7K@!````7\-FBX::"P``9JD"`'0;,\"+3"089HN&F`L``#O(?0I>N`,` +M``!?PSO_BH:X"P``N1\````BR(M4)!"-#$G!X0.-O`Z\"P``B1>+5"04B5<$ +M9HM4)!AFB5<(BU0D'(E7%&:+1@)F/5``<@Y75HN&;`L``/]0)(/$"&;_AK0+ +M``"*EK@+``#^PC/`B):X"P``7E_#@\<`._^!_P````!J`8M4)`A2BX)L"P`` +M_U`$@\0(PX'_`````('_`````%!64XMT)!"*?"049HM&`F8]$`!T"UNX`0`` +M`%Z#Q`3#9HN&<@L``&:I`"!U3S/`BL>%P'0G@_@$="R#^!!T)X/X9'4*9HM& +M!F8]$P!T&+@"````6UZ#Q`3#@\<`BH9Y"P``J(!T%C/`9HM&!DB#^!-W"O\D +MA20'``"#QP!;N`,```!>@\0$PY!J`S/`9HN&<`L``(/``B7__P``4(N&7`L` +M`/]0!#/`9HN&<`L``(/``R7__P``4(N&7`L``/]0'(A$)!>#Q`RH`70)N!`` +M``#K!SO_N`0````STHK7.\(/A)\!```SP(I$)`N#\`$E_P```%`SP&:+AG`+ +M``"#P`,E__\``%"+AEP+``#_4`2#Q`CI;0$``)!H]P```#/`9HN&<`L``(/` +M'27__P``4(N&7`L``/]0!#/`9HN&<`L``(/`'R7__P``4(N&7`L``/]0'(/$ +M#(K8]L,!=`>X$````.L%N`0````STHK7.\(/A`\!```SP(K#@_`!)?\```!0 +M,\!FBX9P"P``@\`?)?__``!0BX9<"P``_U`$@\0(Z=\```"#QP`SP&:+AG`+ +M``!`)?__``!0BX9<"P``_U`<@\0$BMCVPPAT";@0````ZP<[_[@$````,]** +MUSO"#X2?````,\"*PX/P""7_````4#/`9HN&<`L``$`E__\``%"+AEP+``#_ +M4`2#Q`CK=#/`9HN&<`L``(/`$"7__P``4(N&7`L``/]0'(/$!(K8]L.`=`>X +M$````.L%N`0````STHK7.\)T.S/`BL,U@````"7_````4#/`9HN&<`L``(/` +M$"7__P``4(N&7`L``/]0!(/$".L,B+Z="P``B+Z>"P``@/\0=0]FBY9R"P`` +M9H/*`>L.._]FBY9R"P``9H'B_O]FB99R"P``6S/`7H/$!,.0@?\`````@?\` +M````BU0D!(I,)`AFBT("9CT0`'0.N`$```##N`(```##._]FBX)R"P``9JD( +M('42@/D/=^:+@F@+``"+0$2%P'4)N`,```##@\<`,\"*P5!2BX)H"P``_U!$ +M,\"#Q`C#@\<`5HMT)`A3BEPD$&:+1@)F/1``=!!;N`$```!>P[@#````6U[# +M9HN&<@L``&:I`"!UZS/`BL.#^`=^"SW_````#X7K`0``,\!FBT8&2(/X"W?+ +M_R2%=`<``#/`BL.#^`(/A,L!``"#^`0/A+X````]_P````^$MP$``&:+AG(+ +M``!FJ00`=9:+AF0+```]%.__`'>)BI9Y"P``@,H#B)9Y"P``@.+OB)9Y"P`` +MZ3<!```SP(K#@_@$=$,]_P````^$;`$``&:+AG(+``!FJ0P`#X5'____BX9D +M"P``/13O_P`/AS;___^*EGD+``"`R@.(EGD+``#I[0```#O_BI9Y"P``@.+\ +MB)9Y"P``Z=<````SP(K#@_@$=!,]_P````^$8O___^D'`0``@\<`BI9Y"P`` +M@.+\B)9Y"P``@,H0B)9Y"P``Z9X```"#QP`SP(K#@_@$="<]_P````^%T``` +M`(J6>0L``(#*`HB6>0L``(#B[XB6>0L``.MM._^*EGD+``"`XOV(EGD+``"` +MRA"(EGD+``#K43O_@/L$=$KIC@```#O_,\"*PX/X!'0K/?\```!U?&:+AG(+ +M``!FJ0`0#X57_O__BI9Y"P``@,H"B)9Y"P``ZQ$[_XJ6>0L``(#B_8B6>0L` +M`(N&:`L``(M`2(7`=!(SP(K#4%:+AF@+``#_4$B#Q`B+1"04B)YZ"P``BI9Y +M"P``B!"*AGD+``"H`7069HN6<@L``&:!R@`!ZQ1;N`(```!>PV:+EG(+``!F +M@>+__F:)EG(+``!;,\!>PU"X_P,``%=64XM<)!2+="089B/&)?__```]0`(` +M``^$\P```#V``@``#X3H````/<`"```/A-T````]``,```^$T@```#T@`P`` +M#X3'````/4`#```/A+P````]8`,```^$L0```(O&)?__``!0_U,<@\0$)>(` +M``"#^"(/A94```"+QB7__P``@\`#)?__``!0_U,<@\0$)<````"#^$!U=8O& +M)?__``"#P`0E__\``%#_4QR#Q`2I(````'58B\8E__\``(/`"27__P``4/]3 +M','@"(OXB\8E__\``(/`""7__P``4/]3'(/$"`O'9H7`="-FJ0$`=1V!YO__ +M``"#Q@R!YO__``!6_U,<@\0$J0@```!T"3/`6UY?@\0$PUM>7[@!````@\0$ +MPXUT)@"#[!!75E-5C40D'XML)"2)1"04:/@,``#_51PS_X/$!(K8C74<:F'_ +M%FCX#```_Q8STH/$"(K3.]!T";\!````ZQ`[_T>#_S)\VXM$)!0S_X@8A?\/ +MA<D```"*1"0?J`$/A;T```"-1"0?B40D%&CZ#```_U4<,_^#Q`2*V(UU'&IA +M_Q9H^@P``/\6,]*#Q`B*TSO0=`J_`0```.L1@\<`1X/_,GS:BT0D%#/_B!B% +M_W5Q:/@,``#_51R(1"0C@\0$)?\```"I\````'03@^`.@_@(N``````/E,#K +M!8/'`#/`A<!U/6H.:/@,``#_501J8?]5'&CX#```_U4<@\00@_@.=1YJ`&CX +M#```_U4$:F'_51QH^`P``/]5'(/$$(7`=`TSP%U;7E^#Q!##@\<`75M>N`$` +M``!?@\00PX/'`(/L#%:+="044U;HD08``(/$!(7`=2-6Z*3^__^#Q`2%P'0) +MN@(```#K&#O_5NCN!@``@\0$A<!T![H!````ZP(STH72=$*#^@%T08/Z`G4N +M:A!H^`P``/]6!(M4)"R+3"0H4E&+1"0L4%;H(00``&H`B]AH^`P``/]6!(/$ +M((O#6UZ#Q`S#._\SV^ORBU0D)(M,)"!248M$)"105NA_`@``B]B#Q!#KUCO_ +M@?\`````5XM$)`A6BW0D%(L0BWPD$('Z(($``'007K@#````7\.X`0```%Y? +MPS/`BD8(4#/`9HM&`E`SP&:+!E#HX.K__X/$#(O(A<ETUXI&#H3`==!FBT8$ +M9JD!`'3&9HL6BT0D#&:)5P1FBU8"9HE7!HI6/(A7((M6,(/B_(E7*(I6#(A7 +M+6:+5@1FB5<NBE$(B!=75E#_412#Q`Q>7\.0C70F`(/L#%.+1"04BQ"!^B"! +M``!T$ENX_____X/$#,,SP%N#Q`S#D(M$)!S!X`R+V"7__P``!8`,```E__\` +M`%"+1"08_U`D4.@&ZO__B40D#(/$"(7`=,<SP&:+PP6$#```)?__``!0BT0D +M&/]0'(/$!*D!````=*:+3"08BT0D'%%0BU0D'(M$)`Q2_U!,@\0,6X/$#,.! +M_P````"!_P````"#[`Q7BWPD%%.+%X'Z(($``'056[C_____7X/$#,,[_S/` +M6U^#Q`S#BT0D((/`!R7_````4&B6````_U<$:`$!``#_5QS!X`AH``$``(O8 +M_U<<:@`+PXO8:)8```#_5P2!X___``!3Z$3I__^)1"0H@\0<A<!TJ8M,)!R+ +M1"0@45!7BT0D&/]03(/$#%M?@\0,PSO_@?\`````@?\`````5HMT)`Q3BUPD +M(#/`BD8(4#/`9HM&`E`SP&:+!E#H'NG__X/$#(O(A<ET"HM$)!R+$870=0<S +MP%M>PSO_9HL6B\%FB5,$9HM6`F:)4P9F#[94)!1FB5,,9@^V5"089HE3#HI6 +M/(A3((M6,(/B_(E3*(I6#(A3+6:+5@1FB5,NBE$(B!-;7L,[_SO_@?\````` +M@^Q4,\E75E-5BT0D;(E,)&")1"1<BT0D:(E,)%"-6`R->"2+1"1P)<"?``") +M1"14BVPD4,'E"X'-````@%5H^`P``/\3OL#___^#Q`B-1D`+Q5!H^`P``/\3 +M:/P,``#_%XE$-%R#Q`R#Q@1\X(M4)%R^0````%*+3"1848M$)%B#X!]0BT0D +M7,'X!27_````4(U$)"!0BT0D?%#HT/[__X/$&(OPA?8/A)L```"+1"049JD! +M`'4L9H-,)!0!B\6#R`10:/@,``#_$XM$)!PE_P```%"+1"1T:/P,``#_4`2# +MQ!"+5"1<C40D$%)0BTPD<%'_5A2#Q`R%P'0Q@_@"=4>#S015:/@,``#_$XM$ +M)!PE__\``(/(!"7_````4(M$)'1H_`P``/]0!(/$$/]$)&"+1"1TBU0D8#O0 +M?1^+3"1<@\$TB4PD7(M$)%!`B40D4#T``@``#XS4_O__75M>BT0D5%^#Q%3# +M._^!_P````"#[%@SR5=64U6+1"1PB4PD8(E$)%B+1"1L@\`$B4PD7(E$)%2+ +M1"1LC7@@BT0D7"7_````4(M$)%AH^@P``/\0QT0D6`````"#Q`B+1"10P>`( +M#0#```"+Z"7__P``4/\7@\0$/8T0```/A0(!``"+1"1L,_:-6"2+Q8T6)?__ +M```+PB7__P``4/\3B40T%(/$!(/&!(/^0'S>P?X"BU0D6%*!YO\```"+1"1X +MBTPD<"7`GP``4(M$)%A6)?\```!0C40D(%!1Z#3]__^#Q!B+\(7V#X28```` +MBT0D%&:I`0!U*6:#3"04`8M$)!0E_P```%"+Q27__P``@\@$)?__``!0BT0D +M7/\0@\0(BT0D6(M4)&Q0C40D%%!2_U84@\0,A<!T,(/X`G5'BT0D%('E__\` +M`"7__P``@\T$@\@$@>7__P``)?\```!0BT0D6%7_$(/$"(M,)&"+1"1X08E, +M)&`[R'TQBU0D6(/"-(E4)%B+3"1008E,)%"#^1`/C,C^__^+1"1<0(E$)%P] +M``$```^,E/[__UU;7HM$)%1?@\18PY"!_P````"!_P````!75E-59HML)!B+ +M="04B\4E__\``%#_5APS_X/&'(K8@\0$:F'_%HO%)?__``!0_Q8STH/$"(K3 +M.]!T#;@!````75M>7\.#QP!'@_\R?-2+1"0<B!A=6UXSP%_#D(UT)@!7BWPD +M"&CX#```_U<D@\0$J0```']U2&@```"`:/@,``#_5PQJ8?]7'&CX#```_U<D +M@\00/0```(!U)&BG`P"`:/@,``#_5PQJ8?]7'&CX#```_U<D@\00/:0#`(!T +M!3/`7\.0:@!H^`P``/]7#(/$"+@!````7\,[_X'_`````%>+?"0(:/@,``#_ +M5R2#Q`2I````?W5(:````(!H^`P``/]7#&IA_U<<:/@,``#_5R2#Q!`]```` +M@'4D:*0#`(!H^`P``/]7#&IA_U<<:/@,``#_5R2#Q!`]I`,`@'0%,\!?PY!J +M`&CX#```_U<,@\0(N`$```!?PSO_@?\`````BU0D!%+H]O[__X/$!(7`=1>+ +M3"0$4>@%]___@\0$A<!T#K@"````P[@!````PSO_BT0D!%#H1O___X/$!(7` +M=><SP,.!_P````"!_P````"+3"0$9HM!`F8]$`!T#K@!````P[@#````PSO_ +M9HM!!F8]#0!R[HM4)`@SP(F1$`L``(M4)`R)D10+``"+5"00B9$8"P``PY!5 +MB^Q65XMU"(M]#(M-$/.D7UY=PT`H(RET<FQL9"YC("12979I<VEO;CH@("`Q +M+C$@("0`3VQI8V]M(%123$Q$(#$N,BXP(`HD"E`*5`HP"D`*8`IP"@D#"@M` +M`H`"P`(``R`#0`-@`P(````````````````````````````````````````` +M`````````````````````````````````````/P7``!I&```:1@``&D8``!@ +M&```:1@``$@8``!I&```/!@``&D8``!I&```:1@```@8``#X7@``$&```/AB +M``"P8P``7E\``!AD``!>7P```P`````````````````````````````````` +M````````````````````````````````````````0/_______P`````$```` +M```````````````````````````````````````````````````````````` +M```````````$$`!D````"0,*"P4&!P0!``````````$````20!``#``,```` +M```````````````````````````````````````````````````````````` +M``````````````````D*"PP/`P4'!08'``$#!`0("``%"`8(!P@``0(#"`@$ +M`P0'!08``0("````1I(```(````20!``#``,```````````````````````` +M``````````````````````````````````````````````````````````0` +M```VE````P````(````````````````````````````````````````````` +M````````````````````````````````````````````"````(0*```$```` +M`D`````````````````````````````````````````````````````````` +M```````````````````````````````(````A0H```4````"0``````````` +M```````````````````````````````````````````````````````````` +M``````````````````@```"&"@``!@````)````````````````````````` +M```````````````````````````````````````````````````````````` +M````$````#V#"0$'````$D`0``P`#``````````````````````````````` +M```````````````````````````````````````````````````0````/8,) +M`@@````20!``#``,```````````````````````````````````````````` +M`````````````````````````````````````$````"-$`$`"@`!``@,```` +M```````````````````````````````````````````````````````````` +M````````````````````````0````(T0`0`+``(#"`PHA/[__O\````````` +M```````````````````````````````````````````````````````````` +M``````````"`````C1`!``P``P`(#`@$_O\````````````````````````` +M```````````````````````````````````````````````````````````! +M``"-$`0`#0`"````"``````````````````````````````````````````` +M``````````````````````````````````````````````(``(T0!``.``,` +M```(```````````````````````````````````````````````````````` +M````````````````````````````````!```C1`'``\``0$```@````````` +M```````````````````````````````````````````````````````````` +M``````````````````"```"-$`4`$@`"````"``````````````````````` +M```````````````````````````````````````````````````````````` +M``````@``(T0"``3``$"```(```````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````!!`P````"``@```````PG#T]`,`.(0!``I``P`` +M```````&P`$``0`&P`*````,P`L0`%IX:U$````20`P`,C`R,#(P.398-3<V +M``!L``$`>``!``@!`0"8`0$`F`$!`)@!`0"8`0$`F`$!`&P``0```@$```(! +M```"`0!H`@$`:`(!`&@"`0!L``$`;``!`&@"`0!H`@$`:`(!`"P#`0!H`P$` +MP`,!`"`$`0!<!`$`7`0!`%P$`0!<!`$`+`,!`*@$`0"T!`$`M`0!``0````, +M`````0```%-#3P`!``$``0````@``0(``````````````````````0`````` +M````````!`#Q_P````````````````,``0`````````````````#``(````` +M`````````````P`#``````````````````,`!``````````````````#``4` +M`````````````````P`&``````````````````,`!P`````````````````# +M``@``````````````````P`)``````````````````,`"@`,```````````` +M```$`/'_%````'`/`0!$`````@`!`",````0#@$`7`````(``0`O````8`H! +M`(@````"``$`-@```/`*`0!H`0```@`!`$````!@#`$`I`$```(``0!*```` +M\`X!`'@````"``$`60```'`.`0!X`````@`!`&4```"0!@$`0`$```(``0!Q +M````\/H``#@````"``$`>0```(#X``!,`0```@`!`(8```"@\P``9`````(` +M`0"0````</,``#`````"``$`F0```##S```\`````@`!`*0```"P[0``6`$` +M``(``0"U`````.@``#0!```"``$`Q@```.#7``#H`````@`!`-T```#PU@`` +MY`````(``0#S````X,<```@(```"``$`_P````#%``#8`@```@`!``H!``!0 +MQ```K`````(``0`@`0``H,,``*0````"``$`-0$``+"Z```8`````@`!`#\! +M``!@N@``'`````(``0!)`0``0+H``!P````"``$`4@$``&`%`0`L`0```@`! +M`&`!``"0_```2`````(``0!G`0```+0``)0````"``$`<P$``%"P``#<```` +M`@`!`'\!```0L```0`````(``0"*`0``T*\``$`````"``$`E@$``)"O``!` +M`````@`!`*`!```0KP``@`````(``0"M`0``0*T``-0````"``$`N0$``#"K +M```(`@```@`!`,<!``!@J@``R`````(``0#3`0``@*D``-0````"``$`X`$` +M`("G``#X`0```@`!`.T!```@K@``\`````(``0#Y`0``\*(``(0$```"``$` +M!`(``("Z```H`````@`!``P"````H@``\`````(``0`6`@``V`8``$L````! +M``(`)P(``)0&``!$`````0`"`#,"``"`U@``<`````(``0!(`@``,+$``,@" +M```"``$`6@(``$0&``!0`````0`"`&8"``#T!0``4`````$``@!R`@``I`4` +M`%`````!``(`?@(``%0%``!0`````0`"`(H"``"0PP``$`````(``0">`@`` +M$+H``"P````"``$`J0(``)#!``#\`0```@`!`+H"```$!0``4`````$``@#& +M`@``X/(``$@````"``$`T@(``)#R``!(`````@`!`-X"``"T!```4`````$` +M`@#H`@``$/(``"@````"``$`\P(``.#Q```D`````@`!`/\"``"`\0``8``` +M``(``0`+`P``9`0``%`````!``(`%0,``$#R``!$`````@`!`"8#````\0`` +M@`````(``0`R`P``%`0``%`````!``(`/`,``,0#``!0`````0`"`$<#```0 +M[P``L`````(``0!4`P``H/```%0````"``$`80,``,#O``#4`````@`!`&H# +M``!T`P``4`````$``@!U`P``T.H``&0````"``$`A`,``"0#``!0`````0`" +M`(X#``!PZ@``6`````(``0"=`P``U`(``%`````!``(`IP,``$#I```D`0`` +M`@`!`+8#``!`[0``;`````(``0#"`P``0.L``/P!```"``$`RP,``(0"``!0 +M`````0`"`-4#``!0YP``L`````(``0#@`P```.<``$P````"``$`\0,``%#B +M``#D`````@`!```$``!0Y@``L`````(``0`1!```X-X``"0````"``$`'P0` +M`(#>``!@`````@`!`"X$```0WP``.`,```(``0`_!```0.,```P#```"``$` +M2`0``#0"``!0`````0`"`%($``#0W0``I`````(``0!=!```$-T``,`````" +M``$`;@0``*#<``!D`````@`!`'T$``!0W```2`````(``0".!```,-H``!0" +M```"``$`EP0``.0!``!0`````0`"`*$$``#<`0``"`````$``@"M!```S`$` +M`!`````!``(`N00``,0!```(`````0`"`,$$``"\`0``"`````$``@#.!``` +MT-@``&`!```"``$`UP0``&P!``!0`````0`"`.$$``!H`0``!`````$``@#H +M!```9`$```0````!``(`]`0``%P!```(`````0`"`/T$``#PSP``+`````(` +M`0`0!0``@-4``/0````"``$`)P4``"#0``#\`P```@`!`#<%```@U```8`$` +M``(``0!,!0``)`$``#@````!``(`7@4``!@!```*`````0`"`'$%``#0N@`` +M8`(```(``0"#!0``(,$``'`````"``$`F04``#"]``#D`@```@`!`*@%```@ +MP`````$```(``0"\!0``X````#@````!``(`S04``-"A```H`````@`!`-D% +M``"`H0``2`````(``0#E!0``T)\``+`!```"``$`]@4``$"=``"0`@```@`! +M``@&``"@FP``E`$```(``0`>!@``()@``'@#```"``$`-`8``'"7``!0```` +M`@`!`$@&``"0D```H`4```(``0!=!@``T(\``,`````"``$`;P8``+"/```@ +M`````@`!`(4&``!PCP``0`````(``0"9!@``0(\``"@````"``$`K`8``)". +M```H`````@`!`,4&``!`C```*`````(``0#5!@``$(P``"@````"``$`X@8` +M`/"$``"(`P```@`!`/0&``"PA```/`````(``0#\!@``((0``(P````"``$` +M!@<``/"#```H`````@`!`!0'```P@P``N`````(``0`D!P```(,``"@````" +M``$`+@<``%!^``"P!````@`!`#<'``"`?```R`$```(``0!%!P``\'H``(P! +M```"``$`50<``'!V``!T!````@`!`%T'``!0=@``&`````(``0!E!P``\'4` +M`%@````"``$`;0<``*!U``!0`````@`!`','```0=0``D`````(``0![!P`` +M`'0``#@````"``$`AP<``.!S```@`````@`!`)`'``"0<P``1`````(``0"= +M!P``,',``%P````"``$`J`<``*!P``"8`````@`!`+$'``"0;P``0`````(` +M`0"W!P``(&\``"P````"``$`P`<```!O```<`````@`!`,P'```0;0``Z`$` +M``(``0#C!P``4&P``+P````"``$`]`<``)!K``"T`````@`!``0(````:P`` +MC`````(``0`-"```$&H``.0````"``$`&`@`````````!````0`#`"$(``#P +M:```'`$```(``0`I"```D&@``%@````"``$`-P@``!"-``!T`0```@`!`$8( +M```P9```3`$```(``0!4"```@(@``"`!```"``$`:@@``#"6```X`0```@`! +M`'X(``#`EP``5`````(``0"-"```$%X``!0&```"``$`G0@``*!=``!H```` +M`@`!`*H(``"06```!`4```(``0"V"```P%<``-`````"``$`QP@``,".``"` +M`````@`!`-4(``#`C```3`````(``0#E"```<(P``$P````"``$`^@@``,"* +M``!(`0```@`!``8)``"@B0``'`$```(``0`2"0``L%0``!`#```"``$`)@D` +M`)!0```4!````@`!`#8)``!`3P``1`$```(``0!$"0``,$X``!`!```"``$` +M40D``*!,``"0`0```@`!`%\)````3```E`````(``0!M"0```'```)0````" +M``$`=0D``"!+``#@`````@`!`'T)``"`2@``E`````(``0"'"0``L$@``-`! +M```"``$`E`D``&!&``!,`@```@`!`)P)``!010``$`$```(``0"E"0```$4` +M`$P````"``$`K0D``*!"``!@`@```@`!`+0)``#`/@``V`,```(``0#!"0`` +M@&<``!`!```"``$`SPD``+`T```<`@```@`!`-P)```P,P``@`$```(``0#I +M"0``8#```$0"```"``$`]@D``(`F``"(!@```@`!``@*``#0%0````,```(` +M`0`5"@``@&4``#P!```"``$`(@H````5``#$`````@`!`"T*``!0#```K`@` +M``(``0`W"@``L`H``*`!```"``$`1`H``,!F``"X`````@`!`$\*``#P"0`` +MN`````(``0!@"@``0'(``.@````"``$`<`H``-!O```L`````@`!`'@*``"` +M!P``<`(```(``0"""@``X`(``)0$```"``$`D0H``%!O```\`````@`!`)8* +M````````V`(```(``0"?"@``C`````$````!``(`J`H``!`M``!$`P```@`! +M`+@*``"`(P``^`(```(``0#("@``\!X``)`$```"``$`V0H``+`R``!T```` +M`@`!`.D*``#0&```(`8```(``0#Y"@``0'0``+`````"``$`!`L``-`V``#L +M!P```@`!``P+```@<@``'`````(``0`6"P``\'0``"`````"``$`(PL``$!Q +M``#@`````@`!`"P+``!4````.`````$``@!#"P``1@````X````!``(`40L` +M`$(````$`````0`"`%H+```Z````"`````$``@!F"P``,@````@````!``(` +M;PL``"`````2`````0`"`'<+````````(`````$``@!["P``\+8``%0"```2 +M``$`A0L``%#X```D````$@`!`)\+``!@_@``#````!(``0"Q"P``P/X``!0` +M```2``$`P@L``&#W```\````$@`!`,X+``#@_```4````!(``0#9"P```/X` +M`%@````2``$`[`L``-`'`0"H````$@`!`/D+``!@_0``*````!(``0`3#``` +MH+0``%`"```2``$`'0P``.#^``#H````$@`!`#(,``#0_P``%````!(``0!! +M#```,/T``"@````2``$`5@P``,`)`0"4````$@`!`&D,``#0^0``&`$``!(` +M`0!S#```P`\!`$@````2``$`@@P```@0`0``````$``!`(P,```0^```-``` +M`!(``0"E#```\/\``+0"```2``$`LPP``"`)`0"4````$@`!`,<,```@]``` +M\`(``!(``0#8#```@`@!`)P````2``$`YPP``!#T```(````$@`!`/@,```P +M^P``6`$``!(``0`�``D/T``&@````2``$`'@T``'#^``!,````$@`!`#$- +M``"P`@$`8````!(``0!##0``H/<``"P````2``$`60T``%"Y``"T````$@`! +M`&X-```0]P``4````!(``0![#0``$`,!`%`"```2``$`APT``-#W``!````` +M$@`!``!T<FQL9&5L9BYO`'1R;&QD+F,`4$-)0DE/4U!R97-E;G0`4$-)0VAE +M8VM296<`06-C97!T`%!#23%3=V5E<`!00TDR4W=E97``3VQD4$-),5!R97-E +M;G0`4$-),5!R97-E;G0`4$-),E!R97-E;G0`1V5T0V]D90!396YD5%101G)A +M;64`4$-)3&]O:W5P`$QO;VMU<$E$`$QO;VMU<%1Y<&4`0V]N9C,Q,S-3;&]T +M0F%S90!#;VYF,S$R.5-L;W1"87-E`$)U;&QS97EE5W)I=&524$Q%15!R;VT` +M0G5L;'-E>65296%D4E!,1450<F]M`$1R86EN4EA&:69O`&1R86EN7W1X<G@` +M2&%W:V5Y95=R:71E4E!,1450<F]M`$AA=VME>65296%D4E!,1450<F]M`$5% +M35-$96QA>0!%15!O<G1/=70`1450;W)T26X`3D4R,#`P4')E<V5N=`!Z97)O +M97,`07-I8T5%4F5A9$(`07-I8T5%5W)I=&4`1457<FET94)I=`!%14-L;V-K +M1&]W;@!%14-L;V-K57``145#;&]C:U!U;'-E`$5%5W)I=&53=&]P`$5%5W)I +M=&5286YD;VT`07-I8T5%4F5A9%<`1457<FET95-T87)T`$5%1'5M;7E7<FET +M90!%15=R:71E0GET90!%15)E861">71E`$5%1&5L87D`145296%D0FET`%12 +M;&QD5%105&5M<&QA=&4`061A<'1E<DQI<W0`0G5L;'-E>65(5T-O;F9I9TEN +M:70`0G5L;'-E>6500TE#;VYF:6<`3T,S-30P5&%B;&4`3T,S,C4P5&%B;&4` +M3T,S,30Q5&%B;&4`3T,S,30P5&%B;&4`2&%W:V5Y94A70V]N9FEG26YI=`!% +M;F%B;&500TDT`$AA=VME>6500TE#;VYF:6<`3T,S,3,Y5&%B;&4`1&ES86)L +M95!#23,`4')E<V5N=%!#23,`4$-),U1A8FQE`$5N86)L95!#23(`1&ES86)L +M95!#23(`4')E<V5N=%!#23(`4$-),E1A8FQE`%!#23%(5T-O;F9I9TEN:70` +M1&ES86)L95!#23$`4$-),51A8FQE`$5)4T$R5&%B;&4`0V]N9C,Q,S-3;&]T +M`$5)4T%/<&5N26YI=`!#;VYF,S$S,P!%25-!,51A8FQE`$U#03-3;&]T0V]N +M9FEG`$U#03-486)L90!-0T$R4VQO=$-O;F9I9P!-0T$R5&%B;&4`34-!,5-L +M;W1#;VYF:6<`34-!3W!E;DEN:70`0V]N9C,Q,CD`34-!,51A8FQE`$E303-3 +M971$34$`25-!,U-E=$EN=&5R<G5P=`!)4T$S2%=/<&5N26YI=`!)4T$S2%=# +M;VYF:6=);FET`$5N86)L93,Q,3A024\`1&ES86)L93,Q,3A024\`25-!,U!) +M3TEN=&5R<G5P=`!#;VYF,S$Q.`!)4T$S5&%B;&4`25-!,E-E=$1-00!)4T$R +M4V5T26YT97)R=7!T`$E303)(5T]P96Y);FET`$E303)(5T-O;F9I9TEN:70` +M0V]N9C,Q,3<`25-!,E1A8FQE`$E303)$34%":71S`$E303));G1":71S`$E3 +M03)$34$`25-!,DEN=$QE=F5L`$-O;F8S,3$U`$E303%486)L90!)4T%$34$` +M25-!26YT3&5V96P`145?4U!%140`0G5L;'-E>65"87-I8U)E<V5T`$)U;&QS +M97EE0V]N;F5C=$]P=&EO;G,`0G5L;'-E>65297-T87)T`$)U;&QS97EE0V]D +M941O=VYL;V%D`$)U;&QS97EE26YT97)F86-E`%181')A:6Y&<F%M94AE861E +M<@!(87=K97EE0F%S:6-297-E=`!(87=K97EE0V]N;F5C=$]P=&EO;G,`2&%W +M:V5Y95)E<W1A<G0`2&%W:V5Y94-O9&5$;W=N;&]A9`!(87=K97EE26YT97)F +M86-E`$1I<V%B;&500TDT`%!R97-E;G100TDT`$AA=VME>65);G1E<G)U<'0` +M5')A;G-M:71);G1E<G)U<'0`4W!I;C-296-E:79E26YT97)R=7!T`%-P:6XR +M4F5C96EV94EN=&5R<G5P=`!(87=K97EE4F5A9$U!0U1I;65R`$AA=VME>653 +M971U<%1R86YS;6ET`%-E;F10;VQL26UM961I871E`$AA=VME>65#;&]S94-O +M;7!L971E9`!(87=K97EE4V5T=7!#;VUM86YD`$AA=VME>65.;T]P97)A=&EO +M;@!(87=K97EE4F5A9$5R<F]R0V]U;G1E<G,`2&%W:V5Y94U!0U)E<V5T`$AA +M=VME>65#;&]S90!(87=K97EE2%=/<&5N26YI=`!'971,;VYG`$%S:6-#:&5C +M:P!00TE(5T]P96Y);FET`%!#25!)3TEN=&5R<G5P=`!%;F%B;&500TD`1&]0 +M0TE024\`4$-)4$E/4')E<V5N=`!00TE(5T-O;F9I9TEN:70`061P5'EP90!% +M14=E=$1/`$5%0VQE87(`1453970`0VAE8VM)9`!'971435-3:&]R=`!30T)# +M;&5A<@!3=&%R=$-O;6UA;F0`5$U30V]M;6%N9`!T;7-?;W5T,@!D;W5T,@!T +M;7-S:&]R=`!3=&]R95IE<F]E<P!2971U<FY#;VUP;&5T961"=69F97)S`%!R +M;VUI<V-U;W5S0VAE8VL`5')A8V54;V]L4F5M;W9E`$-20T-H96-K`$-O;7!U +M=&5#4D,`0U)#5&%B;&4`0U)#26YI=`!3971U<%1R86YS;6ET`%5P9&%T94-O +M=6YT97)S`$5X96-);G1E<G)U<'0`2&%W:V5Y95)E861087)A;65T97)S`$AA +M=VME>653971U<%)E8V5I=F4`2&%W:V5Y94U!0TEN:70`4W1A='5S26YT97)R +M=7!T`$AA=VME>65297-E=`!(87=K97EE4&]L;`!(87=K97EE57-E<D-L;W-E +M`$AA=VME>65296]P96X`2&%W:V5Y95-E=$=R;W5P`$AA=VME>653971&=6YC +M=&EO;F%L`$AA=VME>65/<&5N`$EN:71#;VUM86YD`$AA=VME>653=&%R=$-O +M;6UA;F0`3VQD4$E/26YT97)R=7!T`%!R97-E;G1/;&1024\`16YA8FQE36%S +M=&5R`$1I<V%B;&5-87-T97(`4')E<V5N=$UA<W1E<@!T;7-?:6XR`%=A:710 +M24\`4F5A9$5%0DE!`%1-4U!#24-O;F9I9P!296%D0DE!`$-H96-K0DE!`$5% +M4&%U<V4`145296%D`$5%3W5T3F]R;4-M9`!2971U<FY"=69F97)S`%)E;W!E +M;E!H87-E,@!296]P96Y0:&%S934`4F5O<&5N4&AA<V4V`%1R86YS9F5R26YI +M=$)L;V-K`%1-4TEN=&5R<G5P=`!297-E=$)U9F9E<G,`4FEN9U-T871U<P!4 +M>%)X4W=E97``061A<'1E<D-H96-K`%-E;F13=&%T=7,`0V]M;6%N9$-O;7!L +M971E9`!297-P;VYD17)R;W)L;V<`=&US;&]N9P!$;T-O;6UA;F0`4F5A9%!A +M<F%M971E<G,`9&EN,@!435-#:&5C:P!%141)0V]P>0!435-296%D34%#5&EM +M97(`5$U34V5T=7!296-E:79E`%1-4U-E='5P5')A;G-M:70`5$U34V5T=7!# +M;VUM86YD`%1-4T-O9&5$;W=N;&]A9`!435--04-);FET`%1-4U!O;&P`5$U3 +M7T-H96-K`%1-4U5S97)#;&]S90!435-297-E=`!0;W=E<DU!0TA?5$U326YT +M97)F86-E`$Y%,C`P,%!O<G1486(`26YT3&5V96P`:7AT;W1M<V)A<V4`:7AT +M;V)A<V4`5%)L;&1)1`!?5E\`5%)L;&1&:6YD`%12;&QD26YT97)R=7!T4&]S +M=%-E<G9I8V4`5%)L;&14<F%N<VUI=$9R964`5%)L;&1296-E:79E1G)E90!4 +M4FQL9$5N86)L90!44FQL9$-L;W-E`%12;&QD1V5T4W1A=&ES=&EC<P!44FQL +M9$9I;F100TD`5%)L;&13971&=6YC=&EO;F%L061D<F5S<P!44FQL9$]P96X` +M5%)L;&1296-E:79E1G)A9VUE;G0`5%)L;&1%;65R9V5N8WD`5%)L;&13971' +M<F]U<$%D9')E<W,`5%)L;&1-0T%3;&]T0V]N9FEG`%12;&QD4&]L;`!44FQL +M9$%D9$UE;6]R>0!44FQL9$-O<'D`5%)L;&1);G1E<G)U<'10<F5397)V:6-E +M`%12;&QD4V5T4W!E960`5%)L;&1%25-!4VQO=$-O;F9I9P!44FQL9$%D87!T +M97));FET`%12;&QD4$-)0V]N9FEG`%12;&QD061A<'1E<E-I>F4`5%)L;&1$ +M;W=N;&]A9`!44FQL9%-E=%!R;VUI<V-U;W5S36]D90!44FQL9%1R86YS;6ET +M1G)A;64`5%)L;&13971);G1E<G)U<'0`5%)L;&1);G1E<G)U<'10<F5S96YT +M`%12;&QD24]!9&1R97-S0V]N9FEG`%12;&QD1&ES86)L90!44FQL9%-E=$1- +M00!44FQL9$EN=&5R<G5P=%-E<G9I8V4``"YT97AT`"YD871A`"YB<W,`+FYO +M=&4`+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5L+G1E>'0`+G)E;"YD +M871A`"YC;VUM96YT`'L(```!T@``.PH```'4``#V%P```0,``#@F```!U``` +M@S````'4``!B,0```=0``&0R```!U```[#(```'4``![-````<D``*`U```! +MZ```J#4```'H``"Q-0```>@``+LU```!Z```Q34```'H``#/-0```>@``#<V +M```!R```UCH```''``#C/@```=@```L_```!V```(S\```'8``!+/P```=@` +M`&,_```!V```BS\```'8``"C/P```=@``,L_```!V```&T````'8``!!0``` +M`=@``)%````!V```MT````'8```U00```=@``%9!```!V```?D$```'8``"6 +M00```=@``+Y!```!V```#D(```'8```T0@```=@``-E"```!V```,D,```'8 +M``!:0P```=@``*I#```!V```T$,```'8``!X1````=@``*!$```!V```N$0` +M``'8``#F1````=@``/)>```!`P``\F@```&F``!2:0```:8``&!I```!I@`` +M<6D```&F``!^:0```:8``)5I```!I@``G6D```&F``"F:0```:8``*QI```! +MI@``M6D```&F``##:0```:8``-9I```!I@``Y&D```&F``!):@```:8``'=J +M```!I@``B6H```&F``";:@```:8``*UJ```!I@``V6H```&F``"@<P```=0` +M`+EU```!V```Z'4```'8```)=@```=@``$!V```!V```SXL```'H```6F0`` +M`OH``'29```"^@``N)D```+Z``#>F0```OH``)2S```!<```@;<```$W``!' +MN````><``+JX```!-P``O;D```$W``!GRP```78``&;9```!;P``#MH```%N +M``!NVP```6L``.+;```!:@``9MT```%K``!^W0```6D``"3>```!:@``,]X` +M``%H``#.Z````>4``/[I```!YP``(.H```'G``"NZ@```><```[K```!YP`` +M8^P```'G``"/[````><``&7N```!YP``C.X```'E``"C[P```><``%#P```! +MYP``//,```$W``![\P```3<``+_S```!-P``B_@```$V``!R_````14``&4` +M`0`!`P``9`,!``$#``!8`````>(``%P````!X0``8`````'@``!D`````=\` +M`&@````!W@``;`````'=``!P`````=P``'0````!VP``>`````':``!\```` +M`=D``)`````!`@``E`````$"``"8`````0(``)P````!`@``H`````$"``"D +M`````0(``*@````!`@``K`````$"``"P`````0(``+0````!`@``N`````$" +M``"\`````0(``,`````!`@``Q`````$"``#(`````0(``,P````!`@``T``` +M``$"``#4`````0(``-@````!`@``W`````$"``#D`````:\``.@````!L0`` +M[`````&-``#P`````;```/0````!K0``^`````%Z``#\`````88````!```! +M@P``!`$```&L```(`0```8(```P!```!>0``$`$```%X```4`0```7<``"@! +M```!KP``+`$```&Q```P`0```8T``#0!```!L```.`$```&M```\`0```70` +M`$`!```!A@``1`$```&#``!(`0```:P``$P!```!@@``4`$```%S``!4`0`` +M`7(``%@!```!<0``@`$```%L``"$`0```;@``(@!```!RP``C`$```&Y``"0 +M`0```;P``)@!```!NP``H`$```&Z``"L`0```>,``/@!```!9@``_`$```&X +M`````@```<L```0"```!N0``"`(```&\```0`@```;L``!@"```!N@``'`(` +M``%E```@`@```60``"0"```!XP``*`(```%C```L`@```6(``$@"```!8``` +M3`(```%?``!0`@```<L``%0"```!N0``6`(```&\``!<`@```5X``&`"```! +MNP``9`(```%=``!H`@```;H``&P"```!7```<`(```%;``!T`@```>,``'@" +M```!6@``?`(```%9``"8`@```5<``)P"```!N```H`(```'+``"D`@```;D` +M`*@"```!O```L`(```&[``"X`@```;H``,`"```!5@``Q`(```'C``#0`@`` +M`54``.@"```!5P``[`(```&X``#P`@```<L``/0"```!N0``^`(```&\```` +M`P```;L```@#```!N@``$`,```%6```4`P```>,``"`#```!4P``.`,```%7 +M```\`P```;@``$`#```!RP``1`,```&Y``!(`P```;P``%`#```!NP``6`,` +M``&Z``!@`P```58``&0#```!XP``<`,```%1``"(`P```4\``(P#```!N``` +MD`,```'+``"4`P```;D``)@#```!O```H`,```&[``"H`P```;H``+`#```! +M3@``M`,```'C``#``P```4T``-@#```!3P``W`,```&X``#@`P```<L``.0# +M```!N0``Z`,```&\``#P`P```;L``/@#```!N@````0```%.```$!````>,` +M`!`$```!30``*`0```'````L!````8\``#0$```!N0``/`0```%*``!$!``` +M`9```$P$```!20``4`0```&.``!4!````>,``'@$```!P```?`0```&/``"` +M!````8\``(0$```!1P``B`0```%'``",!````48``)`$```!1@``E`0```%% +M``"8!````44``)P$```!DP``H`0```&.``"D!````>,``,@$```!P```S`0` +M``&/``#0!````<L``-0$```!0P``V`0```%#``#<!````4(``.`$```!0@`` +MY`0```&0``#H!````9```.P$```!DP``\`0```&.``#T!````>,``!@%```! +M0```(`4```%^```H!0```7T``#`%```!?```.`4```$_```\!0```3X``$`% +M```!BP``1`4```%[``!H!0```4```'`%```!?@``>`4```%]``"`!0```7P` +M`(@%```!/P``C`4```$^``"0!0```8L``)0%```!>P``N`4```%```#`!0`` +M`7X``,@%```!?0``T`4```%\``#8!0```3\``-P%```!/@``X`4```&+``#D +M!0```7L```@&```!0```$`8```%^```8!@```7T``"`&```!?```*`8```$_ +M```L!@```3X``#`&```!BP``-`8```%[``!8!@```3D``&`&```!?@``:`8` +M``%]``!P!@```7P``'@&```!/P``?`8```$X``"`!@```8L``(0&```!=0`` +ME`8```%M``"8!@```6<``)P&```!80``H`8```%8``"D!@```50``*@&```! +M4@``K`8```%0``"P!@```4P``+0&```!2P``N`8```%(``"\!@```40``,`& +M```!00``Q`8```$]``#(!@```3P``,P&```!.P``T`8```$Z```D!P```0(` +M`"@'```!`@``+`<```$"```P!P```0(``#0'```!`@``.`<```$"```\!P`` +M`0(``$`'```!`@``1`<```$"``!(!P```0(``$P'```!`@``4`<```$"``!4 +M!P```0(``%@'```!`@``7`<```$"``!@!P```0(``&0'```!`@``:`<```$" +M``!L!P```0(``'`'```!`@``=`<```$"``!X!P```0(``'P'```!`@``@`<` +M``$"``"$!P```0(``(@'```!`@``C`<```$"``"0!P```0(``)0'```!`@`` +MF`<```$"``"<!P```0(``*`'```!`@``>'!G-'!L=7,@0"@C*2!S=&1D968N +M:"`R,"XQ(#DT+S$R+S`T(`!A8V]M<#H@4F5L96%S92`U+C`N,&$@,39-87(Y +M-0!O<'1I;3H@4F5L96%S92`U+C`N,&$@,39-87(Y-0!I,S@V87,Z(%)E;&5A +M<V4@-2XP+C!A(#$V36%R.34`0"@C*2!T8V]P>2YS(#$N,"`Y."\P."\Q,0!I +M,S@V87,Z(%)E;&5A<V4@-2XP+C!A(#$V36%R.34````````````````````` +M`````````````````````````````````````0````$````&`````````$`` +M```<$`$````````````0``````````<````!`````P````````!<$`$`I`<` +M````````````!``````````-````"`````,``````````!@!```$```````` +M``````0`````````$@````<````````````````8`0`<```````````````! +M`````````!@````"```````````````<&`$`H!````8```#J````!````!`` +M```@`````P``````````````O"@!`)T-``````````````$`````````*``` +M``,``````````````%DV`0!/```````````````!`````````#(````)```` +M``````````"H-@$`6`,```4````!````!`````@````\````"0`````````` +M`````#H!`"`(```%`````@````0````(````1@````$``````````````"!" +6`0"Z```````````````!```````````( +` +end diff --git a/sys/contrib/dev/oltr/if_oltr.c b/sys/contrib/dev/oltr/if_oltr.c new file mode 100644 index 0000000..055b2a4 --- /dev/null +++ b/sys/contrib/dev/oltr/if_oltr.c @@ -0,0 +1,1502 @@ +/* + * Copyright (c) 1998, Larry Lile + * All rights reserved. + * + * For latest sources and information on this driver, please + * go to http://anarchy.stdio.com. + * + * Questions, comments or suggestions should be directed to + * Larry Lile <lile@stdio.com>. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice unmodified, this list of conditions, and the following + * disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + + +#include "pci.h" +#include "oltr.h" +#include "opt_inet.h" + +#if (NOLTR + NPCI) > 0 + +/*#define TRlldInlineIO*/ + +#define ISA_ADAPTERS (OC_3115 | OC_3117 | OC_3118) +#define PCI_ADAPTERS (OC_3133 | OC_3136 | OC_3137 | \ + OC_3139 | OC_3140 | OC_3141 | \ + OC_3250 | OC_3540 ) + +#define PCI_VENDOR_OLICOM 0x108D + +char *AdapterName[] = { + /* 0 */ "Olicom XT Adapter [unsupported]", + /* 1 */ "Olicom OC-3115", + /* 2 */ "Olicom ISA 16/4 Adapter (OC-3117)", + /* 3 */ "Olicom ISA 16/4 Adapter (OC-3118)", + /* 4 */ "Olicom MCA 16/4 Adapter (OC-3129) [unsupported]", + /* 5 */ "Olicom MCA 16/4 Adapter (OC-3129) [unsupported]", + /* 6 */ "Olicom MCA 16/4 Adapter (OC-3129) [unsupported]", + /* 7 */ "Olicom EISA 16/4 Adapter (OC-3133)", + /* 8 */ "Olicom EISA 16/4 Adapter (OC-3133)", + /* 9 */ "Olicom EISA 16/4 Server Adapter (OC-3135)", + /* 10 */ "Olicom PCI 16/4 Adapter (OC-3136)", + /* 11 */ "Olicom PCI 16/4 Adapter (OC-3136)", + /* 12 */ "Olicom PCI/II 16/4 Adapter (OC-3137)", + /* 13 */ "Olicom PCI 16/4 Adapter (OC-3139)", + /* 14 */ "Olicom RapidFire 3140 16/4 PCI Adapter (OC-3140)", + /* 15 */ "Olicom RapidFire 3141 Fiber Adapter (OC-3141)", + /* 16 */ "Olicom PCMCIA 16/4 Adapter (OC-3220) [unsupported]", + /* 17 */ "Olicom PCMCIA 16/4 Adapter (OC-3121, OC-3230, OC-3232) [unsupported]", + /* 18 */ "Olicom PCMCIA 16/4 Adapter (OC-3250)", + /* 19 */ "Olicom RapidFire 3540 4/16/100 Adapter (OC-3540)" +}; + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/proc.h> +#include <sys/sockio.h> +#include <sys/malloc.h> +#include <sys/mbuf.h> +#include <sys/socket.h> +#include <sys/syslog.h> +#include <sys/kernel.h> +#include <sys/interrupt.h> + +#include <net/ethernet.h> +#include <net/if.h> +#include <net/if_arp.h> +#include <net/iso88025.h> +#include <net/if_media.h> + +#include <net/bpf.h> + +#include <machine/clock.h> +#include <machine/md_var.h> +#include <i386/isa/isa_device.h> + +#if NPCI > 0 +#include <pci/pcivar.h> +#include <pci/pcireg.h> +#endif + +#include "contrib/dev/oltr/trlld.h" + +#ifndef TRLLD_SPEED_AUTO +#define TRLLD_SPEED_AUTO 0 +#endif + +#define MIN(A,B) (((A) < (B)) ? (A) : (B)) +#define MIN3(A,B,C) (MIN(A, (MIN(B, C)))) + +void *oltr_malloc(ssize_t, TRlldAdapterConfig_t *); + +/* + * Glue functions prototypes for PMW kit IO + */ + +#ifndef TRlldInlineIO +static void DriverOutByte __P((unsigned short, unsigned char)); +static void DriverOutWord __P((unsigned short, unsigned short)); +static void DriverOutDword __P((unsigned short, unsigned long)); +static void DriverRepOutByte __P((unsigned short, unsigned char *, int)); +static void DriverRepOutWord __P((unsigned short, unsigned short *, int)); +static void DriverRepOutDword __P((unsigned short, unsigned long *, int)); +static unsigned char DriverInByte __P((unsigned short)); +static unsigned short DriverInWord __P((unsigned short)); +static unsigned long DriverInDword __P((unsigned short)); +static void DriverRepInByte __P((unsigned short, unsigned char *, int)); +static void DriverRepInWord __P((unsigned short, unsigned short *, int)); +static void DriverRepInDword __P((unsigned short, unsigned long *, int)); +#endif /*TRlldInlineIO*/ +static void DriverSuspend __P((unsigned short)); +static void DriverStatus __P((void *, TRlldStatus_t *)); +static void DriverCloseCompleted __P((void *)); +static void DriverStatistics __P((void *, TRlldStatistics_t *)); +static void DriverTransmitFrameCompleted __P((void *, void *, int)); +static void DriverReceiveFrameCompleted __P((void *, int, int, void *, int)); + +typedef struct tx_buf { + int index; + int count; + char *buf; + struct mbuf *m; +} tx_buf_t; + +typedef struct rx_buf { + int index; + char *buf; +} rx_buf_t; + +#ifndef EXTRA_OLTR +#if NPCI > 0 +#define EXTRA_OLTR 8 +#else +#define EXTRA_OLTR 0 +#endif /* NPCI */ +#endif /* EXTRA_OLTR */ + +#ifndef OLTR_PROMISC_MODE +#define OLTR_PROMISC_MODE (TRLLD_PROM_LLC) +#endif + +#define ALL_OPTIONS (IFM_TOK_ETR | IFM_TOK_SRCRT | IFM_TOK_ALLR | IFM_TOK_DTR | IFM_TOK_CLASSIC | IFM_TOK_AUTO) + +/* List sizes MUST be a power of 2 */ +#define TX_LIST_SIZE 16 +#define RX_LIST_SIZE 16 +#define TX_LIST_MASK (TX_LIST_SIZE - 1) +#define RX_LIST_MASK (RX_LIST_SIZE - 1) +#define RX_BUFFER_LEN (8*1024) +#define TX_BUFFER_LEN (8*1024) + +struct oltr_softc { + struct arpcom arpcom; + struct ifmedia ifmedia; + TRlldAdapterConfig_t *config; + TRlldAdapter_t *TRlldAdapter; + int unit; + u_short PromiscMode; + u_short AdapterMode; + int hw_state; +#define HW_UNKNOWN 0 /* initial/absent state */ +#define HW_FOUND 1 /* found, not initialized */ +#define HW_BAD 2 /* fatal error */ +#define HW_FAILED 3 /* closed eg. by remove, allow manual reopen */ +#define HW_LOADING 4 +#define HW_CLOSING 5 +#define HW_CLOSING2 6 +#define HW_CLOSED 7 +#define HW_OPENING 8 +#define HW_OPEN 9 +#define HW_ERROR 10 /* temporary error */ + + u_long GroupAddress; + u_long FunctionalAddress; + int poll_adapter; + + int tx_next; + int tx_avail; + tx_buf_t tx_buffer[TX_LIST_SIZE]; + TRlldTransmit_t tx_frame; + + int rx_next; + int rx_avail; + rx_buf_t rx_buffer[RX_LIST_SIZE]; + + struct callout_handle oltr_ch; + struct callout_handle poll_ch; + +}; + +static struct oltr_softc oltr_softc[NOLTR + EXTRA_OLTR]; + +/* + * Driver function prototypes + */ + +static int oltr_probe __P((struct isa_device *)); +static int oltr_attach __P((struct isa_device *)); +static void oltr_init __P((struct oltr_softc *)); +static void oltr_intr __P((int)); +static void oltr_start __P((struct ifnet *)); +static void oltr_stop __P((struct oltr_softc *)); +static int oltr_ioctl __P((struct ifnet *, u_long, caddr_t)); + +static int oltr_attach_common __P((struct oltr_softc *)); + +void oltr_timeout __P((void *)); +void adapter_poll __P((void *)); + +struct isa_driver oltrdriver = { + oltr_probe, + oltr_attach, + "oltr", + 0 +}; + +int isa_cards = 0; + +#if NPCI > 0 +static u_long oltr_count = NOLTR; +static const char *oltr_pci_probe __P((pcici_t, pcidi_t)); +static void oltr_pci_attach __P((pcici_t, int)); +static void oltr_pci_intr __P((void *)); +static void oltr_pci_shutdown __P((int, void *)); + +static struct pci_device oltr_device = { + "oltr", + oltr_pci_probe, + oltr_pci_attach, + &oltr_count, + NULL +}; + +COMPAT_PCI_DRIVER(oltr_pci, oltr_device); +int pci_cards = 0; +#endif /* NPCI */ + +static int oltr_ifmedia_upd __P((struct ifnet *)); +static void oltr_ifmedia_sts __P((struct ifnet *, struct ifmediareq *)); + +static TRlldDriver_t oltrLldDriver = { + TRLLD_VERSION, +#ifndef TRlldInlineIO + DriverOutByte, + DriverOutWord, + DriverOutDword, + DriverRepOutByte, + DriverRepOutWord, + DriverRepOutDword, + DriverInByte, + DriverInWord, + DriverInDword, + DriverRepInByte, + DriverRepInWord, + DriverRepInDword, +#endif /*TRlldInlineIO*/ + DriverSuspend, + DriverStatus, + DriverCloseCompleted, + DriverStatistics, + DriverTransmitFrameCompleted, + DriverReceiveFrameCompleted, +}; + +TRlldAdapterConfig_t oltr_config[NOLTR + EXTRA_OLTR]; + +void * +oltr_malloc(Size, Adapter) + ssize_t Size; + TRlldAdapterConfig_t *Adapter; +{ + + /* If the adapter needs memory below 16M for DMA then use contigmalloc */ + if (Adapter->mode & TRLLD_MODE_16M) /* Adapter using ISA DMA buffer below 16M */ + return(contigmalloc(Size, M_DEVBUF, M_NOWAIT, 0ul, 0xfffffful, 1ul, 0x10000ul)); + else + return(malloc(Size, M_DEVBUF, M_NOWAIT)); +} + +/* + * Driver Functions + */ + +static int +oltr_probe(is) + struct isa_device *is; +{ + static int find_completed = 0, assigned[NOLTR]; + struct oltr_softc *sc = &oltr_softc[is->id_unit]; + int i; + + printf("oltr%d: oltr_probe\n", is->id_unit); + + /* Make life easy, use the Olicom supplied find function on the first probe + * to probe all of the ISA adapters. Then give them to each unit as requested. + * Try to match the adapters to units based on the iobase, but if iobase? then + * just give out the next available adapter. + */ + if (!find_completed) { + isa_cards = TRlldFind(&oltrLldDriver, &oltr_config[0], ISA_ADAPTERS, NOLTR); + /*for (i = 0; i < isa_cards; i++) { + printf("TRlldFind: card %d - %s MAC %6D\n", i + 1, AdapterName[oltr_config[i].type], oltr_config[i].macaddress, ":"); + }*/ + for (i = 0; i < NOLTR; i++) + assigned[i] = 0; + find_completed = 1; + } + + sc->unit = is->id_unit; + sc->hw_state = HW_UNKNOWN; + + if (find_completed && ((isa_cards == 0) || (is->id_unit > isa_cards))) + return(0); + + if (((is->id_iobase < 0xa00) || (is->id_iobase > 0xbe0)) && (is->id_iobase != 0xffffffff)) { + printf("oltr%d: port address impossible (0x%X)\n", is->id_unit, is->id_iobase); + return(0); + } + + /* Auto assign lowest available card not already in use */ + if (is->id_iobase == 0xffffffff) { + printf("oltr%d: auto assigning card.\n", is->id_unit); + for (i = 0; assigned[i]; i++); + assigned[i] = 1; + sc->config = &oltr_config[i]; + is->id_iobase = sc->config->iobase0; /* Claim our port space */ + if (!is->id_irq) + is->id_irq = (1 << sc->config->interruptlevel); /* Claim our interrupt */ + is->id_intr = (inthand2_t *)oltr_intr; + if ((is->id_drq == 0xffffffff) && (sc->config->dmalevel != TRLLD_DMA_PIO)) + is->id_drq = sc->config->dmalevel; /* Claim our dma channel */ + printf("oltr%d: <%s> [%6D]\n", is->id_unit, AdapterName[sc->config->type], sc->config->macaddress, ":"); + sc->hw_state = HW_FOUND; + return(1); + } else { + /* Assign based on iobase address provided in kernel config */ + for (i = 0; i < NOLTR; i++) { + if (is->id_iobase == oltr_config[i].iobase0) { + if (assigned[i]) { + printf("oltr%d: adapter (0x%X) already assigned.\n", is->id_unit, is->id_iobase); + return(0); + } + assigned[i] = 1; + sc->config = &oltr_config[i]; + if (is->id_irq == 0) + is->id_irq = (1 << sc->config->interruptlevel); /* Claim our interrupt */ + is->id_intr = (inthand2_t *)oltr_intr; + if ((is->id_drq == 0xffffffff) && (sc->config->dmalevel != TRLLD_DMA_PIO)) + is->id_drq = sc->config->dmalevel; /* Claim our dma channel */ + printf("oltr%d: <%s> [%6D]\n", is->id_unit, AdapterName[sc->config->type], sc->config->macaddress, ":"); + sc->hw_state = HW_FOUND; + return(1); + } + } + } + return(0); /* Card was not found */ +} + +#if NPCI > 0 +static const char * +oltr_pci_probe(config_id, device_id) + pcici_t config_id; + pcidi_t device_id; +{ + u_char PCIConfigurationSpace[64]; + u_long command; + int i, j, rc; + + printf("oltr: oltr_pci_probe\n"); + + j = NOLTR + pci_cards; + + if (pci_cards == EXTRA_OLTR) + return(NULL); + + if (((device_id & 0xffff) == PCI_VENDOR_OLICOM) && + ((((device_id >> 16) & 0xffff) == 0x0001) || + (((device_id >> 16) & 0xffff) == 0x0004) || + (((device_id >> 16) & 0xffff) == 0x0005) || + (((device_id >> 16) & 0xffff) == 0x0007) || + (((device_id >> 16) & 0xffff) == 0x0008))) { + + for (i = 0; i < 64; i++) + PCIConfigurationSpace[i] = pci_cfgread(config_id, i, /*bytes*/1); + + rc = TRlldPCIConfig(&oltrLldDriver, &oltr_config[j], PCIConfigurationSpace); + + if ((rc == TRLLD_PCICONFIG_OK) || (rc == TRLLD_PCICONFIG_SET_COMMAND)) { + if (rc == TRLLD_PCICONFIG_SET_COMMAND) { + printf("oltr: setting bus-master mode\n"); + command = pci_conf_read(config_id, PCIR_COMMAND); + pci_conf_write(config_id, PCIR_COMMAND, (command | PCIM_CMD_BUSMASTEREN)); + } + pci_cards++; + return (AdapterName[oltr_config[j].type]); + } else { + if (rc == TRLLD_PCICONFIG_FAIL) + printf("oltr: TRlldPCIConfig failed!\n"); + if (rc == TRLLD_PCICONFIG_VERSION) + printf("oltr: wrong LLD version\n"); + } + } + return(NULL); +} +#endif /* NPCI */ + +static int +oltr_attach(is) + struct isa_device *is; +{ + struct oltr_softc *sc = &oltr_softc[is->id_unit]; + int rc; + + sc->unit = is->id_unit; + + if (!oltr_attach_common(sc)) + return(0); + + /* If the kernel config does not match the current card configuration then + * adjust the card settings to match the kernel. + */ + if ((ffs(is->id_irq) - 1) != sc->config->interruptlevel) { + rc = TRlldSetInterrupt(sc->TRlldAdapter, is->id_irq); + if (rc != TRLLD_CONFIG_OK) { + printf("oltr%d: Unable to change adapter interrupt level (%x)\n", sc->unit, rc); + return(0); + } + } + + /* Set dma level, fall back to pio if possible. (following SCO driver example) */ + if (is->id_drq != sc->config->dmalevel) { + rc = TRlldSetDMA(sc->TRlldAdapter, is->id_drq, &sc->config->mode); + if (rc != TRLLD_CONFIG_OK) { + if ((sc->config->dmalevel != TRLLD_DMA_PIO) && + (TRlldSetDMA(sc->TRlldAdapter, TRLLD_DMA_PIO, &sc->config->mode) != TRLLD_CONFIG_OK)) { + printf("oltr%d: unable to change dma level from %d to %d (%x)\n", sc->unit, + sc->config->dmalevel, is->id_drq, rc); + } + printf("oltr%d: Unable to change adapter dma level, using PIO mode (%x)\n", sc->unit, rc); + sc->config->dmalevel = TRLLD_DMA_PIO; + rc = TRlldSetDMA(sc->TRlldAdapter, is->id_drq, &sc->config->mode); + } + is->id_irq = sc->config->dmalevel; + } + return(1); +} + +#if NPCI > 0 +static void +oltr_pci_attach(config_id, unit) + pcici_t config_id; + int unit; +{ + struct oltr_softc *sc = &oltr_softc[unit]; + + sc->unit = unit; + sc->config = &oltr_config[unit]; + sc->hw_state = HW_FOUND; + + printf("oltr%d: mac address [%6D]\n", sc->unit, sc->config->macaddress, ":"); + + if (!oltr_attach_common(sc)) + return; + + /* Map our interrupt */ + if (!pci_map_int(config_id, oltr_pci_intr, sc, &net_imask)) { + printf("oltr%d: couldn't map interrupt\n", unit); + return; + } +} +#endif /* NPCI */ + +static int +oltr_attach_common(sc) + struct oltr_softc *sc; +{ + struct ifnet *ifp = &sc->arpcom.ac_if; + u_int bufsize; + int rc, i, j; + + /*printf("oltr%d: attach_common called\n", sc->unit);*/ + + /* Allocate adapter memory buffer */ + bufsize = TRlldAdapterSize(); + sc->TRlldAdapter = (TRlldAdapter_t *)oltr_malloc(bufsize, sc->config); + if (sc->TRlldAdapter == NULL) { + printf("oltr%d: Unable to allocate adapter memory block (%d bytes)\n", sc->unit, bufsize); + } + /*printf("oltr%d: Adapter memory block (%p %d bytes)\n", sc->unit, sc->TRlldAdapter, bufsize);*/ + + /* Setup transmit pool */ + for (i = 0; i < TX_LIST_SIZE; i++) { + sc->tx_buffer[i].index = i; + sc->tx_buffer[i].buf = (char *)oltr_malloc(TX_BUFFER_LEN, sc->config); + /* If we have a failure then free everything and get out */ + if (!sc->tx_buffer[i].buf) { + printf("oltr%d: Unable to allocate transmit buffers.\n", sc->unit); + for (j = 0; j < i; j++) + free(sc->tx_buffer[j].buf, M_DEVBUF); + return(0); + } + } + sc->tx_next = 0; + sc->tx_avail = TX_LIST_SIZE; + sc->tx_frame.FragmentCount = 0; + + /* Setup receive pool */ + for (i = 0; i < RX_LIST_SIZE; i++) { + sc->rx_buffer[i].index = i; + sc->rx_buffer[i].buf = (char *)oltr_malloc(RX_BUFFER_LEN, sc->config); + /* If we have a failure then free everything and get out */ + if (!sc->rx_buffer[i].buf) { + printf("oltr%d: Unable to allocate receive buffers.\n", sc->unit); + for (j = 0; j < i; j++) + free(sc->rx_buffer[j].buf, M_DEVBUF); + return(0); + } + } + sc->rx_next = 0; + sc->rx_avail = RX_LIST_SIZE; + /*printf("oltr%d: Allocated receive buffers\n", sc->unit); */ + + /* Set up adapter polling mechanism */ + sc->poll_adapter = 1; + callout_handle_init(&sc->poll_ch); + sc->poll_ch = timeout(adapter_poll, (void *)sc->unit, (1*hz)/1000); + callout_handle_init(&sc->oltr_ch); + + /* Initialize adapter */ + rc = TRlldAdapterInit(&oltrLldDriver, sc->TRlldAdapter, kvtop(sc->TRlldAdapter), + (void *)sc->unit, sc->config); + if (rc != TRLLD_INIT_OK) { + switch (rc) { + case TRLLD_INIT_NOT_FOUND: + printf("oltr%d: Adapter not found or malfunctioning.\n", sc->unit); + sc->hw_state = HW_BAD; + return(0); + case TRLLD_INIT_UNSUPPORTED: + printf("oltr%d: Adapter not supported by low level driver.\n", sc->unit); + sc->hw_state = HW_UNKNOWN; + return(0); + case TRLLD_INIT_PHYS16: + printf("oltr%d: Adapter memory block above 16M, must be below 16M.\n", sc->unit); + return(0); + case TRLLD_INIT_VERSION: + printf("oltr%d: Low level driver version mismatch.\n", sc->unit); + return(0); + default: + printf("oltr%d: Unknown initilization error occoured (%x).\n", sc->unit, rc); + return(0); + } + } + + /* Download Adapter Microcode */ + /*printf("oltr%d: Downloading adapter microcode...", sc->unit);*/ + sc->hw_state = HW_LOADING; + switch(sc->config->mactype) { + case TRLLD_MAC_TMS: /* TMS microcode */ + rc = TRlldDownload(sc->TRlldAdapter, TRlldMacCode); + break; + case TRLLD_MAC_HAWKEYE: /* Hawkeye microcode */ + rc = TRlldDownload(sc->TRlldAdapter, TRlldHawkeyeMac); + break; + case TRLLD_MAC_BULLSEYE: /* Bullseye microcode */ + rc = TRlldDownload(sc->TRlldAdapter, TRlldBullseyeMac); + break; + default: + printf("oltr%d: unknown mactype %d\n", sc->unit, sc->config->mactype); + return(0); + } + /*if (rc == TRLLD_DOWNLOAD_OK) + printf("done\n");*/ + if ((rc == TRLLD_DOWNLOAD_ERROR) || (rc == TRLLD_STATE)) { + printf("oltr%d: Adapter microcode download failed! (rc = %x)\n", sc->unit, rc); + sc->hw_state = HW_BAD; + return(0); + } + + TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_AUTO); + + sc->PromiscMode = 0; + sc->AdapterMode = 0; + + /* Do the ifnet initialization */ + ifp->if_softc = sc; + ifp->if_unit = sc->unit; + ifp->if_name = "oltr"; + ifp->if_output = iso88025_output; + ifp->if_init = (if_init_f_t *)oltr_init; + ifp->if_start = oltr_start; + ifp->if_ioctl = oltr_ioctl; + ifp->if_flags = IFF_BROADCAST | IFF_MULTICAST | IFF_SIMPLEX; + bcopy(sc->config->macaddress, sc->arpcom.ac_enaddr, sizeof(sc->config->macaddress)); + + /* Set up common ifmedia options */ + ifmedia_init(&sc->ifmedia, 0, oltr_ifmedia_upd, oltr_ifmedia_sts); + + ifmedia_add(&sc->ifmedia, IFM_TOKEN | IFM_AUTO, 0 , NULL); + ifmedia_add(&sc->ifmedia, IFM_TOKEN | IFM_TOK_UTP4, 0 , NULL); + ifmedia_add(&sc->ifmedia, IFM_TOKEN | IFM_TOK_UTP16, 0 , NULL); + + ifmedia_set(&sc->ifmedia, IFM_TOKEN | IFM_AUTO); + + if_attach(ifp); + iso88025_ifattach(ifp); + + bpfattach(ifp, DLT_IEEE802, sizeof(struct iso88025_header)); + + printf("oltr%d: Adapter modes - ", sc->unit); + if (sc->config->mode & TRLLD_MODE_16M) printf("TRLLD_MODE_16M "); + if (sc->config->mode & TRLLD_MODE_PHYSICAL) printf("TRLLD_MODE_PHYSICAL "); + if (sc->config->mode & TRLLD_MODE_FIXED_CFG) printf("TRLLD_MODE_FIXED_CFG "); + if (sc->config->mode & TRLLD_MODE_SHORT_SLOT) printf("TRLLD_MODE_SHORT_SLOT "); + if (sc->config->mode & TRLLD_MODE_CANNOT_DISABLE) printf("TRLLD_MODE_CANNOT_DISABLE "); + if (sc->config->mode & TRLLD_MODE_SHARE_INTERRUPT) printf("TRLLD_MODE_SHARE_INTERRUPT "); + if (sc->config->mode & TRLLD_MODE_MEMORY) printf("TRLLD_MODE_MEMORY "); + printf("\n"); + + return(1); +} + +#if NPCI > 0 +static void +oltr_pci_shutdown(howto, sc) + int howto; + void *sc; +{ + printf("oltr: oltr_pci_shutdown called\n"); +} +#endif /* NPCI */ + +static int +oltr_ifmedia_upd(ifp) + struct ifnet *ifp; +{ + struct oltr_softc *sc = ifp->if_softc; + struct ifmedia *ifm = &sc->ifmedia; + + if (IFM_TYPE(ifm->ifm_media) != IFM_TOKEN) + return(EINVAL); + + switch(IFM_SUBTYPE(ifm->ifm_media)) { + case IFM_AUTO: + TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_AUTO); + break; + case IFM_TOK_UTP4: + TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_4MBPS); + break; + case IFM_TOK_UTP16: + TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS); + break; + default: + return(EINVAL); + } + + if (IFM_TYPE_OPTIONS(ifm->ifm_media) & IFM_TOK_ETR) + printf("oltr%d: ETR not implemented\n", sc->unit); + if (IFM_TYPE_OPTIONS(ifm->ifm_media) & IFM_TOK_SRCRT) + printf("oltr%d: source-routing not implemented\n", sc->unit); + if (IFM_TYPE_OPTIONS(ifm->ifm_media) & IFM_TOK_ALLR) + printf("oltr%d: all source routes not implemented\n", sc->unit); + if (IFM_TYPE_OPTIONS(ifm->ifm_media) & IFM_TOK_DTR) { + sc->AdapterMode |= TRLLD_MODE_FORCE_TXI; + sc->AdapterMode &= ~TRLLD_MODE_FORCE_TKP; + } + if (IFM_TYPE_OPTIONS(ifm->ifm_media) & IFM_TOK_CLASSIC) { + sc->AdapterMode |= TRLLD_MODE_FORCE_TKP; + sc->AdapterMode &= ~TRLLD_MODE_FORCE_TXI; + } + if (IFM_TYPE_OPTIONS(ifm->ifm_media) & IFM_TOK_AUTO) + sc->AdapterMode &= ~(TRLLD_MODE_FORCE_TXI | TRLLD_MODE_FORCE_TKP); + + if (IFM_TYPE_OPTIONS(ifm->ifm_media) & ~ALL_OPTIONS) + return(EINVAL); + + return(0); +} + +static void +oltr_ifmedia_sts(ifp, ifmr) + struct ifnet *ifp; + struct ifmediareq *ifmr; +{ + struct oltr_softc *sc = ifp->if_softc; + struct ifmedia *ifm = &sc->ifmedia; + + ifmr->ifm_active = IFM_TYPE(ifm->ifm_media)|IFM_SUBTYPE(ifm->ifm_media)|IFM_TYPE_OPTIONS(ifm->ifm_media); + + return; +} + +void +oltr_timeout(token) + void *token; +{ + struct oltr_softc *sc = &oltr_softc[(int)token]; + int unit = (int)token, s; + + s = splimp(); + + printf("oltr%d: adapter timed out (%x)\n", unit, sc->hw_state); + + splx(s); +} + + +void +adapter_poll(token) + void *token; +{ + int unit = (int)token, poll_timeout = 0, s; + struct oltr_softc *sc = &oltr_softc[unit]; +#if 0 + static int rx_buffers = 0, tx_buffers = 0, rc; +#endif + + s = splimp(); + + /* Check to make sure we are not polling a dead card */ + if ((sc->hw_state == HW_BAD) || (sc->hw_state == HW_UNKNOWN)) { + sc->poll_adapter = -1; + splx(s); + return; + } + + /*printf("oltr%d: adapter poll.\n", unit);*/ + + /* If the adapter is to be polled again, then set up + * next timeout poll + */ + if (sc->poll_adapter) { + poll_timeout = TRlldPoll(sc->TRlldAdapter); + sc->poll_ch = timeout(adapter_poll, (void *)unit, (poll_timeout * hz)/1000); + } +#if 0 + rc = TRlldReceiveFree(sc->TRlldAdapter); + if (rx_buffers != rc) { + printf("oltr%d: %d receive buffers available\n", sc->unit, rc); + rx_buffers = rc; + } + rc = TRlldTransmitFree(sc->TRlldAdapter); + if (tx_buffers != rc) { + printf("oltr%d: %d transmit buffers available\n", sc->unit, rc); + tx_buffers = rc; + } +#endif + + splx(s); +} + +static void +oltr_init(sc) + struct oltr_softc *sc; +{ + struct ifnet *ifp = &sc->arpcom.ac_if; + int i, rc; + + /*printf("oltr%d: oltr_init\n", sc->unit);*/ + + /* + * Adapter should be freshly downloaded or previously closed before + * bringing it back on line. + */ + if ((sc->hw_state != HW_CLOSED) && (sc->hw_state != HW_LOADING) && (sc->hw_state != HW_CLOSING2)) { + printf("oltr%d: adapter not ready to be opened (%d).\n", sc->unit, sc->hw_state); + return; + } + + /* Allocate and set up the DMA channel */ + if (sc->config->dmalevel != TRLLD_DMA_PIO) { + rc = isa_dma_acquire(sc->config->dmalevel); + isa_dmacascade(sc->config->dmalevel); + } + + /* Open the adapter */ + sc->hw_state = HW_OPENING; + rc = TRlldOpen(sc->TRlldAdapter, sc->arpcom.ac_enaddr, sc->GroupAddress, + sc->FunctionalAddress, ifp->if_mtu + 52, sc->AdapterMode); + if (rc != TRLLD_OPEN_OK) { + printf("oltr%d: Adapter failed to open (rc = %x)\n", sc->unit, rc); + sc->hw_state = HW_FAILED; + } else { + /*printf("oltr%d: adapter opening...\n", sc->unit);*/ + /*ifp->if_flags |= (IFF_UP | IFF_RUNNING);*/ + ifp->if_flags &= ~IFF_OACTIVE; + } + sc->oltr_ch = timeout(oltr_timeout, (void *)sc->unit, 30*hz); + tsleep((void *)sc->unit, 1, "oltrop", 30*hz); + + /* Give the receive buffers to the adapter */ + for (i = 0; i < RX_LIST_SIZE; i++) { + rc = TRlldReceiveFragment(sc->TRlldAdapter, + (void *)sc->rx_buffer[sc->rx_next & RX_LIST_MASK].buf, + kvtop(sc->rx_buffer[sc->rx_next & RX_LIST_MASK].buf), + RX_BUFFER_LEN, + (void *)sc->rx_buffer[sc->rx_next & RX_LIST_MASK].index); + if (rc != TRLLD_RECEIVE_OK) { + printf("oltr%d: Adapter refused fragment %d (rc = %d).\n", sc->unit, i, rc); + break; + } else { + sc->rx_avail--; + } + sc->rx_next++; + } + sc->tx_frame.FragmentCount = 0; + + return; +} + +static void +oltr_intr(unit) + int unit; +{ + struct oltr_softc *sc = &oltr_softc[unit]; + int rc; + + /*printf("oltr%d: oltr_intr\n", unit);*/ /* Too noisy */ + rc= TRlldInterruptService(sc->TRlldAdapter); + if (rc == TRLLD_NO_INTERRUPT) + printf("oltr%d: interrupt not serviced.\n", unit); +} + +#if NPCI > 0 +static void +oltr_pci_intr(psc) + void *psc; +{ + struct oltr_softc *sc = (struct oltr_softc *)psc; + int rc = 0; + + /*printf("oltr%d: oltr_pci_intr\n", sc->unit);*/ /* Too noisy */ + rc = TRlldInterruptService(sc->TRlldAdapter); + if (rc == TRLLD_NO_INTERRUPT) + printf("oltr%d: pci interrupt not serviced.\n", sc->unit); +} +#endif /* NPCI */ + +static void +oltr_start(ifp) + struct ifnet *ifp; +{ + struct oltr_softc *sc = &oltr_softc[ifp->if_unit]; + struct mbuf *m0, *m; + int len, i, k, rc; + + /*printf("oltr%d: oltr_start\n", sc->unit);*/ + +outloop: + + i = (sc->tx_next & TX_LIST_MASK); /* Just to shorten thing up */ + + /* Check to see if we have enough room to transmit */ + if (sc->tx_avail <= 0) { + /* No free buffers, hold off the upper layers */ + /*printf("oltr%d: transmit queue full.\n", sc->unit);*/ + ifp->if_flags |= IFF_OACTIVE; + return; + } + + if (sc->tx_frame.FragmentCount > 0) { + if (!(sc->config->mode & TRLLD_MODE_16M)) { + sc->tx_next++; + m0 = sc->tx_buffer[i].m; + goto restart; + } + } + + IF_DEQUEUE(&ifp->if_snd, m); + if (m == 0) { + /*printf("oltr%d: oltr_start NULL packet dequeued.\n", sc->unit);*/ + ifp->if_flags &= ~IFF_OACTIVE; + return; + } + + /* Keep a pointer to the head of the packet */ + m0 = m; + + if (sc->config->mode & TRLLD_MODE_16M) { /* ISA Adapters - bounce buffers */ + + for (len = 0; m != 0; m = m->m_next) { + sc->tx_frame.TransmitFragment[0].VirtualAddress = sc->tx_buffer[i].buf; + sc->tx_frame.TransmitFragment[0].PhysicalAddress = kvtop(sc->tx_buffer[i].buf); + bcopy(mtod(m, caddr_t), sc->tx_buffer[i].buf + len, m->m_len); + len += m->m_len; + } + sc->tx_frame.FragmentCount = 1; + sc->tx_frame.TransmitFragment[0].count = len; + + sc->tx_next++; + sc->tx_avail--; + + } else { /* PCI Adapters w/DMA */ + + for (k = 0; m!= 0; m = m->m_next) { + sc->tx_frame.TransmitFragment[k].VirtualAddress = mtod(m, caddr_t); + sc->tx_frame.TransmitFragment[k].PhysicalAddress = kvtop(mtod(m, caddr_t)); + sc->tx_frame.TransmitFragment[k].count = m->m_len; + k++; + sc->tx_avail--; + } + sc->tx_frame.FragmentCount = k; + sc->tx_buffer[i].count = k; + sc->tx_buffer[i].m = m0; + + if (sc->tx_avail < 0) { + /*printf("oltr%d: transmit buffers exhausted.\n", sc->unit);*/ + goto nobuffers; + } + sc->tx_next++; + } + +restart: + rc = TRlldTransmitFrame(sc->TRlldAdapter, &sc->tx_frame, (void *)sc->tx_buffer[i].index); + sc->tx_frame.FragmentCount = 0; + + if (rc != TRLLD_TRANSMIT_OK) { + printf("oltr%d: TRlldTransmitFrame returned (%x)\n", sc->unit, rc); + ifp->if_oerrors++; + goto bad; + } + + if (ifp->if_bpf) + bpf_mtap(ifp, m0); + +bad: + + if (sc->config->mode & TRLLD_MODE_16M) { + m_freem(m0); + } + + goto outloop; + +nobuffers: + + ifp->if_flags |= IFF_OACTIVE; + + return; +} + +static void +oltr_stop(sc) + struct oltr_softc *sc; +{ + struct ifnet *ifp = &sc->arpcom.ac_if; + printf("oltr%d: otlr_stop\n", sc->unit); + ifp->if_flags &= ~(IFF_UP | IFF_RUNNING | IFF_OACTIVE); + sc->hw_state = HW_CLOSING; + TRlldClose(sc->TRlldAdapter, 0); + sc->oltr_ch = timeout(oltr_timeout, (void *)sc->unit, 30*hz); + tsleep((void *)sc->unit, 1, "oltrcl", 30*hz); +} + +static int +oltr_ioctl(ifp, cmd, data) + struct ifnet *ifp; + u_long cmd; + caddr_t data; +{ + struct oltr_softc *sc = &oltr_softc[ifp->if_unit]; + struct ifreq *ifr = (struct ifreq *)data; + int error = 0, s; + + /*printf("oltr%d: oltr_ioctl\n", ifp->if_unit);*/ + + s = splimp(); + + switch (cmd) { + + case SIOCSIFADDR: + case SIOCGIFADDR: + case SIOCSIFMTU: + error = iso88025_ioctl(ifp, cmd, data); + break; + + case SIOCSIFFLAGS: + /* + * If the interface is marked up and stopped, then start it. + * If it is marked down and running, then stop it. + */ + if (ifp->if_flags & IFF_UP) { + if ((ifp->if_flags & IFF_RUNNING) == 0) + oltr_init(sc); + } else { + if (ifp->if_flags & IFF_RUNNING) { + oltr_stop(sc); + ifp->if_flags &= ~IFF_RUNNING; + } + } + + if ((ifp->if_flags & IFF_PROMISC) != sc->PromiscMode) { + if (ifp->if_flags & IFF_PROMISC) + TRlldSetPromiscuousMode(sc->TRlldAdapter, OLTR_PROMISC_MODE); + else + TRlldSetPromiscuousMode(sc->TRlldAdapter, 0); + sc->PromiscMode = (ifp->if_flags & IFF_PROMISC); + } + + break; + case SIOCGIFMEDIA: + case SIOCSIFMEDIA: + error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, cmd); + break; + default: + error = EINVAL; + } + splx(s); + return(error); +} + +/* + * PMW Callback functions ---------------------------------------------------- + */ + +static void +DriverSuspend(MicroSeconds) + unsigned short MicroSeconds; +{ + DELAY(MicroSeconds); +} + + +static void +DriverStatus(DriverHandle, Status) + void *DriverHandle; + TRlldStatus_t *Status; +{ + struct oltr_softc *sc = &oltr_softc[(int)DriverHandle]; + struct ifnet *ifp = &sc->arpcom.ac_if; + + switch (Status->Type) { + case TRLLD_STS_ON_WIRE: + if (sc->hw_state == HW_OPENING) { + sc->hw_state = HW_OPEN; + ifp->if_flags |= (IFF_UP | IFF_RUNNING); + /*printf("oltr%d: Adapter inserted.\n", sc->unit);*/ + untimeout(oltr_timeout, (void *)sc->unit, sc->oltr_ch); + wakeup_one((void *)sc->unit); + } + break; + case TRLLD_STS_SELFTEST_STATUS: + if (Status->Specification.SelftestStatus == TRLLD_ST_OK) { + printf("oltr%d: adapter status good. (close completed/self-test)\n", sc->unit); + if ((sc->hw_state == HW_LOADING) || (sc->hw_state == HW_CLOSING) || (sc->hw_state == HW_CLOSING2)) { + sc->hw_state = HW_CLOSED; + break; + } + } else { + printf("oltr%d: Self test failed: ", sc->unit); + switch (Status->Specification.SelftestStatus) { + case TRLLD_ST_ERROR + 0: printf("Initial Test Error\n"); break; + case TRLLD_ST_ERROR + 1: printf("Adapter Software Checksum Error\n"); break; + case TRLLD_ST_ERROR + 2: printf("Adapter RAM Error\n"); break; + case TRLLD_ST_ERROR + 4: printf("Instruction Test Error\n"); break; + case TRLLD_ST_ERROR + 5: printf("Protocol Handler/RI Hw Error\n"); break; + case TRLLD_ST_ERROR + 6: printf("System Interface Register Error\n"); break; + case TRLLD_ST_TIMEOUT: printf("Selftest did not complete\n"); break; + default: printf("Unknown error (%x)\n", Status->Specification.SelftestStatus); + } + } + break; + case TRLLD_STS_INIT_STATUS: + printf("oltr%d: Adapter initialization failed: ", sc->unit); + switch(Status->Specification.InitStatus) { + case TRLLD_INIT_ERROR + 0x01: printf("Invalid init block (LLD error)\n"); break; + case TRLLD_INIT_ERROR + 0x02: printf("Invalid options (LLD error)\n"); break; + case TRLLD_INIT_ERROR + 0x03: printf("Invalid rcv burst (LLD error)\n"); break; + case TRLLD_INIT_ERROR + 0x04: printf("Invalid xmt burst (LLD error)\n"); break; + case TRLLD_INIT_ERROR + 0x05: printf("Invalid DMA threshold (LLD error)\n"); break; + case TRLLD_INIT_ERROR + 0x06: printf("Invalid scb addr\n"); break; + case TRLLD_INIT_ERROR + 0x07: printf("Invalid ssb addr\n"); break; + case TRLLD_INIT_ERROR + 0x08: printf("DIO parity error (HW error)\n"); break; + case TRLLD_INIT_ERROR + 0x09: printf("DMA timeout (May be interrupt failing if PIO mode or PCI2)\n"); break; + case TRLLD_INIT_ERROR + 0x0A: printf("DMA parity error (HW error)\n"); break; + case TRLLD_INIT_ERROR + 0x0B: printf("DMA bus error (HW error)\n"); break; + case TRLLD_INIT_ERROR + 0x0C: printf("DMA data error\n"); break; + case TRLLD_INIT_ERROR + 0x0D: printf("Adapter Check\n"); break; + case TRLLD_INIT_TIMEOUT: printf("Adapter initialization did not complete\n"); break; + case TRLLD_INIT_DMA_ERROR: printf("Adapter cannot access system memory\n"); break; + case TRLLD_INIT_INTR_ERROR: printf("Adapter cannot interrupt\n"); break; + case TRLLD_OPEN_TIMEOUT: printf("Adapter did not complete open within 30 seconds\n"); break; + case TRLLD_OPEN_ERROR + 0x01: printf("Invalid open options (LLD error)\n"); break; + case TRLLD_OPEN_ERROR + 0x04: printf("TxBuffer count error (LLD error)\n"); break; + case TRLLD_OPEN_ERROR + 0x10: printf("Buffer size error (LLD error)\n"); break; + case TRLLD_OPEN_ERROR + 0x20: printf("List size error (LLD error)\n"); break; + default: + if (Status->Specification.InitStatus & 0x700) { + switch (Status->Specification.InitStatus & 0x70F) { + case TRLLD_OPEN_REPEAT + 0x01: printf("Lobe media test - "); break; + case TRLLD_OPEN_REPEAT + 0x02: printf("Physical insertion - "); break; + case TRLLD_OPEN_REPEAT + 0x03: printf("Address verification - "); break; + case TRLLD_OPEN_REPEAT + 0x04: printf("Participation in ring poll - "); break; + case TRLLD_OPEN_REPEAT + 0x05: printf("Request initialization - "); break; + case TRLLD_OPEN_REPEAT + 0x09: printf("Request registration (TXI) - "); break; + case TRLLD_OPEN_REPEAT + 0x0A: printf("Lobe media test (TXI) - "); break; + default: printf("Unknown phase (%x) - ", Status->Specification.InitStatus & 0x00F); + } + switch (Status->Specification.InitStatus & 0x7F0) { + case TRLLD_OPEN_REPEAT + 0x10: printf("Function failure (No cable?)\n"); break; + case TRLLD_OPEN_REPEAT + 0x20: printf("Signal loss\n"); break; + case TRLLD_OPEN_REPEAT + 0x50: printf("Timeout\n"); break; + case TRLLD_OPEN_REPEAT + 0x60: printf("Ring failure (TKP) / Protocol error (TXI)\n"); break; + case TRLLD_OPEN_REPEAT + 0x70: printf("Ring beaconing\n"); break; + case TRLLD_OPEN_REPEAT + 0x80: printf("Duplicate node address (TKP) / Insert denied (TXI)\n"); break; + case TRLLD_OPEN_REPEAT + 0x90: printf("Request initialization (TKP)\n"); break; + case TRLLD_OPEN_REPEAT + 0xa0: printf("Remove received\n"); break; + case TRLLD_OPEN_REPEAT + 0xb0: printf("C-port address changed (TXI)\n"); break; + default: printf("Unknown type (%x)\n", Status->Specification.InitStatus & 0x0F0); + } + } else { + printf("Unknown error (%x)\n", Status->Specification.InitStatus); + } + } + break; + case TRLLD_STS_RING_STATUS: + if (Status->Specification.RingStatus != 0) { + printf("oltr%d: Ring status change: ", sc->unit); + if (Status->Specification.RingStatus & TRLLD_RS_HARD_ERROR) printf("[Hard error] "); + if (Status->Specification.RingStatus & TRLLD_RS_SOFT_ERROR) printf("[Soft error] "); + if (Status->Specification.RingStatus & TRLLD_RS_TRANSMIT_BEACON) printf("[Transmit beacon] "); + if (Status->Specification.RingStatus & TRLLD_RS_LOBE_WIRE_FAULT) printf("[Wire fault] "); + if (Status->Specification.RingStatus & TRLLD_RS_AUTO_REMOVAL_ERROR) printf("[Auto removal] "); + if (Status->Specification.RingStatus & TRLLD_RS_REMOVE_RECEIVED) printf("[Remove received] "); + if (Status->Specification.RingStatus & TRLLD_RS_COUNTER_OVERFLOW) printf("[Counter overflow] "); + if (Status->Specification.RingStatus & TRLLD_RS_SINGLE_STATION) printf("[Single station] "); + if (Status->Specification.RingStatus & TRLLD_RS_RING_RECOVERY) printf("[Ring recovery] "); + printf("\n"); + } + break; + case TRLLD_STS_ADAPTER_CHECK: + printf("oltr%d: Adapter check (%x %x %x %x)\n", sc->unit, Status->Specification.AdapterCheck[0], + Status->Specification.AdapterCheck[1], Status->Specification.AdapterCheck[2], + Status->Specification.AdapterCheck[3]); + break; + case TRLLD_STS_PROMISCUOUS_STOPPED: + printf("oltr%d: Promiscuous mode stopped: ", sc->unit); + switch(Status->Specification.PromRemovedCause) { + case TRLLD_PROM_REMOVE_RECEIVED: printf("Remove received\n"); break; + case TRLLD_PROM_POLL_FAILURE: printf("Poll failure\n"); break; + default: printf("Unknown (%x)\n", Status->Specification.PromRemovedCause); + } + break; + case TRLLD_STS_LLD_ERROR: + printf("oltr%d: LLD error (%x %x %x %x) ", sc->unit, Status->Specification.InternalError[0], + Status->Specification.InternalError[1], Status->Specification.InternalError[2], + Status->Specification.InternalError[3]); + break; + case TRLLD_STS_ADAPTER_TIMEOUT: + printf("oltr%d: Adapter operation timed out: ", sc->unit); + switch(Status->Specification.AdapterTimeout) { + case TRLLD_COMMAND_TIMEOUT: printf("Command\n"); + case TRLLD_TRANSMIT_TIMEOUT: printf("Transmit\n"); + case TRLLD_INTERRUPT_TIMEOUT: printf("Interrupt\n"); + default: printf("Unknown (%x)\n", Status->Specification.AdapterTimeout); + } + break; + default: + printf("oltr%d: Unknown status type (%x)\n", sc->unit, Status->Type); + + } + if (Status->Closed) { + if (sc->hw_state > HW_BAD) { + sc->hw_state = HW_FAILED; + printf("oltr%d: closing adapter due to failure.\n", sc->unit); + oltr_stop(sc); + } + } +} + +static void +DriverCloseCompleted(DriverHandle) + void *DriverHandle; +{ + struct oltr_softc *sc = &oltr_softc[(int)DriverHandle]; + + printf("oltr%d: DriverCloseCompleted\n", sc->unit); + + untimeout(oltr_timeout, (void *)sc->unit, sc->oltr_ch); + wakeup_one((void *)sc->unit); + + if ((sc->hw_state != HW_CLOSING) && (sc->hw_state != HW_CLOSING2) && (sc->hw_state != HW_CLOSED)) { + printf("oltr%d: adapter close complete called in wrong state (%d)\n", sc->unit, sc->hw_state); + return; + } + sc->hw_state = HW_CLOSING2; + if (sc->config->dmalevel != TRLLD_DMA_PIO) + isa_dma_release(sc->config->dmalevel); + +} + +static void +DriverStatistics(DriverHandle, Statistics) + void *DriverHandle; + TRlldStatistics_t *Statistics; +{ + printf("oltr: DriverStatistics\n"); +} + +static void +DriverTransmitFrameCompleted(DriverHandle, FrameHandle, TransmitStatus) + void *DriverHandle; + void *FrameHandle; + int TransmitStatus; +{ + int frame = (int)FrameHandle; + struct oltr_softc *sc = &oltr_softc[(int)DriverHandle]; + struct ifnet *ifp = &sc->arpcom.ac_if; + + /*printf("oltr%d: transmit complete frame %d\n", sc->unit, frame);*/ + if (TransmitStatus == TRLLD_TRANSMIT_OK) { + ifp->if_opackets++; + } else { + printf("oltr%d: DriverTransmitFrameCompleted (frame %d status %x)\n", sc->unit, frame, TransmitStatus); + ifp->if_oerrors++; + } + + if ((frame < 0) || (frame > TX_LIST_SIZE)) { + printf("oltr%d: bogus transmit frame. (%d)\n", sc->unit, frame); + return; + } + + if (sc->config->mode & TRLLD_MODE_16M) { + sc->tx_avail++; + } else { + m_freem(sc->tx_buffer[frame].m); + sc->tx_avail += sc->tx_buffer[frame].count; + } + + if ((ifp->if_flags & IFF_OACTIVE) && (sc->tx_avail > 0)) { + ifp->if_flags &= ~(IFF_OACTIVE); + oltr_start(ifp); + } + +} + +static void +DriverReceiveFrameCompleted(DriverHandle, ByteCount, FragmentCount, FragmentHandle, ReceiveStatus) + void *DriverHandle; + int ByteCount; + int FragmentCount; + void *FragmentHandle; + int ReceiveStatus; +{ + struct oltr_softc *sc = &oltr_softc[(int)DriverHandle]; + struct ifnet *ifp = &sc->arpcom.ac_if; + struct iso88025_header *th; + struct mbuf *m0, *m1, *m; + int j = (int)FragmentHandle, rc, frame_len = ByteCount, mac_hdr_len; + int mbuf_offset, mbuf_size, frag_offset, length; + char *frag = sc->rx_buffer[j].buf; + + /*printf("oltr%d: ReceiveFrameCompleted (Size %d Count %d Start %d)\n", sc->unit, ByteCount, FragmentCount, j);*/ + + if (sc->hw_state >= HW_OPEN) { /* Hardware operating normally */ + if (frag != sc->rx_buffer[sc->rx_next & RX_LIST_MASK].buf) { + printf("oltr%d: ring buffer pointer blown\n", sc->unit); + oltr_stop(sc); + return; + } + if (ReceiveStatus == TRLLD_RCV_OK) { /* Receive good frame */ + MGETHDR(m0, M_DONTWAIT, MT_DATA); + mbuf_size = MHLEN; + if (m0 == NULL) { + ifp->if_ierrors++; + goto out; + } + if (ByteCount + 2 > MHLEN) { + MCLGET(m0, M_DONTWAIT); + mbuf_size = MCLBYTES; + if ((m0->m_flags & M_EXT) == 0) { + m_freem(m0); + ifp->if_ierrors++; + goto out; + } + } + + m0->m_pkthdr.rcvif = &sc->arpcom.ac_if; + m0->m_pkthdr.len = ByteCount; + m0->m_len = 0; + m0->m_data += 2; + mbuf_size -=2; + th = mtod(m0, struct iso88025_header *); + m0->m_pkthdr.header = (void *)th; + + m = m0; mbuf_offset = 0; frag_offset = 0; + while (frame_len > 0) { + length = MIN3(frame_len, (RX_BUFFER_LEN - frag_offset), (mbuf_size - mbuf_offset)); + bcopy(frag + frag_offset, mtod(m, char *) + mbuf_offset, length); + m->m_len += length; + mbuf_offset += length; + frag_offset += length; + frame_len -= length; + if (frag_offset == RX_BUFFER_LEN) { + frag = sc->rx_buffer[++j].buf; + frag_offset = 0; + } + if ((mbuf_offset == mbuf_size) && (frame_len > 0)) { + MGET(m1, M_DONTWAIT, MT_DATA); + mbuf_size = MHLEN; + if (m1 == NULL) { + ifp->if_ierrors++; + m_freem(m0); + goto out; + } + if (frame_len > MHLEN) { + MCLGET(m1, M_DONTWAIT); + mbuf_size = MCLBYTES; + if ((m1->m_flags & M_EXT) == 0) { + m_freem(m0); + m_freem(m1); + ifp->if_ierrors++; + goto out; + } + } + m->m_next = m1; + m = m1; + mbuf_offset = 0; + m->m_len = 0; + } + } + ifp->if_ipackets++; + + if (ifp->if_bpf) + bpf_mtap(ifp, m0); + + if (ifp->if_flags & IFF_PROMISC) + if (bcmp(th->iso88025_dhost, etherbroadcastaddr, sizeof(th->iso88025_dhost)) != 0) { + if (((th->iso88025_dhost[0] & 0x7f) != sc->arpcom.ac_enaddr[0]) || + (bcmp(th->iso88025_dhost + 1, sc->arpcom.ac_enaddr + 1, ISO88025_ADDR_LEN - 1))) { + m_freem(m0); + goto out; + } + } + + mac_hdr_len = ISO88025_HDR_LEN; + if (th->iso88025_shost[0] & 0x80) /* Check for source routing info */ + mac_hdr_len += (ntohs(th->rcf) & 0x1f00) >> 8; + + m0->m_pkthdr.len -= mac_hdr_len; + m0->m_len -= mac_hdr_len; + m0->m_data += mac_hdr_len; + + iso88025_input(&sc->arpcom.ac_if, th, m0); + + } else { + if (ReceiveStatus != TRLLD_RCV_NO_DATA) { + printf("oltr%d: receive error. (ReceiveStatus=%d)\n", sc->unit, ReceiveStatus); + ifp->if_ierrors++; + } + } +out: + while (FragmentCount > 0) { + rc = TRlldReceiveFragment(sc->TRlldAdapter, + (void *)sc->rx_buffer[sc->rx_next & RX_LIST_MASK].buf, + kvtop(sc->rx_buffer[sc->rx_next & RX_LIST_MASK].buf), + RX_BUFFER_LEN, + (void *)sc->rx_buffer[sc->rx_next & RX_LIST_MASK].index); + if (rc == TRLLD_RECEIVE_OK) { + sc->rx_next++; + FragmentCount--; + } else { + printf("oltr%d: Adapter refused fragment (%d).\n", sc->unit, sc->rx_next - 1); + sc->rx_avail += FragmentCount; + break; + } + } + } else { /* Hardware being closed */ + if (frag != sc->rx_buffer[sc->rx_next++ & RX_LIST_MASK].buf) { + printf("oltr%d: ring buffer pointer blown\n", sc->unit); + } + sc->rx_avail += FragmentCount; + } + +} + + +/* + * ---------------------------- PMW Glue ------------------------------- + */ + +#ifndef TRlldInlineIO + +static void +DriverOutByte(IOAddress, value) + unsigned short IOAddress; + unsigned char value; +{ + outb(IOAddress, value); +} + +static void +DriverOutWord(IOAddress, value) + unsigned short IOAddress; + unsigned short value; +{ + outw(IOAddress, value); +} + +static void +DriverOutDword(IOAddress, value) + unsigned short IOAddress; + unsigned long value; +{ + outl(IOAddress, value); +} + +static void +DriverRepOutByte(IOAddress, DataPointer, ByteCount) + unsigned short IOAddress; + unsigned char *DataPointer; + int ByteCount; +{ + outsb(IOAddress, (void *)DataPointer, ByteCount); +} + +static void +DriverRepOutWord(IOAddress, DataPointer, WordCount) + unsigned short IOAddress; + unsigned short *DataPointer; + int WordCount; +{ + outsw(IOAddress, (void *)DataPointer, WordCount); +} + +static void +DriverRepOutDword(IOAddress, DataPointer, DWordCount) + unsigned short IOAddress; + unsigned long *DataPointer; + int DWordCount; +{ + outsl(IOAddress, (void *)DataPointer, DWordCount); +} + +static unsigned char +DriverInByte(IOAddress) + unsigned short IOAddress; +{ + return(inb(IOAddress)); +} + +static unsigned short +DriverInWord(IOAddress) + unsigned short IOAddress; +{ + return(inw(IOAddress)); +} + +static unsigned long +DriverInDword(IOAddress) + unsigned short IOAddress; +{ + return(inl(IOAddress)); +} + +static void +DriverRepInByte(IOAddress, DataPointer, ByteCount) + unsigned short IOAddress; + unsigned char *DataPointer; + int ByteCount; +{ + insb(IOAddress, (void *)DataPointer, ByteCount); +} + +static void +DriverRepInWord(IOAddress, DataPointer, WordCount) + unsigned short IOAddress; + unsigned short *DataPointer; + int WordCount; +{ + insw(IOAddress, (void *)DataPointer, WordCount); +} +static void +DriverRepInDword(IOAddress, DataPointer, DWordCount) + unsigned short IOAddress; + unsigned long *DataPointer; + int DWordCount; +{ + insl(IOAddress, (void *)DataPointer, DWordCount); +} +#endif /* TRlldInlineIO */ + +#endif /* NOLTR */ diff --git a/sys/contrib/dev/oltr/trlld.h b/sys/contrib/dev/oltr/trlld.h new file mode 100644 index 0000000..52b1960 --- /dev/null +++ b/sys/contrib/dev/oltr/trlld.h @@ -0,0 +1,900 @@ +/*
+ ****************************** trlld.h ***********************************
+ *
+ * Copyright (c) 1997
+ * OLICOM A/S
+ * Denmark
+ *
+ * All Rights Reserved
+ *
+ * This source file is subject to the terms and conditions of the
+ * OLICOM Software License Agreement which restricts the manner
+ * in which it may be used.
+ *
+ *---------------------------------------------------------------------------
+ *
+ * Description: PowerMACH Works header file
+ *
+ *---------------------------------------------------------------------------
+ * $Log: trlld.h,v $
+ * Rev 1.9 25 Jan 1999 09:56:28 EGS
+ * Added 3150
+ *
+ * Rev 1.8 10 Dec 1998 12:24:52 JHM
+ * version 1.2.0,prominfo structure with shorts.
+ *
+ * Rev 1.7 25 Nov 1998 16:18:48 JHM
+ * Bullseye mac, 100MBPS, mactype in config structure,
+ * 3540 adapter, TRlldTransmitFree, TRlldReceiveFree,
+ * TRlldAdapterName
+ *
+ * Rev 1.6 23 Oct 1998 16:00:36 JHM
+ * hawkeye adapter types
+ *
+ * Rev 1.5 11 Aug 1998 12:22:06 JHM
+ * split hawkeye types into PCI4,5,6
+ *
+ * Rev 1.4 10 Jul 1998 14:39:22 JHM
+ * OC_3140,OC_3250
+ *
+ * Rev 1.3 18 Jun 1998 11:32:20 JHM
+ * AddMemory,OC_3250
+ *
+ * Rev 1.2 18 Apr 1998 15:11:20 JHM
+ *
+ * Rev 1.1 09 Dec 1997 18:17:52 JHM
+ * rel111: TRlldDataPtr_t
+ *
+ * Rev 1.0 24 Nov 1997 11:08:58 JHM
+ * Initial revision.
+
+ Rev 1.5 18 Jun 1997 11:31:36 JHM
+ Checks for version
+
+ Rev 1.4 13 Jun 1997 13:47:34 JHM
+
+ Rev 1.3 13 Jun 1997 13:27:56 JHM
+ DTR support, version change
+
+ Rev 1.2 12 Jun 1997 11:43:20 JHM
+ TRLLD_INTERRUPT_TIMEOUT defined
+
+ Rev 1.1 11 Apr 1997 15:24:18 JHM
+ replaced tabs with spaces
+
+ Rev 1.0 11 Apr 1997 14:43:04 JHM
+ Initial revision.
+ *
+ ****************************************************************************
+*/
+
+#ifndef TRLLD_H
+#define TRLLD_H
+
+/* Data buffer pointers are always 32 bits.
+ For 16:16 it is segment:offset while it for 32:32 is a linear address. */
+
+#ifdef TRlldSmall
+#define TRlldDataPtr_t unsigned char far *
+#define TRlldWordDataPtr_t unsigned short far *
+#define TRlldDWordDataPtr_t unsigned long far *
+#else
+#define TRlldDataPtr_t unsigned char *
+#define TRlldWordDataPtr_t unsigned short *
+#define TRlldDWordDataPtr_t unsigned long *
+#endif
+
+#ifdef __WATCOMC__
+#define CDECL _cdecl
+#else
+#define CDECL
+#endif
+
+/*****************************************************************************/
+/* */
+/* Firmware */
+/* */
+/*****************************************************************************/
+
+extern unsigned char TRlldMacCode[]; /* 3115,17,18,29,33,36,37 */
+extern unsigned char TRlldHawkeyeMac[]; /* 3139,3140,3141,3250 */
+extern unsigned char TRlldBullseyeMac[]; /* 3150,3540 */
+
+/*****************************************************************************/
+/* */
+/* Maximal numbers of concurrent receive and transmit slots */
+/* */
+/*****************************************************************************/
+
+#define TRLLD_MAX_RECEIVE 32
+#define TRLLD_MAX_TRANSMIT 32
+
+/*****************************************************************************/
+/* */
+/* Maximal frame sizes */
+/* */
+/*****************************************************************************/
+
+#define TRLLD_MAXFRAME_100MBPS 18000
+#define TRLLD_MAXFRAME_16MBPS 18000
+#define TRLLD_MAXFRAME_4MBPS 4500
+
+/*****************************************************************************/
+/* */
+/* TRlldStatus contains the adapter status used in a DriverStatus call-back. */
+/* */
+/*****************************************************************************/
+
+struct OnWireInformation {
+ unsigned short RingStatus;
+ unsigned short Speed;
+ unsigned short AccessProtocol;
+ unsigned short Reserved;
+};
+
+typedef struct TRlldStatus {
+ unsigned short Type;
+ unsigned char Closed;
+ unsigned char AccessProtocol;
+ unsigned short MaxFrameSize;
+ unsigned short Reserved;
+ union {
+ unsigned short OnWireRingStatus; /* for compability */
+ unsigned short SelftestStatus;
+ unsigned short InitStatus;
+ unsigned short RingStatus;
+ unsigned short AdapterCheck[4];
+ unsigned short InternalError[4];
+ unsigned short PromRemovedCause;
+ unsigned short AdapterTimeout;
+ struct OnWireInformation OnWireInformation;
+ } Specification;
+} TRlldStatus_t;
+
+/* values of TRlldStatus.Type */
+
+#define TRLLD_STS_ON_WIRE 0
+#define TRLLD_STS_SELFTEST_STATUS 1
+#define TRLLD_STS_INIT_STATUS 2
+#define TRLLD_STS_RING_STATUS 3
+#define TRLLD_STS_ADAPTER_CHECK 4
+#define TRLLD_STS_PROMISCUOUS_STOPPED 5
+#define TRLLD_STS_LLD_ERROR 6
+#define TRLLD_STS_ADAPTER_TIMEOUT 7
+
+/* values of TRlldStatus.Closed */
+
+#define TRLLD_STS_STATUS_OK 0
+#define TRLLD_STS_STATUS_CLOSED 1
+
+/* values of TRlldStatus.AccessProtocol */
+
+#define TRLLD_ACCESS_UNKNOWN 0
+#define TRLLD_ACCESS_TKP 1
+#define TRLLD_ACCESS_TXI 2
+
+/* values of TRlldStatus.SelftestStatus */
+
+#define TRLLD_ST_OK 0
+#define TRLLD_ST_ERROR 0x0100 /* actual errors are 010x, where x is */
+ /* 0: Initial Test Error */
+ /* 1: Adapter Software Checksum Error */
+ /* 2: Adapter RAM Error */
+ /* 4: Instruction Test Error */
+ /* 5: Protocol Handler/RI Hw Error */
+ /* 6: System Interface Register Error */
+
+#define TRLLD_ST_TIMEOUT 0x0200 /* The adapter did not complete */
+ /* selftest after download */
+
+/* values of TRlldStatus.Specification.InitStatus */
+
+/* the most likely cause of an init error (whatever the code) is a wrong */
+/* physical or virtual address of the adapter block in TRlldAdapterInit */
+
+#define TRLLD_INIT_ERROR 0x100 /* actual errors are 010x, where x is */
+ /* 1: Invalid init block (LLD error) */
+ /* 2: Invalid options (LLD error) */
+ /* 3: Invalid rcv burst (LLD error) */
+ /* 4: Invalid xmt burst (LLD error) */
+ /* 5: Invalid DMA threshold (LLDerror)*/
+ /* 6: Invalid scb addr */
+ /* 7: Invalid ssb addr */
+ /* 8: DIO parity error (HW error) */
+ /* 9: DMA timeout (May be interrupt
+ failing if PIO mode or PCI2) */
+ /* A: DMA parity error (HW error) */
+ /* B: DMA bus error (HW error) */
+ /* C: DMA data error */
+ /* D: Adapter check */
+
+#define TRLLD_INIT_TIMEOUT 0x200 /* adapter init did not complete */
+#define TRLLD_INIT_DMA_ERROR 0x300 /* adapter cannot access sys memory */
+#define TRLLD_INIT_INTR_ERROR 0x400 /* adapter cannot interrupt */
+#define TRLLD_OPEN_TIMEOUT 0x500 /* adapter open did not complete */
+ /* within 30 seconds */
+
+#define TRLLD_OPEN_ERROR 0x600 /* actual errors are 06xx, where the */
+ /* bits in x mean: */
+ /* 01: Invalid open options (LLDerror)*/
+ /* 04: TxBuffer count error (LLDerror)*/
+ /* 10: Buffer size error (LLD error) */
+ /* 20: List size error (LLD error) */
+ /* 40: Node address error */
+
+#define TRLLD_OPEN_REPEAT 0x700 /* actual errors are 07xy, where */
+ /* x is the open phase: */
+ /* 1: Lobe media test */
+ /* 2: Physical Insertion */
+ /* 3: Address verification */
+ /* 4: Participation in ring poll */
+ /* 5: Request Initialization */
+ /* 9: Request registration (TXI) */
+ /* A: Lobe Media Test (TXI) */
+ /* B: Address verification (TXI) */
+ /* y is the type of error: */
+ /* 1: Function failure (No Cable ?) */
+ /* 2: Signal loss */
+ /* 5: Timeout */
+ /* 6: Ring failure (TKP) */
+ /* 6: Protocol error (TXI) */
+ /* 7: Ring beaconing */
+ /* 8: Duplicate Node Address (TKP) */
+ /* 8: Insert Denied (TXI) */
+ /* 9: Request Initialization (TKP) */
+ /* 9: Heart beat failure (TXI) */
+ /* A: Remove received */
+ /* B: C-port address changed (TXI) */
+ /* C: Wire Fault (TKP) */
+ /* D: Auto Speed, 1. on ring (TKP) */
+ /* E: Speed sense failed */
+
+/* When opening with FORCE_TXI and only classic token ring attachment is */
+/* possible, the error is Request Registration/Timeout or 0x795 */
+
+#define TRLLD_OPEN_1ST_ON_RING 0x800 /* Speed sense is active, but no other*/
+ /* station is present to set the speed*/
+
+
+/* values of TRlldStatus.Specification.RingStatus */
+
+#define TRLLD_RS_SIGNAL_LOSS 0x8000
+#define TRLLD_RS_HARD_ERROR 0x4000
+#define TRLLD_RS_SOFT_ERROR 0x2000
+#define TRLLD_RS_TRANSMIT_BEACON 0x1000
+#define TRLLD_RS_LOBE_WIRE_FAULT 0x0800
+#define TRLLD_RS_AUTO_REMOVAL_ERROR 0x0400
+#define TRLLD_RS_REMOVE_RECEIVED 0x0100
+#define TRLLD_RS_COUNTER_OVERFLOW 0x0080
+#define TRLLD_RS_SINGLE_STATION 0x0040
+#define TRLLD_RS_RING_RECOVERY 0x0020
+
+/* values of TRlldStatus.Specification.AdapterCheck */
+/* MISSING */
+
+/* values of TRlldStatus.Specification.PromRemovedCause */
+
+#define TRLLD_PROM_REMOVE_RECEIVED 1
+#define TRLLD_PROM_POLL_FAILURE 2
+#define TRLLD_PROM_BUFFER_SIZE 3
+
+/* values of TRlldStatus.Specification.InternalError */
+
+#define TRLLD_INTERNAL_PIO 1 /* A PIO transfer to or from adapter */
+ /* did not complete */
+#define TRLLD_INTERNAL_TX 2 /* Trouble with clean up of tx frames */
+#define TRLLD_INTERNAL_RX 3 /* Trouble with clean up of receive */
+ /* fragments */
+#define TRLLD_INTERNAL_CMD 4 /* error response from adapter */
+#define TRLLD_INTERNAL_STATE 5 /* event happened in unexpected state */
+
+/* values of TRlldStatus.Specification.AdapterTimeout */
+
+#define TRLLD_COMMAND_TIMEOUT 1
+#define TRLLD_TRANSMIT_TIMEOUT 2
+#define TRLLD_INTERRUPT_TIMEOUT 3
+
+
+/*****************************************************************************/
+/* */
+/* TRlldStatistics contains the adapter statistics returned to Driver */
+/* in TRlldStatistics calls and DriverStatistics call-backs */
+/* */
+/*****************************************************************************/
+
+typedef struct TRlldStatistics {
+ unsigned long LineErrors;
+ unsigned long InternalErrors; /* Not maintained by TMS based boards */
+ unsigned long BurstErrors;
+ unsigned long ARIFCIErrors;
+ unsigned long AbortDelimiters; /* Not maintained by TMS based boards */
+ unsigned long LostFrames;
+ unsigned long CongestionErrors;
+ unsigned long FrameCopiedErrors;
+ unsigned long FrequencyErrors; /* Not maintained by TMS based boards */
+ unsigned long TokenErrors;
+ unsigned long DMABusErrors; /* Not maintained by 3139 */
+ unsigned long DMAParityErrors; /* Not maintained by 3139 */
+ unsigned long ReceiveLongFrame; /* Not maintained by TMS based boards */
+ unsigned long ReceiveCRCErrors; /* Not maintained by TMS based boards */
+ unsigned long ReceiveOverflow; /* Not maintained by TMS based boards */
+ unsigned long TransmitUnderrun; /* Not maintained by TMS based boards */
+ unsigned long UnderrunLock; /* Not maintained by TMS based boards */
+ unsigned long OverflowReset;
+ unsigned char UpstreamNeighbour[6];
+ unsigned short RingNumber;
+ unsigned char BeaconingUpstreamNeighbour[6];
+ unsigned short padding;
+} TRlldStatistics_t;
+
+
+/*****************************************************************************/
+/* */
+/* TRlldDriver contains the Driver call-backs */
+/* */
+/*****************************************************************************/
+
+typedef struct TRlldDriver {
+ unsigned long TRlldVersion;
+#ifndef TRlldInlineIO
+ void (CDECL * DriverOutByte)(unsigned short IOAddress,
+ unsigned char Value);
+ void (CDECL * DriverOutWord)(unsigned short IOAddress,
+ unsigned short Value);
+ void (CDECL * DriverOutDWord)(unsigned short IOAddress,
+ unsigned long Value);
+ void (CDECL * DriverRepOutByte)(unsigned short IOAddress,
+ TRlldDataPtr_t DataPointer,
+ int ByteCount);
+ void (CDECL * DriverRepOutWord)(unsigned short IOAddress,
+ TRlldWordDataPtr_t DataPointer,
+ int WordCount);
+ void (CDECL * DriverRepOutDWord)(unsigned short IOAddress,
+ TRlldDWordDataPtr_t DataPointer,
+ int DWordCount);
+ unsigned char (CDECL * DriverInByte)(unsigned short IOAddress);
+ unsigned short (CDECL * DriverInWord)(unsigned short IOAddress);
+ unsigned long (CDECL * DriverInDWord)(unsigned short IOAddress);
+ void (CDECL * DriverRepInByte)(unsigned short IOAddress,
+ TRlldDataPtr_t DataPointer,
+ int ByteCount);
+ void (CDECL * DriverRepInWord)(unsigned short IOAddress,
+ TRlldWordDataPtr_t DataPointer,
+ int WordCount);
+ void (CDECL * DriverRepInDWord)(unsigned short IOAddress,
+ TRlldDWordDataPtr_t DataPointer,
+ int DWordCount);
+#endif
+ void (CDECL * DriverSuspend)(unsigned short MicroSeconds);
+ void (CDECL * DriverStatus)(void * DriverHandle,
+ TRlldStatus_t * Status);
+ void (CDECL * DriverCloseCmpltd)(void * DriverHandle);
+ void (CDECL * DriverStatistics)(void * DriverHandle,
+ TRlldStatistics_t * Statistics);
+ void (CDECL * DriverTxFrameCmpltd)(void * DriverHandle,
+ void * FrameHandle,
+ int TxStatus);
+ void (CDECL * DriverRcvFrameCmpltd)(void * DriverHandle,
+ int ByteCount,
+ int FragmentCount,
+ void * FragmentHandle,
+ int RcvStatus);
+} TRlldDriver_t;
+
+/* Version and model control */
+
+#define TRLLD_VERSION_INLINEIO 0x8000
+#define TRLLD_VERSION_SMALL 0x4000
+#ifdef TRlldInlineIO
+#ifdef TRlldSmall
+#define TRLLD_VERSION 0x4120
+#else
+#define TRLLD_VERSION 0x0120
+#endif
+#else
+#ifdef TRlldSmall
+#define TRLLD_VERSION 0xC120
+#else
+#define TRLLD_VERSION 0x8120
+#endif
+#endif
+
+
+/*****************************************************************************/
+/* */
+/* TRlldAdapterConfig contains the properties found for an adapter */
+/* used when finding and defining adapters to use */
+/* */
+/*****************************************************************************/
+
+
+struct pnp_id {
+ unsigned short vendor;
+ unsigned short device;
+};
+
+struct pci_id {
+ unsigned short vendor;
+ unsigned short device;
+ unsigned char revision;
+ unsigned char reserved_byte;
+ unsigned short reserved_word;
+};
+
+struct pcmcia_id {
+ /* unknown as yet */
+ unsigned char x;
+};
+
+struct pci_slot {
+ unsigned short bus_no;
+ unsigned short device_no;
+};
+
+struct pcmcia_socket {
+ /* unknown as yet */
+ unsigned char x;
+};
+
+typedef struct TRlldAdapterConfig {
+ unsigned char type;
+ unsigned char bus;
+ unsigned short magic;
+ union {
+ struct pnp_id pnp;
+ unsigned long eisa;
+ unsigned short mca;
+ struct pci_id pci;
+ struct pcmcia_id pcmcia;
+ } id;
+ union {
+ unsigned short csn;
+ unsigned short eisa;
+ unsigned short mca;
+ struct pci_slot pci;
+ struct pcmcia_socket pcmcia;
+ } slot;
+ unsigned short iobase0;
+ unsigned short iolength0;
+ unsigned short iobase1;
+ unsigned short iolength1;
+ unsigned long memorybase;
+ unsigned short memorylength;
+ unsigned char mode;
+ unsigned char xmode;
+ unsigned char interruptlevel;
+ unsigned char dmalevel;
+ unsigned char macaddress[6];
+ unsigned long prombase;
+ unsigned char speed;
+ unsigned char cachelinesize;
+ unsigned short pcicommand;
+ unsigned char mactype;
+ unsigned char reserved[3];
+} TRlldAdapterConfig_t;
+
+/* values of TRlldAdapterConfig.Type */
+
+#define TRLLD_ADAPTER_XT 0 /* not supported */
+#define TRLLD_ADAPTER_ISA1 1 /* OC-3115 */
+#define TRLLD_ADAPTER_ISA2 2 /* OC-3117 */
+#define TRLLD_ADAPTER_ISA3 3 /* OC-3118 */
+#define TRLLD_ADAPTER_MCA1 4 /* OC-3129 id A84 */
+#define TRLLD_ADAPTER_MCA2 5 /* OC-3129 id A85 */
+#define TRLLD_ADAPTER_MCA3 6 /* OC-3129 id A86 */
+#define TRLLD_ADAPTER_EISA1 7 /* OC-3133 id 0109833D */
+#define TRLLD_ADAPTER_EISA2 8 /* OC-3133 id 0209833D */
+#define TRLLD_ADAPTER_EISA3 9 /* OC-3135 not supported */
+#define TRLLD_ADAPTER_PCI1 10 /* OC-3136 id 108d0001 rev 1 */
+#define TRLLD_ADAPTER_PCI2 11 /* OC-3136 id 108d0001 rev 2 */
+#define TRLLD_ADAPTER_PCI3 12 /* OC-3137 id 108d0001 rev 3 */
+#define TRLLD_ADAPTER_PCI4 13 /* OC-3139 id 108d0004 rev 2 */
+#define TRLLD_ADAPTER_PCI5 14 /* OC-3140 id 108d0004 rev 3 */
+#define TRLLD_ADAPTER_PCI6 15 /* OC-3141 id 108d0007 rev 1 */
+#define TRLLD_ADAPTER_PCI7 19 /* OC-3540 id 108d0008 rev 1 */
+#define TRLLD_ADAPTER_PCI8 20 /* OC-3150 id 108d000a rev 1 */
+#ifdef PCMCIA
+#define TRLLD_ADAPTER_PCCARD1 16 /* OC-3220 */
+#define TRLLD_ADAPTER_PCCARD2 17 /* OC-3221,OC-3230,OC-3232 */
+#endif
+#define TRLLD_ADAPTER_PCCARD3 18 /* OC-3250 id 108d0005 rev 1 */
+
+/* values of TRlldAdapterConfig.Bus */
+
+#define TRLLD_BUS_ISA 1
+#define TRLLD_BUS_EISA 2
+#define TRLLD_BUS_MCA 3
+#define TRLLD_BUS_PCI 4
+#define TRLLD_BUS_PCMCIA 5
+
+/* values of TRlldAdapterConfig.mode */
+
+#define TRLLD_MODE_16M 0x01 /* needs data buffers below 16 M */
+#define TRLLD_MODE_PHYSICAL 0x02 /* needs valid physical addresses */
+#define TRLLD_MODE_FIXED_CFG 0x04 /* cannot be reconfigured */
+#define TRLLD_MODE_SHORT_SLOT 0x08 /* in short ISA slot, cannot use DMA */
+#define TRLLD_MODE_CANNOT_DISABLE 0x10 /* can not disable interrupt */
+#define TRLLD_MODE_SHARE_INTERRUPT 0x20 /* may share interrupt */
+#define TRLLD_MODE_MEMORY 0x40 /* is configured with a memory window*/
+
+/* values of TRlldAdapterConfig.dma */
+
+#define TRLLD_DMA_PIO 4 /* other values signifies the DMA channel */
+#define TRLLD_DMA_MASTER 0xff /* to use */
+
+/* values of TRlldAdapterConfig.mactype */
+
+ /* download with: */
+#define TRLLD_MAC_TMS 1 /* TRlldMACCode */
+#define TRLLD_MAC_HAWKEYE 2 /* TRlldHawkeyeMAC */
+#define TRLLD_MAC_BULLSEYE 3 /* TRlldBullseyeMAC */
+
+
+typedef void * TRlldAdapter_t;
+typedef void * TRlldAdapterType_t;
+
+#ifndef MAX_FRAGMENTS
+#define MAX_FRAGMENTS 32
+#endif
+
+typedef struct TRlldTransmit {
+ unsigned short FragmentCount;
+ unsigned short TRlldTransmitReserved;
+ struct TRlldTransmitFragment {
+ unsigned long PhysicalAddress;
+ TRlldDataPtr_t VirtualAddress;
+ unsigned short count;
+ unsigned short TRlldTransmitFragmentReserved;
+ } TransmitFragment[MAX_FRAGMENTS];
+} TRlldTransmit_t;
+
+int CDECL TRlldAdapterSize(void);
+
+int CDECL TRlldInit(int TypeCount,
+ TRlldAdapterType_t * AdapterTypeTable);
+
+extern TRlldAdapterType_t CDECL TRlld3115; /* ISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3117;
+extern TRlldAdapterType_t CDECL TRlld3118;
+extern TRlldAdapterType_t CDECL TRlld3129; /* MCA adapters */
+extern TRlldAdapterType_t CDECL TRlld3133; /* EISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3136; /* PCI adapters */
+extern TRlldAdapterType_t CDECL TRlld3137;
+extern TRlldAdapterType_t CDECL TRlld3139; /* Hawkeye adapters */
+extern TRlldAdapterType_t CDECL TRlld3540; /* Bullseye adapters */
+
+#define T3115 &TRlld3115
+#define T3117 &TRlld3117
+#define T3118 &TRlld3118
+#define T3129 &TRlld3129
+#define T3133 &TRlld3133
+#define T3136 &TRlld3136
+#define T3137 &TRlld3137
+#define T3139 &TRlld3139
+#define T3540 &TRlld3540
+
+/* Only for Boot Prom Page Zero code */
+
+extern TRlldAdapterType_t CDECL TRlld3115Boot; /* ISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3117Boot;
+extern TRlldAdapterType_t CDECL TRlld3118Boot;
+extern TRlldAdapterType_t CDECL TRlld3129Boot; /* MCA adapters */
+extern TRlldAdapterType_t CDECL TRlld3133Boot; /* EISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3136Boot; /* PCI adapters */
+extern TRlldAdapterType_t CDECL TRlld3137Boot;
+extern TRlldAdapterType_t CDECL TRlld3139Boot; /* Hawkeye adapters */
+extern TRlldAdapterType_t CDECL TRlld3150Boot;
+extern TRlldAdapterType_t CDECL TRlld3250Boot;
+extern TRlldAdapterType_t CDECL TRlld3540Boot; /* Bullseye adapter */
+
+#define B3115 &TRlld3115Boot
+#define B3117 &TRlld3117Boot
+#define B3118 &TRlld3118Boot
+#define B3129 &TRlld3129Boot
+#define B3133 &TRlld3133Boot
+#define B3136 &TRlld3136Boot
+#define B3137 &TRlld3137Boot
+#define B3139 &TRlld3139Boot
+#define B3150 &TRlld3150Boot
+#define B3250 &TRlld3250Boot
+#define B3540 &TRlld3540Boot
+
+#define TRLLD_INIT_OK 0
+#define TRLLD_INIT_UNKNOWN 5
+
+int CDECL TRlldAdapterInit(TRlldDriver_t * DriverDefinition,
+ TRlldAdapter_t * TRlldAdapter,
+ unsigned long TRlldAdapterPhysical,
+ void * DriverHandle,
+ TRlldAdapterConfig_t * config);
+
+#define TRLLD_INIT_OK 0
+#define TRLLD_INIT_NOT_FOUND 1
+#define TRLLD_INIT_UNSUPPORTED 2
+#define TRLLD_INIT_PHYS16 3
+#define TRLLD_INIT_VERSION 4
+
+int CDECL TRlldSetSpeed(TRlldAdapter_t * adapter,
+ unsigned char speed);
+
+#define TRLLD_SPEED_4MBPS 4
+#define TRLLD_SPEED_16MBPS 16
+#define TRLLD_SPEED_100MBPS 100
+
+int CDECL TRlldSetInterrupt(TRlldAdapter_t * adapter,
+ unsigned char interruptlevel);
+
+int CDECL TRlldSetDMA(TRlldAdapter_t * adapter,
+ unsigned char dma, unsigned char * mode);
+
+#define TRLLD_CONFIG_OK 0
+#define TRLLD_CONFIG_STATE 1
+#define TRLLD_CONFIG_ILLEGAL 2
+#define TRLLD_CONFIG_FAILED 3
+
+int CDECL TRlldSetSpecial(TRlldAdapter_t * adapter,
+ unsigned short param1, unsigned short param2,
+ unsigned short param3, unsigned short param4);
+
+int CDECL TRlldAddMemory(TRlldAdapter_t * adapter,
+ TRlldDataPtr_t virtual,
+ unsigned long physical,
+ long size);
+
+int CDECL TRlldDisable(TRlldAdapter_t * adapter);
+
+#define TRLLD_OK 0
+#define TRLLD_NOT_SUPPORTED 1
+
+void CDECL TRlldEnable(TRlldAdapter_t * adapter);
+
+int CDECL TRlldInterruptPresent(TRlldAdapter_t * adapter);
+
+#define TRLLD_NO_INTERRUPT 0
+#define TRLLD_INTERRUPT 1
+
+int CDECL TRlldInterruptService(TRlldAdapter_t * adapter);
+
+int CDECL TRlldInterruptPreService(TRlldAdapter_t * adapter);
+
+void CDECL TRlldInterruptPostService(TRlldAdapter_t * adapter);
+
+
+int CDECL TRlldPoll(TRlldAdapter_t * adapter);
+
+int CDECL TRlldDownload(TRlldAdapter_t * adapter,
+ char * DownLoadCode);
+
+#define TRLLD_DOWNLOAD_OK 0
+#define TRLLD_DOWNLOAD_ERROR 1
+#define TRLLD_STATE 2
+
+typedef int (CDECL * GetCode_t)(void * handle, unsigned char * maccodebyte);
+
+int CDECL TRlldStreamDownload(TRlldAdapter_t * adapter,
+ GetCode_t procedure, void * handle);
+
+int CDECL TRlldOpen(TRlldAdapter_t * adapter,
+ unsigned char * MACAddress,
+ unsigned long GroupAddress,
+ unsigned long FunctionalAddress,
+ unsigned short MaxFrameSize,
+ unsigned short OpenModes);
+
+#define TRLLD_OPEN_OK 0
+#define TRLLD_OPEN_STATE 1
+#define TRLLD_OPEN_ADDRESS_ERROR 2
+#define TRLLD_OPEN_MODE_ERROR 3
+#define TRLLD_OPEN_MEMORY 4
+
+#define TRLLD_MODE_TX_STATUS 0x01
+#define TRLLD_MODE_RX_SINGLE 0x02
+#define TRLLD_MODE_FORCE_TKP 0x04
+#define TRLLD_MODE_FORCE_TXI 0x08
+#define TRLLD_MODE_TX_CRC 0x10
+
+void CDECL TRlldClose(TRlldAdapter_t * adapter, int immediate);
+
+void CDECL TRlldSetGroupAddress(TRlldAdapter_t * adapter,
+ unsigned long GroupAddress);
+
+void CDECL TRlldSetFunctionalAddress(TRlldAdapter_t * adapter,
+ unsigned long FunctionalAddress);
+
+void CDECL TRlldSetPromiscuousMode(TRlldAdapter_t * adapter,
+ unsigned char mode);
+
+/* mode bits */
+
+#define TRLLD_PROM_LLC 1
+#define TRLLD_PROM_MAC 2
+#define TRLLD_PROM_ERRORFRAMES 4
+
+int CDECL TRlldGetStatistics(TRlldAdapter_t * adapter,
+ TRlldStatistics_t * statistics,
+ int immediate);
+
+#define TRLLD_IMMEDIATE_STATISTICS 1
+
+#define TRLLD_STATISTICS_RETRIEVED 0
+#define TRLLD_STATISTICS_PENDING 1
+
+int CDECL TRlldTransmitFrame(TRlldAdapter_t * adapter,
+ TRlldTransmit_t * TransmitFrame,
+ void * FrameHandle);
+
+#define TRLLD_TRANSMIT_OK 0
+#define TRLLD_TRANSMIT_NOT_OPEN 1
+#define TRLLD_TRANSMIT_TOO_MANY 2
+#define TRLLD_TRANSMIT_MAX16 3
+#define TRLLD_TRANSMIT_SIZE 4
+#define TRLLD_TRANSMIT_EMPTY 5
+
+/* completion flags */
+
+#define TRLLD_TX_OK 0
+#define TRLLD_TX_NOT_PROCESSED 1
+#define TRLLD_TX_NOT_RECOGNIZED 2
+#define TRLLD_TX_NOT_COPIED 3
+
+/* number of free transmit fragments */
+
+int CDECL TRlldTransmitFree(TRlldAdapter_t * adapter);
+
+int CDECL TRlldReceiveFragment(TRlldAdapter_t * adapter,
+ TRlldDataPtr_t FragmentStart,
+ unsigned long FragmentPhysical,
+ int count,
+ void * FragmentHandle);
+
+#define TRLLD_RECEIVE_OK 0
+#define TRLLD_RECEIVE_NOT_OPEN 1
+#define TRLLD_RECEIVE_TOO_MANY 2
+#define TRLLD_RECEIVE_SIZE 3
+#define TRLLD_RECEIVE_MAX16 4
+
+/* completion flags */
+
+#define TRLLD_RCV_OK 0
+#define TRLLD_RCV_NO_DATA 1
+#define TRLLD_RCV_ERROR 2 /* Only when TRLLD_PROM_ERRORFRAMES */
+#define TRLLD_RCV_LONG 3
+
+/* number of free receive fragments */
+
+int CDECL TRlldReceiveFree(TRlldAdapter_t * adapter);
+
+int CDECL TRlldFind(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config_table,
+ unsigned long type_mask,
+ int max);
+
+/* type mask bits */
+
+#define OC_3115 0x0001
+#define OC_3117 0x0002
+#define OC_3118 0x0004
+#define OC_3129 0x0008
+#define OC_3133 0x0010
+#define OC_3136 0x0040
+#define OC_3137 0x0080
+#define OC_3139 0x0100
+#define OC_3140 0x0200
+#define OC_3141 0x0400
+#define OC_3540 0x0800
+#define OC_3150 0x1000
+
+#ifdef PCMCIA
+#define OC_3220 0x0800
+#define OC_3221 0x1000
+#define OC_3230 0x2000
+#define OC_3232 0x4000
+#endif
+
+#define OC_3250 0x8000
+
+int CDECL TRlldIOAddressConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ unsigned short address);
+
+
+#define TRLLD_FIND_OK 1
+#define TRLLD_FIND_ERROR 0
+#define TRLLD_FIND_VERSION -1
+
+int CDECL TRlldEISASlotConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ int slot);
+
+int CDECL TRlldMCASlotConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ int slot);
+
+int CDECL TRlldPCIConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ char * PCIConfigurationSpace);
+
+#define TRLLD_PCICONFIG_OK 0
+#define TRLLD_PCICONFIG_FAIL 1
+#define TRLLD_PCICONFIG_SET_COMMAND 2
+#define TRLLD_PCICONFIG_VERSION 3
+
+
+int CDECL TRlldFindPCI(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config_table,
+ unsigned long type_mask,
+ int max);
+
+#ifdef PCMCIA
+typedef void * PCCardHandle_t;
+
+typedef int (CDECL * GetTupleData_t)(PCCardHandle_t handle,
+ unsigned short TupleIdent,
+ char * TupleData,
+ int length);
+
+int CDECL TRlldPCCardConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ unsigned short address,
+ int irq,
+ GetTupleData_t GetTuple,
+ PCCardHandle_t handle);
+
+#define TRLLD_PCCARD_CONFIG_OK 0
+#define TRLLD_PCCARD_CONFIG_FAIL 1
+#endif
+
+/* Boot Prom Support */
+
+typedef struct TRlldPromInfo {
+ unsigned short PromIdent;
+ short PromPages;
+ short PromPageSize;
+} TRlldPromInfo_t;
+
+int CDECL TRlldMapBootProm(TRlldAdapter_t * adapter,
+ TRlldDataPtr_t prompointer);
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_FAILED 3
+
+int CDECL TRlldGetPromInfo(TRlldAdapter_t * adapter, TRlldPromInfo_t * info);
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_NOT_MOUNTED 1
+#define TRLLD_PROM_NOT_MAPPED 2
+
+void CDECL TRlldSetPromPage(TRlldAdapter_t * adapter, int page);
+
+int CDECL TRlldSetMemoryUse(TRlldAdapter_t * adapter, int use);
+
+#define TRLLD_PROM_TO_MEMORY 0
+#define TRLLD_REGISTERS_TO_MEMORY 1
+
+#define TRLLD_MEMORY_USE_OK 0
+#define TRLLD_MEMORY_USE_NO_MEMORY 1
+#define TRLLD_MEMORY_USE_STATE 2
+#define TRLLD_MEMORY_USE_ILLEGAL 3
+
+int CDECL TRlldPromErase(TRlldAdapter_t * adapter,
+ void (CDECL * delay)(int milliseconds));
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_NOT_MOUNTED 1
+#define TRLLD_PROM_NOT_MAPPED 2
+#define TRLLD_PROM_FAILED 3
+
+int CDECL TRlldPromWrite(TRlldAdapter_t * adapter, char * data,
+ int offset, int count);
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_NOT_MOUNTED 1
+#define TRLLD_PROM_NOT_MAPPED 2
+#define TRLLD_PROM_FAILED 3
+#define TRLLD_PROM_ILLEGAL 4
+
+void CDECL TRlldEmergency(TRlldAdapter_t * adapter);
+
+/* Convert from TRlldAdapterConfig.type to name string */
+char * CDECL TRlldAdapterName(int type);
+#endif
diff --git a/sys/contrib/dev/oltr/trlldbm.c b/sys/contrib/dev/oltr/trlldbm.c new file mode 100644 index 0000000..a950cd3 --- /dev/null +++ b/sys/contrib/dev/oltr/trlldbm.c @@ -0,0 +1,2027 @@ +/* + * $FreeBSD$ + * + * Copyright (c) 1997 + * OLICOM A/S + * Denmark + * + * All Rights Reserved + * + * This source file is subject to the terms and conditions of the + * OLICOM Software License Agreement which restricts the manner + * in which it may be used. + * + *--------------------------------------------------------------------------- + * + * Description: Olicom Bullseye adapter micro-code + * + *--------------------------------------------------------------------------- + */ + +#include "opt_oltr.h" + +#ifndef OLTR_NO_BULLSEYE_MAC + +unsigned char TRlldBullseyeMac[] = { 0x52, 0x94, 0x04, 0x00, 0x02, 0x7d, 0x0b, 0xe7, 0x4f, 0x43, 0x53, 0x4d, 0x41, 0x43, 0x2e, 0x42, + 0x55, 0x4c, 0x4c, 0x53, 0x45, 0x59, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xea, 0x55, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xb8, 0x00, 0x00, 0xbb, 0x00, + 0x00, 0xb9, 0x00, 0x00, 0xba, 0x00, 0x00, 0xbe, 0x00, 0x00, 0xbf, 0x00, 0x00, 0xbd, 0x00, 0x00, + 0x8c, 0xc8, 0x8e, 0xd8, 0x8e, 0xc0, 0x8e, 0xd0, 0xb8, 0x20, 0x5f, 0x8b, 0xe0, 0x83, 0x3e, 0x4e, + 0x00, 0x00, 0x75, 0x1c, 0x2b, 0xdb, 0x8b, 0xf3, 0xad, 0x8b, 0xd8, 0x8b, 0xc8, 0xd1, 0xe9, 0x49, + 0x49, 0xad, 0x03, 0xd8, 0xe2, 0xfb, 0x0b, 0xdb, 0x74, 0x06, 0xc7, 0x06, 0xf2, 0x5d, 0x01, 0x00, + 0xb8, 0x00, 0x00, 0x8e, 0xd8, 0xc7, 0x06, 0x0c, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x0e, 0x00, 0xc7, + 0x06, 0x04, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x06, 0x00, 0xc7, 0x06, 0x14, 0x00, 0x9a, 0x01, 0x8c, + 0x0e, 0x14, 0x00, 0xc7, 0x06, 0x08, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x08, 0x00, 0x90, 0x90, 0x90, + 0xc7, 0x06, 0x20, 0x00, 0x10, 0x24, 0x8c, 0x0e, 0x22, 0x00, 0x2b, 0xc0, 0xe7, 0x06, 0xc7, 0x06, + 0x30, 0x00, 0xee, 0x0d, 0x8c, 0x0e, 0x32, 0x00, 0xc7, 0x06, 0x34, 0x00, 0xe8, 0x0e, 0x8c, 0x0e, + 0x36, 0x00, 0xc7, 0x06, 0x38, 0x00, 0x1a, 0x0f, 0x8c, 0x0e, 0x3a, 0x00, 0xc7, 0x06, 0x3c, 0x00, + 0x9a, 0x01, 0x8c, 0x0e, 0x3e, 0x00, 0xc7, 0x06, 0x08, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x0a, 0x00, + 0xc7, 0x06, 0x14, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x16, 0x00, 0xbb, 0x40, 0x60, 0x8e, 0xc3, 0x26, + 0x83, 0x0e, 0x32, 0x00, 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, + 0x32, 0x00, 0xf7, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x0e, 0x32, 0x00, + 0x08, 0x2a, 0xe4, 0xb0, 0x13, 0xe6, 0x10, 0x90, 0x90, 0x90, 0xb0, 0x08, 0xe6, 0x12, 0x90, 0x90, + 0x90, 0xb0, 0x09, 0xe6, 0x12, 0x90, 0x90, 0x90, 0xb0, 0xff, 0xe6, 0x12, 0x90, 0x90, 0x90, 0x26, + 0x83, 0x26, 0x32, 0x00, 0xf7, 0x90, 0x90, 0x90, 0x33, 0xc0, 0x26, 0xc7, 0x06, 0x44, 0x00, 0xff, + 0xff, 0x26, 0xc7, 0x06, 0x46, 0x00, 0xff, 0xff, 0x26, 0x09, 0x06, 0x48, 0x00, 0x26, 0x09, 0x06, + 0x4a, 0x00, 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8, 0x0f, 0x27, 0xe7, 0x00, 0xb8, 0x09, 0x00, 0xe7, + 0x06, 0xb0, 0x11, 0xe8, 0x89, 0x0a, 0xe8, 0xc7, 0x0a, 0xfb, 0xe9, 0x71, 0x0b, 0x90, 0x50, 0xb0, + 0xa0, 0xe6, 0x10, 0x58, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xe7, 0xe7, 0xe7, 0x30, 0x32, + 0x30, 0x33, 0x39, 0x39, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x38, 0x2c, 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x4f, 0x6c, + 0x69, 0x63, 0x6f, 0x6d, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x5a, 0x21, 0x5a, 0x21, 0xdd, 0x37, + 0x8e, 0x3b, 0x8a, 0x3d, 0xd9, 0x3e, 0x1b, 0x40, 0x63, 0x43, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, + 0xcc, 0x41, 0x22, 0x42, 0xb3, 0x42, 0x30, 0x43, 0x35, 0x43, 0x3a, 0x43, 0x5a, 0x21, 0x5a, 0x21, + 0x5a, 0x21, 0x5a, 0x21, 0xf2, 0x3a, 0x5a, 0x21, 0x5a, 0x21, 0x72, 0x39, 0xd2, 0x39, 0xd2, 0x39, + 0xaf, 0x3a, 0xd2, 0x39, 0xd7, 0x3a, 0x13, 0x3b, 0x5a, 0x21, 0x5a, 0x21, 0xcc, 0x41, 0x22, 0x42, + 0xb3, 0x42, 0x30, 0x43, 0x35, 0x43, 0x3a, 0x43, 0x5a, 0x21, 0xec, 0x39, 0x5a, 0x21, 0x77, 0x3a, + 0x5a, 0x21, 0x48, 0x3b, 0x6e, 0x3b, 0x17, 0x35, 0x17, 0x35, 0x17, 0x35, 0x17, 0x35, 0xe1, 0x35, + 0x0e, 0x37, 0x17, 0x35, 0xf3, 0x35, 0xa1, 0x36, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, + 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, + 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, + 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x4d, 0x36, 0x17, 0x35, 0x17, 0x35, 0x17, 0x35, 0x17, 0x35, + 0x17, 0x35, 0x80, 0x36, 0x17, 0x35, 0x17, 0x35, 0x92, 0x36, 0x17, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x04, 0x05, 0xff, 0xff, 0xff, 0x00, 0x03, 0x00, + 0x03, 0x03, 0x00, 0x03, 0x0d, 0x06, 0xff, 0xff, 0x18, 0x06, 0x28, 0x06, 0x28, 0x06, 0x28, 0x06, + 0x28, 0x06, 0x00, 0x00, 0x33, 0x06, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x39, 0x06, 0x58, 0x06, + 0x9e, 0x06, 0x9e, 0x06, 0x9e, 0x06, 0x6d, 0x06, 0x7d, 0x06, 0x00, 0x00, 0x83, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x5a, 0x21, 0xeb, 0x43, 0x5e, 0x17, 0xc7, 0x34, 0xf3, 0x27, + 0x85, 0x4a, 0x5a, 0x21, 0x25, 0x44, 0xfe, 0x47, 0x47, 0x46, 0x47, 0x44, 0xba, 0x45, 0xbf, 0x47, + 0x83, 0x45, 0x77, 0x47, 0x85, 0x48, 0xcf, 0x48, 0xbc, 0x48, 0x9e, 0x47, 0xdc, 0x48, 0x01, 0x49, + 0x2c, 0x49, 0xbf, 0x48, 0x4a, 0x49, 0x16, 0x03, 0x3c, 0x03, 0x5c, 0x03, 0x88, 0x03, 0xae, 0x03, + 0x26, 0x04, 0x8c, 0x04, 0xc6, 0x04, 0x10, 0x05, 0x02, 0x06, 0xe8, 0x01, 0x10, 0x03, 0x36, 0x03, + 0x64, 0x03, 0x82, 0x03, 0xa8, 0x03, 0x86, 0x04, 0xc0, 0x04, 0x0a, 0x05, 0xfc, 0x05, 0xe4, 0x01, + 0x2e, 0x04, 0x94, 0x04, 0x00, 0x03, 0x2a, 0x03, 0x50, 0x03, 0x76, 0x03, 0x9c, 0x03, 0xc2, 0x03, + 0xbc, 0x03, 0xda, 0x03, 0x98, 0x05, 0x0e, 0x04, 0x7a, 0x04, 0xb4, 0x04, 0xda, 0x04, 0xfa, 0x04, + 0xe0, 0x05, 0x24, 0x05, 0x48, 0x05, 0x64, 0x05, 0x7c, 0x05, 0xf4, 0x03, 0xb0, 0x05, 0xc8, 0x05, + 0xc2, 0x5c, 0xca, 0x5c, 0xd6, 0x5c, 0xde, 0x5c, 0xe6, 0x5c, 0x0c, 0x5d, 0x20, 0x5d, 0x28, 0x5d, + 0x34, 0x5d, 0x5a, 0x5d, 0x6e, 0x5d, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, + 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x14, 0x1e, 0x7e, 0x1e, 0xaa, 0x1e, 0x20, 0x1f, 0x42, 0x1f, + 0xd4, 0x1f, 0x32, 0x20, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5e, 0x20, 0x86, 0x20, + 0xf2, 0x20, 0x16, 0x21, 0x52, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0xfe, 0x16, 0x2e, 0x18, 0xc2, 0x18, + 0xc4, 0x18, 0xe0, 0x18, 0x06, 0x19, 0x22, 0x19, 0xb0, 0x19, 0x26, 0x1a, 0x76, 0x1b, 0x5a, 0x21, + 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x86, 0x22, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, + 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, + 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0xb2, 0x1b, 0x22, 0x1c, 0xcc, 0x1c, + 0x18, 0x1d, 0x9a, 0x1d, 0xba, 0x1d, 0xe8, 0x1d, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, + 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0xaa, 0x55, 0x00, 0xff, 0xf6, 0x46, 0x01, 0x01, 0x75, 0x48, + 0xc6, 0x86, 0x0e, 0x01, 0x05, 0xe8, 0x73, 0x01, 0xe8, 0x11, 0x06, 0xe8, 0x02, 0x03, 0xe8, 0x60, + 0x03, 0x73, 0x19, 0xfe, 0x8e, 0x0e, 0x01, 0x74, 0x0d, 0xe8, 0xae, 0x03, 0x8b, 0x86, 0x0f, 0x01, + 0x26, 0xa3, 0x42, 0x00, 0xeb, 0xdf, 0xc7, 0x06, 0xf2, 0x5d, 0x02, 0x00, 0x32, 0xe4, 0x8a, 0x46, + 0x00, 0xe8, 0x4c, 0x04, 0x83, 0x3e, 0x4e, 0x00, 0x02, 0x72, 0x03, 0xe8, 0x65, 0x03, 0xa1, 0xf2, + 0x5d, 0xe8, 0x25, 0x43, 0xc6, 0x46, 0x01, 0x01, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x27, 0xf6, + 0x86, 0x6c, 0x01, 0x01, 0x74, 0x03, 0xe8, 0xb1, 0x55, 0xf6, 0x86, 0x6d, 0x01, 0x01, 0x74, 0x03, + 0xe8, 0xff, 0x55, 0xf7, 0x86, 0x82, 0x01, 0x01, 0x00, 0x75, 0x08, 0xf7, 0x86, 0x8a, 0x01, 0x01, + 0x00, 0x74, 0x03, 0xe8, 0xdb, 0x52, 0xe8, 0x5e, 0x05, 0xe8, 0x2a, 0x05, 0xe8, 0xa2, 0x04, 0xe8, + 0x47, 0x04, 0xf6, 0x86, 0x95, 0x02, 0x01, 0x74, 0x03, 0xe8, 0xdc, 0x1c, 0x33, 0xdb, 0xf6, 0x86, + 0xae, 0x02, 0x01, 0x74, 0x16, 0x8a, 0x5e, 0x09, 0x8a, 0x7e, 0x08, 0x38, 0xfb, 0x75, 0x30, 0x80, + 0xfb, 0x00, 0x74, 0x07, 0x80, 0xfb, 0x1e, 0x74, 0x02, 0xeb, 0x22, 0x80, 0x7e, 0x06, 0x1e, 0x74, + 0x1e, 0x33, 0xdb, 0x8a, 0x5e, 0x07, 0x3a, 0x5e, 0x06, 0x74, 0x14, 0xfa, 0x50, 0x8b, 0x46, 0x06, + 0x89, 0x46, 0x0c, 0x58, 0x88, 0x5e, 0x06, 0x32, 0xff, 0xff, 0x97, 0xa4, 0x05, 0xeb, 0x32, 0x8a, + 0x5e, 0x09, 0x3a, 0x5e, 0x08, 0x74, 0x2a, 0x50, 0x8b, 0x46, 0x08, 0x89, 0x46, 0x0e, 0x58, 0x80, + 0xfb, 0x1e, 0x74, 0x12, 0x80, 0xfb, 0x00, 0x74, 0x0d, 0x80, 0xfb, 0x0c, 0x74, 0x08, 0x80, 0xfb, + 0x16, 0x74, 0x03, 0xe8, 0x87, 0x2c, 0x88, 0x5e, 0x08, 0x32, 0xff, 0xfa, 0xff, 0x97, 0x82, 0x05, + 0xfb, 0xfa, 0xf7, 0x86, 0xf0, 0x00, 0xff, 0xff, 0x74, 0x0f, 0x8b, 0xb6, 0xf0, 0x00, 0x8b, 0x4c, + 0x04, 0xe8, 0xd2, 0x09, 0xfb, 0xff, 0xd1, 0xeb, 0x5c, 0xfb, 0xf7, 0x46, 0x16, 0xff, 0xff, 0x74, + 0x27, 0x8d, 0x7e, 0x16, 0xe8, 0x68, 0x06, 0x56, 0x8b, 0x5c, 0x02, 0xd1, 0xe3, 0xff, 0x97, 0xd2, + 0x04, 0x5e, 0xe8, 0x6c, 0x06, 0xf7, 0x86, 0xcc, 0x01, 0x01, 0x00, 0x74, 0x09, 0xe8, 0x15, 0x26, + 0xc7, 0x86, 0xcc, 0x01, 0x00, 0x00, 0xeb, 0x2d, 0xfa, 0xf7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0x75, + 0x13, 0xf6, 0x86, 0xc4, 0x15, 0x80, 0x75, 0x0c, 0xc7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0xfb, 0xe8, + 0x7d, 0x3c, 0xeb, 0x11, 0xfa, 0x8b, 0x86, 0x67, 0x02, 0x38, 0xc4, 0x74, 0x07, 0x88, 0x86, 0x68, + 0x02, 0xe8, 0x0d, 0x1b, 0xfb, 0xe8, 0xd1, 0x05, 0xe9, 0xcd, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0xc7, + 0x06, 0x44, 0x00, 0xff, 0xcb, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x48, 0x00, 0xff, 0xfb, 0xe8, + 0xa5, 0x02, 0x33, 0xc0, 0x88, 0x86, 0xb8, 0x01, 0x88, 0x86, 0xb9, 0x01, 0x8e, 0x46, 0x02, 0x26, + 0xa2, 0x5a, 0x00, 0x89, 0x86, 0x18, 0x02, 0x89, 0x86, 0x0a, 0x02, 0x89, 0x86, 0x3a, 0x02, 0x8e, + 0x46, 0x02, 0x26, 0xc7, 0x06, 0x4c, 0x00, 0x30, 0x01, 0x8d, 0x86, 0xa8, 0x08, 0x89, 0x86, 0xc0, + 0x01, 0x89, 0x86, 0xc2, 0x01, 0xc7, 0x86, 0xc4, 0x01, 0x01, 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, + 0xc0, 0x8d, 0xbe, 0x58, 0x02, 0xb9, 0x52, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0xd1, 0xd1, 0xf3, 0xaa, + 0x8d, 0xbe, 0xec, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe, 0xf4, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe, + 0xb8, 0x02, 0xb9, 0x0b, 0x00, 0xf3, 0xab, 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xc0, + 0x02, 0x04, 0x00, 0xbb, 0x02, 0x05, 0xb9, 0x0b, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0xab, 0xab, + 0x43, 0x43, 0xe2, 0xf5, 0xbb, 0x18, 0x05, 0xb9, 0x0a, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0xab, + 0x43, 0x43, 0xe2, 0xf6, 0xb8, 0x02, 0x00, 0x03, 0x06, 0xcc, 0x5d, 0xe8, 0x1d, 0x05, 0x39, 0x06, + 0xcc, 0x5d, 0x75, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x02, 0xc7, 0x86, 0x0c, + 0x02, 0xc8, 0x00, 0xc7, 0x86, 0xfc, 0x01, 0xff, 0xff, 0xc7, 0x86, 0xfa, 0x01, 0x07, 0x00, 0xc6, + 0x86, 0x8c, 0x02, 0x00, 0xe8, 0x01, 0x00, 0xc3, 0x8e, 0x46, 0x02, 0x33, 0xc0, 0xfa, 0x89, 0x86, + 0xb6, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x50, 0x00, 0x8b, 0x86, 0xa8, 0x15, 0x26, 0xa3, 0x70, + 0x00, 0x89, 0x86, 0xb2, 0x01, 0x93, 0xc7, 0x07, 0x00, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff, 0x93, + 0xc1, 0xe8, 0x08, 0x26, 0xa3, 0x74, 0x00, 0x8b, 0x86, 0xaa, 0x15, 0x26, 0xa3, 0x78, 0x00, 0x26, + 0xa1, 0x78, 0x00, 0x93, 0xc7, 0x47, 0xfc, 0xde, 0xad, 0xc7, 0x47, 0xfe, 0xbe, 0xaf, 0x93, 0xc1, + 0xe8, 0x08, 0x26, 0xa3, 0x76, 0x00, 0x33, 0xc0, 0xc6, 0x86, 0x87, 0x02, 0x01, 0x8d, 0xb6, 0xa8, + 0x09, 0xc7, 0x86, 0xa6, 0x01, 0xb0, 0x09, 0x01, 0xae, 0xa6, 0x01, 0x89, 0xb6, 0xa8, 0x01, 0x89, + 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30, 0x80, 0xc7, 0x44, 0x04, 0x00, 0x00, 0xc6, 0x86, 0x8a, 0x02, + 0x01, 0xfb, 0xe8, 0xab, 0x08, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x33, 0xb8, 0x00, 0x40, 0x80, + 0xbe, 0xfe, 0x00, 0x00, 0x74, 0x13, 0x25, 0xff, 0x1f, 0x0d, 0x00, 0xa0, 0x83, 0xe0, 0xfd, 0x8e, + 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c, 0x00, 0x80, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x40, 0x00, + 0xa1, 0xcc, 0x5d, 0x83, 0xc0, 0x02, 0xe8, 0x42, 0x04, 0x39, 0x06, 0xcc, 0x5d, 0x75, 0xf7, 0xc3, + 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x40, 0x00, 0x08, 0xbe, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, + 0x42, 0x00, 0xc8, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x4c, 0x00, 0xa0, 0x00, 0x8e, 0x46, 0x02, + 0x26, 0xc7, 0x06, 0x50, 0x00, 0x04, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00, 0x7f, + 0xff, 0x90, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x80, 0x00, 0x90, 0x90, 0x8e, + 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x68, + 0x00, 0x18, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x01, 0x26, 0xa1, 0x32, 0x00, + 0xc3, 0xc6, 0x86, 0x0c, 0x01, 0x01, 0xc6, 0x86, 0x0d, 0x01, 0x00, 0xe8, 0x1e, 0x28, 0xa1, 0xcc, + 0x5d, 0x83, 0xc0, 0x02, 0x0b, 0xc0, 0x0b, 0xc0, 0x0b, 0xc0, 0x0b, 0xc0, 0x39, 0x06, 0xcc, 0x5d, + 0x72, 0xf2, 0x80, 0xbe, 0x0d, 0x01, 0x01, 0x74, 0x03, 0xf9, 0xeb, 0x01, 0xf8, 0xc6, 0x86, 0x0c, + 0x01, 0x00, 0xc3, 0xb8, 0x00, 0x00, 0x88, 0x86, 0x06, 0x01, 0x88, 0x86, 0x07, 0x01, 0x88, 0x86, + 0x08, 0x01, 0x88, 0x86, 0x09, 0x01, 0x89, 0x86, 0x0a, 0x01, 0x88, 0x86, 0xb8, 0x01, 0x88, 0x86, + 0xb9, 0x01, 0x88, 0x86, 0xd1, 0x01, 0xa2, 0x23, 0x5f, 0xc3, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0x26, + 0x83, 0x0e, 0x32, 0x00, 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, + 0x32, 0x00, 0xf7, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x0e, + 0x32, 0x00, 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, 0x32, 0x00, + 0xf7, 0xc3, 0x50, 0x53, 0x52, 0xc6, 0x46, 0x01, 0x00, 0x32, 0xe4, 0x8a, 0x46, 0x00, 0xbb, 0x00, + 0xbd, 0x81, 0xeb, 0x00, 0x7d, 0x81, 0xe3, 0x00, 0xff, 0x89, 0x9e, 0xac, 0x15, 0x81, 0xc3, 0x00, + 0x01, 0xf7, 0xe3, 0x05, 0x00, 0x7d, 0x89, 0x86, 0xa8, 0x15, 0x03, 0x86, 0xac, 0x15, 0x48, 0x89, + 0x86, 0xaa, 0x15, 0x5a, 0x5b, 0x58, 0xc3, 0x51, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, + 0xfc, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x80, 0x00, 0x75, 0x1e, 0xb9, 0xf4, 0x01, + 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c, 0x00, 0x00, 0x08, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, + 0x54, 0x00, 0x80, 0x00, 0x75, 0x05, 0xe8, 0xe2, 0x02, 0xe2, 0xe5, 0x8e, 0x46, 0x02, 0x26, 0x81, + 0x26, 0x4c, 0x00, 0xff, 0xf7, 0x59, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x02, 0xc3, + 0x50, 0x53, 0xc1, 0xe0, 0x05, 0x05, 0x00, 0x03, 0x8b, 0xd8, 0x8d, 0x86, 0x00, 0x01, 0x89, 0x07, + 0x8d, 0x86, 0xd4, 0x01, 0x89, 0x47, 0x02, 0x8d, 0x86, 0xe4, 0x01, 0x89, 0x47, 0x04, 0x8d, 0x86, + 0xb0, 0x15, 0x89, 0x47, 0x08, 0x8d, 0x86, 0xc4, 0x15, 0x89, 0x47, 0x06, 0x8d, 0x86, 0xc0, 0x01, + 0x89, 0x47, 0x0a, 0xc7, 0x47, 0x0c, 0x38, 0x5f, 0x8d, 0x86, 0x40, 0x02, 0x89, 0x47, 0x0e, 0x8d, + 0x06, 0xcc, 0x5d, 0x89, 0x47, 0x10, 0x5b, 0x58, 0xc3, 0x50, 0xf7, 0x86, 0xf6, 0x00, 0x02, 0x00, + 0x75, 0x02, 0xeb, 0x4b, 0xf6, 0x86, 0x64, 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0x72, 0x02, 0x01, + 0x74, 0x3d, 0xf6, 0x86, 0x89, 0x02, 0x01, 0x74, 0x36, 0xc6, 0x86, 0x89, 0x02, 0x00, 0x8b, 0x86, + 0x0a, 0x02, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x40, 0x74, 0x03, 0x25, 0xff, 0xaf, 0xf7, 0x86, 0x12, + 0x01, 0x00, 0x20, 0x74, 0x03, 0x25, 0xff, 0xdf, 0x89, 0x86, 0x0a, 0x02, 0x3b, 0x86, 0x3a, 0x02, + 0x74, 0x0d, 0x89, 0x86, 0x3a, 0x02, 0x81, 0xa6, 0x3a, 0x02, 0x7f, 0xdf, 0xe8, 0x4e, 0x3f, 0x58, + 0xc3, 0x57, 0x56, 0x50, 0x8b, 0x86, 0xe6, 0x02, 0xa9, 0xff, 0xff, 0x74, 0x40, 0x8d, 0xbe, 0xdc, + 0x02, 0x8d, 0xb6, 0xec, 0x05, 0xb9, 0x0a, 0x00, 0x83, 0xf9, 0x05, 0x75, 0x04, 0x8d, 0xb6, 0xf4, + 0x05, 0xa9, 0x01, 0x00, 0x74, 0x1e, 0x80, 0x3d, 0xff, 0x74, 0x12, 0xfe, 0x05, 0x80, 0x3d, 0xff, + 0x75, 0x0b, 0x81, 0x8e, 0x0a, 0x02, 0x80, 0x00, 0xc6, 0x86, 0x89, 0x02, 0x01, 0x80, 0x3c, 0xff, + 0x74, 0x02, 0xfe, 0x04, 0xd1, 0xe8, 0x47, 0x46, 0xe2, 0xce, 0xe8, 0x0a, 0x00, 0xc7, 0x86, 0xe6, + 0x02, 0x00, 0x00, 0x58, 0x5e, 0x5f, 0xc3, 0xf6, 0x86, 0x5a, 0x02, 0x01, 0x75, 0x27, 0xf6, 0x86, + 0xaf, 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0x64, 0x02, 0x01, 0x74, 0x19, 0xc6, 0x86, 0x5a, 0x02, + 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x75, 0x0c, 0xbe, 0x7f, 0x4c, 0xe8, 0xa1, 0x03, 0xc7, + 0x86, 0xc0, 0x02, 0x04, 0x00, 0xc3, 0xf7, 0x86, 0xb0, 0x15, 0x00, 0x80, 0x75, 0x02, 0xeb, 0x26, + 0x8b, 0xb6, 0x60, 0x01, 0x3b, 0xb6, 0x5e, 0x01, 0x74, 0x1c, 0x46, 0x83, 0xe6, 0x07, 0x89, 0xb6, + 0x60, 0x01, 0x8b, 0xce, 0xd1, 0xe1, 0xd1, 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x8b, 0x04, + 0x8b, 0x54, 0x02, 0xe9, 0x3e, 0x3f, 0xc3, 0xbb, 0x00, 0x03, 0x83, 0x7f, 0x12, 0x00, 0x74, 0x08, + 0xe8, 0xb9, 0x3e, 0xc7, 0x47, 0x12, 0x00, 0x00, 0xc3, 0x53, 0x50, 0x33, 0xc0, 0x88, 0x86, 0xcf, + 0x01, 0xa3, 0x34, 0x5f, 0xbb, 0x38, 0x5f, 0x89, 0x1e, 0x2c, 0x5f, 0x89, 0x07, 0x89, 0x47, 0x02, + 0x89, 0x47, 0x04, 0xa3, 0x2e, 0x5f, 0xa3, 0x30, 0x5f, 0xa3, 0x32, 0x5f, 0x58, 0x5b, 0xc3, 0x50, + 0x8a, 0xe0, 0xe4, 0x12, 0xf6, 0xd4, 0x22, 0xc4, 0xe6, 0x12, 0x58, 0xc3, 0xc6, 0x46, 0x06, 0x00, + 0xc6, 0x46, 0x07, 0x00, 0xc6, 0x46, 0x08, 0x00, 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x86, 0xc4, 0x15, + 0x80, 0x8d, 0xbe, 0x16, 0x03, 0x8c, 0xd8, 0x8e, 0xc0, 0xab, 0xab, 0xab, 0xc3, 0x51, 0x53, 0xb9, + 0x10, 0x00, 0xd1, 0xe0, 0xd1, 0xdb, 0xe2, 0xfa, 0x8b, 0xc3, 0x86, 0xc4, 0x5b, 0x59, 0xc3, 0x90, + 0x50, 0x53, 0x51, 0x52, 0x57, 0x56, 0x8d, 0x1e, 0x72, 0x05, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0xff, + 0x06, 0x4e, 0x00, 0xc7, 0x06, 0xe8, 0x5d, 0x00, 0x00, 0xc6, 0x06, 0xec, 0x5d, 0x00, 0xc7, 0x06, + 0xf0, 0x5d, 0x30, 0x00, 0x8d, 0x3e, 0xea, 0x5d, 0xb8, 0x48, 0x66, 0x89, 0x05, 0x06, 0x33, 0xc0, + 0x8e, 0xc0, 0xa3, 0xcc, 0x5d, 0xa3, 0xce, 0x5d, 0xa3, 0xd0, 0x5d, 0x8d, 0x3e, 0xe0, 0x5d, 0xb9, + 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x8d, 0x3e, 0xe4, 0x5d, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, + 0xab, 0x07, 0x8b, 0xd4, 0xb9, 0x01, 0x00, 0xbb, 0x00, 0x00, 0xbd, 0x48, 0x66, 0x88, 0x5e, 0x00, + 0x8b, 0xc3, 0xd1, 0xe0, 0xd1, 0xe0, 0x05, 0x40, 0x60, 0x89, 0x46, 0x02, 0x06, 0x51, 0x8c, 0xd8, + 0x8e, 0xc0, 0xbe, 0x80, 0x03, 0x8d, 0xbe, 0x1a, 0x04, 0xb9, 0x05, 0x00, 0xf3, 0xa5, 0x59, 0x07, + 0xe8, 0x2f, 0xfd, 0xe8, 0xe2, 0x00, 0x8b, 0xc5, 0x05, 0xa4, 0x08, 0x89, 0x86, 0xa6, 0x08, 0x83, + 0xc0, 0x02, 0x8b, 0xe0, 0x68, 0x06, 0x06, 0x81, 0xc5, 0x44, 0x16, 0x43, 0xe2, 0xbf, 0x8b, 0xe2, + 0x33, 0xed, 0x5e, 0x5f, 0x5a, 0x59, 0x5b, 0x58, 0xc3, 0x3e, 0x89, 0xa6, 0xa6, 0x08, 0x33, 0xed, + 0xbc, 0x20, 0x5f, 0xfa, 0x83, 0x0e, 0xe4, 0x5d, 0x00, 0x74, 0x0d, 0x8b, 0x36, 0xe4, 0x5d, 0x8b, + 0x4c, 0x04, 0xe8, 0xd1, 0x03, 0xfb, 0xff, 0xd1, 0xfb, 0x32, 0xff, 0x8a, 0x1e, 0xe8, 0x5d, 0x80, + 0x8f, 0xee, 0x5d, 0x00, 0x75, 0x21, 0xd1, 0xe3, 0x8b, 0xaf, 0xea, 0x5d, 0x81, 0xbe, 0xa4, 0x06, + 0xa5, 0xa5, 0x74, 0x0c, 0xd1, 0xeb, 0xc6, 0x87, 0xee, 0x5d, 0x01, 0xe8, 0xf2, 0x06, 0xeb, 0x07, + 0x8b, 0x86, 0xa6, 0x08, 0x8b, 0xe0, 0xc3, 0xeb, 0xb5, 0xeb, 0xae, 0x60, 0x9c, 0xe8, 0xa9, 0xff, + 0x0e, 0xe8, 0x02, 0x00, 0xeb, 0x01, 0xcf, 0x61, 0xc3, 0x50, 0xfa, 0x8b, 0x76, 0x1a, 0xf7, 0xc6, + 0xff, 0xff, 0x74, 0x10, 0x8b, 0x04, 0x89, 0x46, 0x1a, 0x0b, 0xc0, 0x75, 0x03, 0x89, 0x46, 0x1c, + 0xc7, 0x04, 0x00, 0x00, 0xfb, 0x58, 0xc3, 0x53, 0xfa, 0xc7, 0x04, 0x00, 0x00, 0x8b, 0x5d, 0x02, + 0x89, 0x37, 0x89, 0x75, 0x02, 0x83, 0x3d, 0x00, 0x75, 0x02, 0x89, 0x35, 0xfb, 0x5b, 0xc3, 0x50, + 0xfa, 0x8b, 0x35, 0x8b, 0x04, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x03, 0x89, 0x45, 0x02, 0xfb, 0x58, + 0xc3, 0x50, 0xfa, 0x8b, 0x46, 0x1a, 0x89, 0x04, 0x89, 0x76, 0x1a, 0xf7, 0x46, 0x1a, 0xff, 0xff, + 0x75, 0x03, 0x89, 0x76, 0x1a, 0xfb, 0x58, 0xc3, 0x50, 0x53, 0x51, 0x8b, 0xc5, 0x83, 0xc0, 0x1e, + 0x89, 0x46, 0x1a, 0x83, 0xc0, 0x48, 0x89, 0x46, 0x1c, 0xb9, 0x09, 0x00, 0x8b, 0xdd, 0x8b, 0xc5, + 0x83, 0xc0, 0x26, 0x89, 0x47, 0x1e, 0x83, 0xc3, 0x08, 0x83, 0xc0, 0x08, 0xe2, 0xf5, 0x59, 0x5b, + 0x58, 0xc3, 0x60, 0x06, 0x1e, 0xfa, 0x33, 0xdb, 0x8e, 0xdb, 0x83, 0x06, 0xcc, 0x5d, 0x01, 0x73, + 0x04, 0x11, 0x1e, 0xce, 0x5d, 0xb9, 0x01, 0x00, 0x8b, 0xaf, 0xea, 0x5d, 0xf6, 0x06, 0x23, 0x5f, + 0x01, 0x75, 0x03, 0xe8, 0xe8, 0x46, 0xf7, 0x86, 0xa8, 0x02, 0x01, 0x00, 0x74, 0x30, 0xfe, 0x86, + 0x6b, 0x01, 0x80, 0xbe, 0x6b, 0x01, 0x02, 0x73, 0x02, 0xeb, 0x23, 0xc6, 0x86, 0x6b, 0x01, 0x00, + 0xf7, 0x86, 0x1c, 0x01, 0x01, 0x00, 0x75, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, + 0x32, 0xfe, 0x81, 0xa6, 0x18, 0x01, 0x32, 0xfe, 0xc7, 0x86, 0xa8, 0x02, 0x00, 0x00, 0xc6, 0x86, + 0x6a, 0x01, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x48, 0x00, 0x25, 0x00, 0x02, 0x74, 0x03, 0xe8, + 0x44, 0x17, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x03, 0xe8, 0xb6, 0x46, 0x8b, 0x86, 0xf6, 0x00, + 0x25, 0xd0, 0xe3, 0x89, 0x86, 0x30, 0x02, 0x8a, 0x46, 0x08, 0x3c, 0x06, 0x74, 0x08, 0x3c, 0x0a, + 0x74, 0x04, 0x3c, 0x18, 0x75, 0x04, 0xff, 0x86, 0x4a, 0x02, 0x83, 0xc3, 0x02, 0x49, 0x74, 0x03, + 0xe9, 0x75, 0xff, 0xf7, 0x06, 0xe0, 0x5d, 0xff, 0xff, 0x74, 0x1f, 0xff, 0x0e, 0xd0, 0x5d, 0x75, + 0x19, 0xe8, 0x14, 0x02, 0x8b, 0x1e, 0xe0, 0x5d, 0x0b, 0xdb, 0x74, 0x0e, 0x8b, 0x47, 0x08, 0xa3, + 0xd0, 0x5d, 0xf7, 0x06, 0xd0, 0x5d, 0xff, 0xff, 0x74, 0xe7, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, + 0x1f, 0x07, 0x61, 0xcf, 0x60, 0x06, 0x1e, 0xfa, 0x8d, 0x36, 0xd4, 0x5d, 0x83, 0x04, 0x01, 0x83, + 0x54, 0x02, 0x00, 0xe8, 0xfb, 0x4a, 0xa0, 0xd2, 0x5d, 0xfe, 0xc0, 0x3c, 0x04, 0x72, 0x08, 0xc6, + 0x06, 0xd2, 0x5d, 0x00, 0xe9, 0x0f, 0xff, 0xa2, 0xd2, 0x5d, 0xeb, 0xce, 0x50, 0x57, 0x56, 0xfa, + 0x8d, 0x36, 0xd8, 0x5d, 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0x80, 0x3e, 0x23, 0x5f, 0x01, + 0x75, 0x0d, 0x8b, 0x36, 0x26, 0x5f, 0x83, 0xfe, 0x14, 0x77, 0x0e, 0xff, 0x94, 0x5c, 0x05, 0x50, + 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0x5e, 0x5f, 0x58, 0xcf, 0xe8, 0xaa, 0x4d, 0xeb, 0xf1, 0x57, 0x56, + 0x50, 0xfa, 0x8d, 0x36, 0xdc, 0x5d, 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0x80, 0x3e, 0x23, + 0x5f, 0x01, 0x75, 0x0d, 0x8b, 0x36, 0x26, 0x5f, 0x83, 0xfe, 0x14, 0x77, 0x0e, 0xff, 0x94, 0x5c, + 0x05, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0x58, 0x5e, 0x5f, 0xcf, 0xe8, 0x78, 0x4d, 0xeb, 0xf1, + 0x50, 0x53, 0x51, 0x57, 0xe8, 0xab, 0x00, 0xfa, 0x8b, 0x3c, 0x03, 0xfd, 0x89, 0x6d, 0x02, 0x8b, + 0x44, 0x02, 0x89, 0x45, 0x04, 0x8b, 0x44, 0x04, 0x89, 0x45, 0x06, 0x0b, 0xc0, 0x75, 0x0e, 0x8b, + 0x86, 0x0c, 0x02, 0x0b, 0xc0, 0x75, 0x03, 0xb8, 0xc8, 0x00, 0x89, 0x45, 0x06, 0xf7, 0x06, 0xe0, + 0x5d, 0xff, 0xff, 0x75, 0x14, 0x89, 0x3e, 0xe0, 0x5d, 0x89, 0x3e, 0xe2, 0x5d, 0xc7, 0x05, 0x00, + 0x00, 0x89, 0x45, 0x08, 0xa3, 0xd0, 0x5d, 0xeb, 0x63, 0x8b, 0x3e, 0xe0, 0x5d, 0x8b, 0x0e, 0xd0, + 0x5d, 0x33, 0xdb, 0x3b, 0xc8, 0x72, 0x35, 0x0b, 0xdb, 0x75, 0x17, 0x2b, 0xc8, 0x89, 0x4d, 0x08, + 0x8b, 0x34, 0x03, 0xf5, 0x89, 0x44, 0x08, 0x89, 0x3c, 0x89, 0x36, 0xe0, 0x5d, 0xa3, 0xd0, 0x5d, + 0xeb, 0x3a, 0x2b, 0x4d, 0x08, 0x2b, 0xc1, 0x8b, 0x34, 0x03, 0xf5, 0x89, 0x44, 0x08, 0x8b, 0x4d, + 0x08, 0x2b, 0xc8, 0x89, 0x4d, 0x08, 0x89, 0x37, 0x89, 0x3c, 0xeb, 0x20, 0x8b, 0xdf, 0x8b, 0x3d, + 0x0b, 0xff, 0x74, 0x05, 0x03, 0x4d, 0x08, 0xeb, 0xba, 0x2b, 0xc1, 0x8b, 0x34, 0x03, 0xf5, 0x89, + 0x44, 0x08, 0x89, 0x37, 0xc7, 0x04, 0x00, 0x00, 0x89, 0x36, 0xe2, 0x5d, 0xfb, 0x5f, 0x59, 0x5b, + 0x58, 0xc3, 0x57, 0x53, 0x50, 0x56, 0xfa, 0x8b, 0x1e, 0xe0, 0x5d, 0x33, 0xff, 0x8b, 0x34, 0x03, + 0xf5, 0x83, 0x7c, 0x02, 0xff, 0x74, 0x4b, 0x3b, 0xde, 0x75, 0x49, 0x0b, 0xff, 0x74, 0x18, 0x8b, + 0x07, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x06, 0x89, 0x3e, 0xe2, 0x5d, 0xeb, 0x2c, 0x8b, 0x4f, 0x08, + 0x8b, 0xf8, 0x01, 0x4d, 0x08, 0xeb, 0x22, 0x8b, 0x3f, 0x89, 0x3e, 0xe0, 0x5d, 0x0b, 0xff, 0x75, + 0x0c, 0x89, 0x3e, 0xe2, 0x5d, 0xc7, 0x06, 0xd0, 0x5d, 0xff, 0xff, 0xeb, 0x0c, 0xa1, 0xd0, 0x5d, + 0x01, 0x45, 0x08, 0x8b, 0x45, 0x08, 0xa3, 0xd0, 0x5d, 0xc7, 0x47, 0x02, 0xff, 0xff, 0xc7, 0x07, + 0x00, 0x00, 0xeb, 0x4e, 0x83, 0xcb, 0x00, 0x74, 0x06, 0x8b, 0xfb, 0x8b, 0x1f, 0xeb, 0xa8, 0x83, + 0xfd, 0x00, 0x75, 0x05, 0xbb, 0xe4, 0x5d, 0xeb, 0x04, 0x8d, 0x9e, 0xf0, 0x00, 0x8b, 0x1f, 0x83, + 0xfb, 0x00, 0x74, 0x2e, 0x3b, 0xde, 0x75, 0x05, 0xe8, 0x6b, 0x00, 0xeb, 0x25, 0x8b, 0xfb, 0x8b, + 0x1f, 0x83, 0xcb, 0x00, 0x74, 0x1c, 0x3b, 0xde, 0x75, 0xf3, 0x8b, 0x07, 0x89, 0x05, 0x83, 0xc8, + 0x00, 0x75, 0x04, 0x89, 0xbe, 0xf2, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff, + 0xeb, 0x00, 0xfb, 0x5e, 0x58, 0x5b, 0x5f, 0xc3, 0x50, 0x53, 0x56, 0x55, 0x8b, 0x1e, 0xe0, 0x5d, + 0x8b, 0x6f, 0x02, 0x0b, 0xed, 0x74, 0x06, 0x81, 0xc5, 0xf0, 0x00, 0xeb, 0x03, 0xbd, 0xe4, 0x5d, + 0x8b, 0x76, 0x02, 0x8b, 0x07, 0xa3, 0xe0, 0x5d, 0x0b, 0xc0, 0x75, 0x03, 0xa3, 0xe2, 0x5d, 0x89, + 0x5e, 0x02, 0x89, 0x1c, 0xc7, 0x07, 0x00, 0x00, 0x83, 0x4e, 0x00, 0x00, 0x75, 0x03, 0x89, 0x5e, + 0x00, 0x5d, 0x5e, 0x5b, 0x58, 0xc3, 0x55, 0x53, 0x50, 0x0b, 0xed, 0x74, 0x06, 0x81, 0xc5, 0xf0, + 0x00, 0xeb, 0x03, 0xbd, 0xe4, 0x5d, 0x8b, 0x5e, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff, 0x8b, 0x07, + 0xc7, 0x07, 0x00, 0x00, 0x8b, 0xd8, 0x89, 0x5e, 0x00, 0x0b, 0xdb, 0x75, 0x03, 0x89, 0x5e, 0x02, + 0x58, 0x5b, 0x5d, 0xc3, 0x50, 0x53, 0x51, 0x57, 0x56, 0xfa, 0x8b, 0x1e, 0xe0, 0x5d, 0x33, 0xff, + 0x83, 0xcb, 0x00, 0x74, 0x54, 0x8b, 0xc3, 0x39, 0x6f, 0x02, 0x75, 0x47, 0x0b, 0xff, 0x74, 0x18, + 0x8b, 0x37, 0x89, 0x35, 0x8b, 0xc7, 0x0b, 0xf6, 0x75, 0x06, 0x89, 0x3e, 0xe2, 0x5d, 0xeb, 0x2c, + 0x8b, 0x4f, 0x08, 0x01, 0x4c, 0x08, 0xeb, 0x24, 0x8b, 0x37, 0x89, 0x36, 0xe0, 0x5d, 0x0b, 0xf6, + 0x75, 0x0c, 0x89, 0x36, 0xe2, 0x5d, 0xc7, 0x06, 0xd0, 0x5d, 0xff, 0xff, 0xeb, 0x0e, 0xa1, 0xd0, + 0x5d, 0x01, 0x44, 0x08, 0x8b, 0x44, 0x08, 0xa3, 0xd0, 0x5d, 0x33, 0xc0, 0xc7, 0x47, 0x02, 0xff, + 0xff, 0xeb, 0x00, 0x8b, 0xf8, 0x8b, 0x1f, 0xeb, 0xa7, 0xfb, 0x5e, 0x5f, 0x59, 0x5b, 0x58, 0xc3, + 0x50, 0x53, 0x51, 0x52, 0x8a, 0x8e, 0xad, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x32, 0x00, 0x8a, + 0x9e, 0x7d, 0x02, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x57, 0xf6, 0x86, 0xb3, 0x02, 0x01, 0x75, + 0x4e, 0x0d, 0x74, 0x80, 0x25, 0x7f, 0x9f, 0x26, 0xa3, 0x32, 0x00, 0xb8, 0x01, 0x00, 0xe8, 0x2d, + 0x05, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x04, 0xc6, 0x86, 0xb4, 0x02, 0x00, 0x26, 0xa1, 0x32, 0x00, + 0x0d, 0x00, 0x60, 0x26, 0xa3, 0x32, 0x00, 0xb8, 0x00, 0x00, 0xe8, 0x11, 0x05, 0x26, 0xa1, 0x32, + 0x00, 0x83, 0xe0, 0xdf, 0x26, 0xa3, 0x32, 0x00, 0xb8, 0x00, 0x00, 0xe8, 0x00, 0x05, 0xe8, 0x83, + 0x01, 0x26, 0xa1, 0x8c, 0x00, 0x25, 0xff, 0x07, 0x0d, 0x00, 0xd0, 0x26, 0xa3, 0x8c, 0x00, 0xeb, + 0x41, 0xf6, 0x86, 0xb4, 0x02, 0x01, 0x75, 0x3a, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfb, 0x26, 0xa1, + 0x32, 0x00, 0x0d, 0xb4, 0x80, 0x25, 0xbf, 0x9f, 0x26, 0xa3, 0x32, 0x00, 0xc6, 0x86, 0xb3, 0x02, + 0x00, 0xb8, 0x01, 0x00, 0xe8, 0xc7, 0x04, 0x26, 0xa1, 0x32, 0x00, 0x83, 0xe0, 0xef, 0x26, 0xa3, + 0x32, 0x00, 0xc6, 0x86, 0xb4, 0x02, 0x01, 0xc6, 0x06, 0x6f, 0x13, 0x01, 0xb8, 0x00, 0x00, 0xe8, + 0xac, 0x04, 0x26, 0xa1, 0x40, 0x00, 0x8b, 0xd8, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x75, 0x10, 0x83, + 0xe0, 0xfd, 0xc6, 0x86, 0x7d, 0x02, 0x01, 0x25, 0xff, 0x1f, 0x0d, 0x00, 0x80, 0xeb, 0x0e, 0x25, + 0xff, 0x1f, 0x0d, 0x00, 0x20, 0x83, 0xc8, 0x02, 0xc6, 0x86, 0x7d, 0x02, 0x00, 0xe8, 0xa8, 0x02, + 0x0d, 0x00, 0x08, 0xf6, 0x86, 0xaf, 0x02, 0x01, 0x75, 0x03, 0x25, 0xff, 0xf7, 0x33, 0xd8, 0x74, + 0x0f, 0x26, 0xa3, 0x40, 0x00, 0xf7, 0xc3, 0x02, 0x00, 0x74, 0x05, 0xc6, 0x06, 0x6f, 0x13, 0x01, + 0x26, 0xa1, 0x4c, 0x00, 0x8a, 0x9e, 0x7d, 0x02, 0x8b, 0xd8, 0xf7, 0x86, 0x12, 0x01, 0x10, 0x00, + 0x74, 0x05, 0x0d, 0x00, 0x10, 0xeb, 0x03, 0x25, 0xff, 0xef, 0x8a, 0xae, 0x6d, 0x02, 0x80, 0xf9, + 0x01, 0x75, 0x04, 0x8a, 0xae, 0x6e, 0x02, 0xf6, 0xc5, 0x01, 0x74, 0x05, 0x83, 0xc8, 0x10, 0xeb, + 0x03, 0x83, 0xe0, 0xef, 0xf6, 0x86, 0x6f, 0x02, 0x01, 0x74, 0x0a, 0x83, 0xc8, 0x20, 0xc6, 0x86, + 0x7e, 0x02, 0x00, 0xeb, 0x08, 0x83, 0xe0, 0xdf, 0xc6, 0x86, 0x7e, 0x02, 0x01, 0xf6, 0x86, 0x58, + 0x02, 0x01, 0x74, 0x0a, 0xc6, 0x86, 0x7e, 0x02, 0x00, 0x83, 0xc8, 0x40, 0xeb, 0x03, 0x83, 0xe0, + 0xbf, 0xf6, 0x86, 0x7d, 0x02, 0x01, 0x74, 0x05, 0x0d, 0x80, 0x00, 0xeb, 0x03, 0x25, 0x7f, 0xff, + 0xf6, 0x86, 0x7c, 0x02, 0x01, 0x74, 0x05, 0x0d, 0x00, 0x01, 0xeb, 0x03, 0x25, 0xff, 0xfe, 0xf6, + 0x86, 0x7e, 0x02, 0x01, 0x74, 0x05, 0x0d, 0x00, 0x20, 0xeb, 0x03, 0x25, 0xff, 0xdf, 0x33, 0xd8, + 0x74, 0x12, 0xf7, 0xc3, 0x20, 0x00, 0x74, 0x05, 0xc6, 0x06, 0x6f, 0x13, 0x01, 0x25, 0xff, 0xf7, + 0x26, 0xa3, 0x4c, 0x00, 0x26, 0xa1, 0x50, 0x00, 0x8b, 0xd8, 0x33, 0xd8, 0x74, 0x04, 0x26, 0xa3, + 0x50, 0x00, 0xf6, 0x06, 0x6f, 0x13, 0x01, 0x74, 0x25, 0xc6, 0x06, 0x6f, 0x13, 0x00, 0x80, 0xbe, + 0xfe, 0x00, 0x02, 0x74, 0x19, 0x26, 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff, 0x90, 0x90, 0x26, 0x81, + 0x0e, 0x40, 0x00, 0x80, 0x00, 0x90, 0x90, 0x26, 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff, 0x5a, 0x59, + 0x5b, 0x58, 0xc3, 0x00, 0xf6, 0x86, 0xb3, 0x02, 0x01, 0x75, 0x42, 0x50, 0xe8, 0x50, 0x03, 0xb3, + 0x00, 0x8a, 0x3e, 0x22, 0x5f, 0xb8, 0x00, 0x80, 0xe8, 0xdf, 0x02, 0x8b, 0xc0, 0x8b, 0xc0, 0x8b, + 0xc0, 0xb3, 0x00, 0x8a, 0x3e, 0x22, 0x5f, 0xb8, 0x00, 0x21, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x04, + 0x74, 0x03, 0x0d, 0x00, 0x40, 0xe8, 0xc2, 0x02, 0xb3, 0x1b, 0x8a, 0x3e, 0x22, 0x5f, 0xe8, 0x12, + 0x02, 0x83, 0xc8, 0x10, 0xe8, 0xb3, 0x02, 0xc6, 0x86, 0xb3, 0x02, 0x01, 0x58, 0xc3, 0x8e, 0x46, + 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x04, 0x00, 0x74, 0x0b, 0xc6, 0x06, 0x23, 0x5f, 0x01, 0x26, 0x83, + 0x0e, 0x42, 0x00, 0x02, 0xc6, 0x86, 0xb0, 0x02, 0x00, 0xc6, 0x86, 0xb1, 0x02, 0x00, 0xa8, 0x02, + 0x74, 0x26, 0x26, 0x83, 0x26, 0x42, 0x00, 0xcf, 0xf7, 0x86, 0xf4, 0x00, 0x04, 0x00, 0x75, 0x14, + 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x75, 0x0c, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x77, 0x05, 0xc6, + 0x86, 0xb0, 0x02, 0x01, 0xb0, 0x02, 0xeb, 0x2a, 0xa8, 0x04, 0x74, 0x0e, 0x26, 0x83, 0x0e, 0x42, + 0x00, 0x20, 0x26, 0x83, 0x26, 0x42, 0x00, 0xef, 0xeb, 0x18, 0xa8, 0x08, 0x74, 0x08, 0x26, 0x83, + 0x0e, 0x42, 0x00, 0x30, 0xeb, 0x0c, 0xa8, 0x10, 0x74, 0x08, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x30, + 0xeb, 0x00, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x06, 0x26, 0x83, 0x26, 0x42, 0x00, 0xcf, 0xc3, + 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c, 0x00, 0x00, 0x01, 0x90, 0x90, 0x90, 0x90, 0x8e, + 0x46, 0x02, 0x26, 0x81, 0x26, 0x4c, 0x00, 0xff, 0xfe, 0xc3, 0x8e, 0x46, 0x02, 0x80, 0xbe, 0xfe, + 0x00, 0x02, 0x74, 0x1e, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x0f, 0x80, 0xbe, 0xb0, 0x02, 0x01, + 0x75, 0x10, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x02, 0xeb, 0x08, 0xc6, 0x86, 0x6c, 0x01, 0x01, 0xe8, + 0x98, 0x47, 0xc3, 0x8e, 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81, + 0x26, 0x42, 0x00, 0xff, 0xef, 0xeb, 0x07, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00, 0x10, 0xc3, 0x8e, + 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00, + 0x10, 0xeb, 0x07, 0x26, 0x81, 0x26, 0x42, 0x00, 0xff, 0xef, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, + 0x0e, 0x42, 0x00, 0x00, 0x80, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x42, 0x00, 0xff, 0x7f, + 0xc3, 0xf7, 0x86, 0xf4, 0x00, 0x08, 0x00, 0x74, 0x13, 0xe8, 0xdf, 0xff, 0xeb, 0x39, 0x80, 0x7e, + 0x06, 0x0e, 0x74, 0x1d, 0x80, 0x7e, 0x06, 0x48, 0x74, 0x23, 0xeb, 0x2b, 0xe8, 0xd7, 0xff, 0x8e, + 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x10, 0x00, 0x75, 0xe4, 0x80, 0xbe, 0xfe, 0x00, 0x00, 0x75, + 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00, 0x40, 0xeb, 0x0a, 0x8e, 0x46, 0x02, + 0x26, 0x81, 0x26, 0x42, 0x00, 0xff, 0xbf, 0xc3, 0x83, 0xe0, 0xf7, 0xf7, 0x86, 0x12, 0x01, 0x00, + 0x04, 0x74, 0x03, 0x83, 0xc8, 0x08, 0xc3, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x77, 0x0a, 0x8e, 0x46, + 0x02, 0x26, 0x83, 0x0e, 0x50, 0x00, 0x04, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x90, 0x00, + 0x04, 0xc3, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x77, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x50, + 0x00, 0xfb, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x90, 0x00, 0xfb, 0xc3, 0x51, 0x50, 0xfa, + 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x92, 0x00, 0xfb, 0x26, 0x83, 0x26, 0x92, 0x00, 0xfe, 0x90, + 0x90, 0x90, 0x90, 0x26, 0x83, 0x0e, 0x92, 0x00, 0x01, 0x90, 0x90, 0x90, 0x90, 0x26, 0xa1, 0x92, + 0x00, 0x83, 0xc8, 0x02, 0xb9, 0x20, 0x00, 0xe8, 0x06, 0x00, 0xe2, 0xfb, 0xfb, 0x58, 0x59, 0xc3, + 0x53, 0x8e, 0x46, 0x02, 0x24, 0xfe, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x90, 0x90, 0x0c, 0x01, + 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x90, 0x5b, 0xc3, 0x51, 0xb1, 0x03, 0xd2, 0xe5, 0xb1, 0x05, + 0xd0, 0xe5, 0x72, 0x04, 0x24, 0xfd, 0xeb, 0x02, 0x0c, 0x02, 0xe8, 0xd3, 0xff, 0xfe, 0xc9, 0x75, + 0xef, 0x59, 0xc3, 0x9c, 0xfa, 0x51, 0x52, 0xfa, 0x8e, 0x46, 0x02, 0xe8, 0x8f, 0xff, 0x26, 0xa1, + 0x92, 0x00, 0x83, 0xe0, 0xfd, 0x83, 0xc8, 0x01, 0x26, 0xa3, 0x92, 0x00, 0x83, 0xc8, 0x04, 0x26, + 0xa3, 0x92, 0x00, 0xe8, 0xaa, 0xff, 0x83, 0xc8, 0x02, 0xe8, 0xa4, 0xff, 0x83, 0xc8, 0x02, 0xe8, + 0x9e, 0xff, 0x83, 0xe0, 0xfd, 0xe8, 0x98, 0xff, 0x8a, 0xef, 0xe8, 0xac, 0xff, 0x8a, 0xeb, 0xe8, + 0xa7, 0xff, 0x83, 0xe0, 0xfb, 0xe8, 0x88, 0xff, 0x83, 0xe0, 0xfe, 0x26, 0xa3, 0x92, 0x00, 0x90, + 0x90, 0x26, 0x8b, 0x0e, 0x92, 0x00, 0xf7, 0xc1, 0x02, 0x00, 0x74, 0x12, 0xa8, 0x02, 0x74, 0x0e, + 0xb9, 0x12, 0x00, 0xe8, 0x6a, 0xff, 0xe2, 0xfb, 0xfb, 0x5a, 0x59, 0x9d, 0xf9, 0xc3, 0x0c, 0x01, + 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x90, 0x90, 0xb1, 0x10, 0x53, 0x33, 0xdb, 0x24, 0xfe, 0x26, + 0xa3, 0x92, 0x00, 0x26, 0xa1, 0x92, 0x00, 0xd1, 0xe3, 0xa8, 0x02, 0x74, 0x03, 0x83, 0xcb, 0x01, + 0x0c, 0x01, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x90, 0x90, 0xfe, 0xc9, 0x75, 0xdf, 0xe8, 0x2f, + 0xff, 0x8b, 0xc3, 0x5b, 0xfb, 0x5a, 0x59, 0x9d, 0xf8, 0xc3, 0x9c, 0xfa, 0x51, 0x53, 0x52, 0x50, + 0xfa, 0xe8, 0xe9, 0xfe, 0x26, 0xa1, 0x92, 0x00, 0x83, 0xe0, 0xfd, 0x83, 0xc8, 0x01, 0x26, 0xa3, + 0x92, 0x00, 0x83, 0xc8, 0x04, 0x26, 0xa3, 0x92, 0x00, 0xe8, 0x04, 0xff, 0x83, 0xc8, 0x02, 0xe8, + 0xfe, 0xfe, 0x24, 0xfd, 0xe8, 0xf9, 0xfe, 0x0c, 0x02, 0xe8, 0xf4, 0xfe, 0x8a, 0xef, 0xe8, 0x08, + 0xff, 0x8a, 0xeb, 0xe8, 0x03, 0xff, 0x0c, 0x02, 0xe8, 0xe5, 0xfe, 0x24, 0xfd, 0xe8, 0xe0, 0xfe, + 0x5b, 0xb1, 0x10, 0xd1, 0xe3, 0x72, 0x04, 0x24, 0xfd, 0xeb, 0x02, 0x0c, 0x02, 0xe8, 0xd0, 0xfe, + 0xfe, 0xc9, 0x75, 0xef, 0x24, 0xfb, 0xe8, 0xc7, 0xfe, 0xfb, 0x5a, 0x5b, 0x59, 0x9d, 0xc3, 0x50, + 0xe8, 0x8a, 0xfe, 0xb7, 0x00, 0xb3, 0x02, 0xe8, 0xe9, 0xfe, 0x83, 0xf8, 0xff, 0x75, 0x09, 0xfe, + 0xc7, 0x80, 0xff, 0x20, 0x75, 0xf1, 0xb7, 0xff, 0x88, 0x3e, 0x22, 0x5f, 0x58, 0xc3, 0x53, 0x40, + 0x03, 0x06, 0xcc, 0x5d, 0x8b, 0xd8, 0xe8, 0x62, 0xf6, 0xa1, 0xcc, 0x5d, 0x3b, 0xc3, 0x75, 0xf6, + 0x5b, 0xc3, 0xe8, 0x86, 0xf0, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0x8e, + 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0x80, + 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x0b, 0xc6, 0x86, 0x7c, 0x02, 0x00, 0xe8, 0x62, 0xfa, 0xe8, 0xf6, + 0xfd, 0x33, 0xc0, 0x88, 0x86, 0x8d, 0x02, 0x88, 0x86, 0x8e, 0x02, 0xc6, 0x86, 0x63, 0x01, 0x01, + 0xc7, 0x86, 0x64, 0x01, 0x02, 0x06, 0xc6, 0x86, 0x69, 0x01, 0x02, 0xbe, 0xe5, 0x4c, 0xe8, 0xff, + 0xf7, 0xbe, 0xdf, 0x4c, 0xe8, 0xf9, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0x32, + 0xfe, 0xc3, 0xc6, 0x86, 0x63, 0x01, 0x00, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x0d, 0xe8, 0x1a, + 0xf0, 0xe8, 0xa3, 0x30, 0xc6, 0x46, 0x07, 0x00, 0xe9, 0xb6, 0x00, 0xbe, 0x91, 0x4c, 0xe8, 0x81, + 0xf8, 0xbe, 0xdf, 0x4c, 0xe8, 0x7b, 0xf8, 0xc6, 0x86, 0x8d, 0x02, 0x01, 0x80, 0x7e, 0x06, 0x02, + 0x74, 0x08, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x09, 0xeb, 0x1c, 0xc6, 0x46, 0x07, 0x04, 0xe9, 0x90, + 0x00, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x74, 0x07, 0xc6, 0x46, 0x07, 0x4e, 0xe9, 0x81, 0x00, + 0xc6, 0x46, 0x07, 0x46, 0xeb, 0x7b, 0x80, 0x7e, 0x08, 0x08, 0x75, 0xf8, 0xc6, 0x86, 0x85, 0x02, + 0x01, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x61, 0x02, 0x00, 0xc6, 0x86, 0x60, 0x02, 0x00, + 0xc6, 0x86, 0x63, 0x02, 0x01, 0xc6, 0x86, 0x6c, 0x02, 0x01, 0xc6, 0x86, 0x70, 0x02, 0x01, 0xf6, + 0x86, 0x5c, 0x02, 0x01, 0x74, 0x17, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x2c, 0xc6, 0x46, 0x09, + 0x0a, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x01, 0xeb, 0x1c, 0xf6, 0x86, 0x5d, + 0x02, 0x01, 0x74, 0x15, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x0e, 0xc6, 0x46, 0x09, 0x06, 0xc6, + 0x86, 0x5c, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0x3e, 0xfc, 0xe8, 0x71, 0xf9, 0xbe, + 0xc7, 0x4c, 0xe8, 0x2b, 0xf7, 0xbe, 0x85, 0x4c, 0xe8, 0x25, 0xf7, 0xbe, 0xcd, 0x4c, 0xe8, 0x1f, + 0xf7, 0xc3, 0xc6, 0x46, 0x09, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0x32, 0xfe, + 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x75, 0x05, 0xc6, 0x86, 0x97, 0x02, 0x01, 0xe8, 0x64, 0x0a, + 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xbe, 0xd3, 0x4c, 0xe8, + 0xee, 0xf6, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xc6, 0x86, 0x6c, 0x02, + 0x01, 0xc6, 0x86, 0x70, 0x02, 0x01, 0xe8, 0x17, 0xf9, 0xb8, 0x01, 0x00, 0xe8, 0x6f, 0xfe, 0xe8, + 0xd8, 0xfb, 0xbe, 0x8b, 0x4c, 0xe8, 0xc8, 0xf6, 0xbe, 0xc7, 0x4c, 0xe8, 0xc2, 0xf6, 0x33, 0xc0, + 0x89, 0x86, 0xf2, 0x01, 0x89, 0x86, 0xf4, 0x01, 0x89, 0x86, 0xf6, 0x01, 0xf6, 0x06, 0x23, 0x5f, + 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0xff, 0xf7, 0xf7, 0x86, 0xf6, + 0x00, 0x00, 0x20, 0x74, 0x10, 0xbe, 0xcd, 0x4c, 0xe8, 0x95, 0xf6, 0xc6, 0x86, 0x61, 0x02, 0x00, + 0xc6, 0x86, 0x60, 0x02, 0x00, 0xc3, 0xc3, 0x90, 0xc6, 0x86, 0x5b, 0x02, 0x01, 0xc7, 0x86, 0xce, + 0x02, 0x00, 0x00, 0xc7, 0x86, 0xd0, 0x02, 0x00, 0x00, 0xbe, 0x8b, 0x4c, 0xe8, 0x71, 0xf6, 0xe8, + 0xf3, 0x14, 0xc3, 0x90, 0xc6, 0x86, 0x5f, 0x02, 0x01, 0xf6, 0x86, 0x88, 0x02, 0x01, 0x74, 0x08, + 0xe8, 0x36, 0x17, 0xc6, 0x86, 0x88, 0x02, 0x00, 0xbe, 0x8b, 0x4c, 0xe8, 0x52, 0xf6, 0xf6, 0x86, + 0x67, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x07, 0x0c, 0xc3, 0xbe, 0x8b, 0x4c, 0xe8, 0x40, 0xf6, + 0xbe, 0xa9, 0x4c, 0xe8, 0x3a, 0xf6, 0xc7, 0x86, 0xc2, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xc4, 0x02, + 0x01, 0x00, 0xe8, 0x7c, 0x15, 0xc3, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc8, 0x01, + 0x14, 0x00, 0xc6, 0x86, 0x08, 0x01, 0x00, 0x81, 0xa6, 0x0a, 0x02, 0xdf, 0xbf, 0xc6, 0x86, 0x64, + 0x02, 0x01, 0xc7, 0x86, 0x2a, 0x02, 0xff, 0xff, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x20, 0x75, 0x18, + 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x75, 0x10, 0xbe, 0xcd, 0x4c, 0xe8, 0xf2, 0xf5, 0xc6, 0x86, + 0x61, 0x02, 0x00, 0xc6, 0x86, 0x60, 0x02, 0x00, 0xbe, 0x8b, 0x4c, 0xe8, 0x94, 0xf6, 0x8e, 0x46, + 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff, 0x7f, 0xb8, 0x00, + 0x80, 0xe8, 0xfe, 0x2f, 0xe8, 0x4a, 0xfb, 0xe8, 0xf9, 0xfa, 0xc6, 0x86, 0x62, 0x02, 0x01, 0xc6, + 0x86, 0xce, 0x01, 0x00, 0xf7, 0x86, 0xf6, 0x00, 0x04, 0x00, 0x74, 0x05, 0xc6, 0x86, 0xce, 0x01, + 0x01, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x75, 0x06, 0xbe, 0x97, 0x4c, 0xe8, 0xa2, 0xf5, 0xff, 0x86, + 0xfc, 0x00, 0xc3, 0x90, 0xe8, 0x8b, 0xfb, 0xc6, 0x86, 0x08, 0x01, 0x00, 0xc6, 0x46, 0x09, 0x00, + 0xc6, 0x46, 0x0b, 0x00, 0xc6, 0x86, 0x58, 0x02, 0x00, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, + 0x62, 0x02, 0x00, 0xc6, 0x86, 0x64, 0x02, 0x00, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xc6, 0x86, 0x67, + 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6e, 0x02, + 0x00, 0xe8, 0x9c, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x40, 0x00, 0x20, 0xf6, 0x86, 0x70, + 0x02, 0x01, 0x74, 0x02, 0xeb, 0x23, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08, + 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0x52, 0x42, + 0xe8, 0x01, 0xf7, 0xbe, 0xa3, 0x4c, 0xe8, 0x27, 0xf5, 0xc3, 0xc7, 0x86, 0x32, 0x02, 0x02, 0x00, + 0xe8, 0x0f, 0xfb, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, + 0x00, 0x00, 0x80, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, + 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0x15, 0x42, 0xc6, 0x86, 0x08, + 0x01, 0x00, 0xc7, 0x86, 0x22, 0x01, 0x00, 0x00, 0xe8, 0x34, 0xfa, 0xe8, 0x58, 0xfa, 0xf7, 0x86, + 0xf4, 0x00, 0x10, 0x00, 0x74, 0x14, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x0c, 0x8e, 0x46, + 0x02, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00, 0x40, 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, + 0x42, 0x00, 0xff, 0xbf, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x05, 0xc6, 0x86, 0xfe, 0x00, 0x01, + 0xf6, 0x86, 0xbd, 0x01, 0x01, 0x75, 0x02, 0xeb, 0x71, 0x26, 0xff, 0x36, 0x5e, 0x00, 0x26, 0xff, + 0x36, 0x60, 0x00, 0x26, 0xff, 0x36, 0x62, 0x00, 0x26, 0xff, 0x36, 0x64, 0x00, 0x26, 0xff, 0x36, + 0x66, 0x00, 0x26, 0xff, 0x36, 0x7a, 0x00, 0x26, 0xff, 0x36, 0x7c, 0x00, 0x26, 0xff, 0x36, 0x7e, + 0x00, 0x26, 0xff, 0x36, 0x52, 0x00, 0x26, 0xff, 0x36, 0x6a, 0x00, 0x26, 0xff, 0x36, 0x68, 0x00, + 0xe8, 0xf7, 0xee, 0x26, 0x8f, 0x06, 0x68, 0x00, 0x26, 0x8f, 0x06, 0x6a, 0x00, 0x26, 0x8f, 0x06, + 0x52, 0x00, 0x26, 0x8f, 0x06, 0x7e, 0x00, 0x26, 0x8f, 0x06, 0x7c, 0x00, 0x26, 0x8f, 0x06, 0x7a, + 0x00, 0x26, 0x8f, 0x06, 0x66, 0x00, 0x26, 0x8f, 0x06, 0x64, 0x00, 0x26, 0x8f, 0x06, 0x62, 0x00, + 0x26, 0x8f, 0x06, 0x60, 0x00, 0x26, 0x8f, 0x06, 0x5e, 0x00, 0xe8, 0x6e, 0xec, 0xe8, 0xff, 0x2e, + 0xc6, 0x86, 0xb2, 0x02, 0x00, 0x8d, 0xbe, 0x16, 0x03, 0x8c, 0xd8, 0x8e, 0xc0, 0xab, 0xab, 0xab, + 0xf6, 0x86, 0xab, 0x02, 0x01, 0x74, 0x12, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x04, + 0xc6, 0x86, 0xb4, 0x02, 0x00, 0xc6, 0x46, 0x09, 0x1e, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x44, + 0x00, 0xff, 0xfb, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x02, 0x74, 0x10, 0xf7, 0x86, 0x20, 0x01, 0x80, + 0x00, 0x75, 0x08, 0xbe, 0x51, 0x4d, 0xe8, 0xe7, 0xf3, 0xeb, 0x0d, 0x8e, 0x46, 0x02, 0x33, 0xc0, + 0x26, 0xa3, 0x64, 0x00, 0x26, 0xa3, 0x66, 0x00, 0xc3, 0x90, 0x33, 0xc0, 0x88, 0x86, 0x5f, 0x02, + 0x88, 0x86, 0x62, 0x02, 0x88, 0x86, 0x64, 0x02, 0x88, 0x86, 0x67, 0x02, 0x88, 0x86, 0x6c, 0x02, + 0xbe, 0xd9, 0x4c, 0xe8, 0xba, 0xf3, 0xc6, 0x86, 0xb2, 0x02, 0x01, 0x8e, 0x46, 0x02, 0xf6, 0x06, + 0x23, 0x5f, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, + 0x01, 0x01, 0xe8, 0xbd, 0x40, 0xc3, 0xc7, 0x86, 0x32, 0x02, 0x03, 0x00, 0xe8, 0xcc, 0xeb, 0xc6, + 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0xc4, 0xf5, 0x8e, 0x46, 0x02, 0x26, + 0x81, 0x0e, 0x40, 0x00, 0x00, 0x1e, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x15, 0xf7, 0x86, + 0xf4, 0x00, 0x00, 0x40, 0x74, 0x0d, 0xf7, 0x86, 0xf6, 0x00, 0x20, 0x00, 0x74, 0x05, 0xc6, 0x86, + 0x78, 0x02, 0x01, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x06, 0xbe, 0x45, 0x4d, 0xe8, 0x50, 0xf3, + 0xe8, 0x24, 0xf9, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x74, 0x06, 0xc6, 0x46, 0x07, 0x44, 0xeb, + 0x06, 0xbe, 0xf7, 0x4c, 0xe8, 0x39, 0xf3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0x32, + 0xfe, 0xe8, 0x90, 0x06, 0xc3, 0x90, 0xc7, 0x86, 0x32, 0x02, 0x04, 0x00, 0x8e, 0x46, 0x02, 0x26, + 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xc6, 0x86, 0x6f, 0x02, + 0x01, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x7c, 0x02, 0x00, 0xe8, 0x42, 0xf5, 0xe8, 0xd6, + 0xf8, 0xb0, 0x00, 0xe8, 0x58, 0x17, 0x33, 0xc0, 0x88, 0x86, 0x8d, 0x02, 0x88, 0x86, 0x8e, 0x02, + 0xc6, 0x86, 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64, 0x01, 0x02, 0x06, 0xc6, 0x86, 0x69, 0x01, 0x02, + 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x2c, 0xc6, 0x86, 0x68, 0x01, 0x02, 0xc7, 0x86, 0x66, 0x01, + 0x60, 0x04, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xbe, 0x45, 0x4d, 0xe8, 0xc3, 0xf2, 0xbe, 0x91, 0x4c, + 0xe8, 0xbd, 0xf2, 0xbe, 0xf1, 0x4c, 0xe8, 0xb7, 0xf2, 0xbe, 0x3f, 0x4d, 0xe8, 0xb1, 0xf2, 0xe8, + 0xae, 0x14, 0xc3, 0xc6, 0x86, 0x68, 0x01, 0x02, 0xc7, 0x86, 0x66, 0x01, 0x20, 0x03, 0x8e, 0x46, + 0x02, 0x26, 0xc7, 0x06, 0x5c, 0x00, 0x00, 0x00, 0xbe, 0x91, 0x4c, 0xe8, 0x92, 0xf2, 0xbe, 0xf1, + 0x4c, 0xe8, 0x8c, 0xf2, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xe8, 0x20, 0x11, 0xc3, 0x90, + 0xc7, 0x86, 0x32, 0x02, 0x05, 0x00, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x08, 0xc6, 0x86, 0x6d, + 0x02, 0x01, 0xe8, 0xab, 0xf4, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x16, + 0xc6, 0x86, 0x73, 0x02, 0x01, 0xbe, 0x15, 0x4d, 0xe8, 0x55, 0xf2, 0xbe, 0x1b, 0x4d, 0xe8, 0x4f, + 0xf2, 0xbe, 0x03, 0x4d, 0xe8, 0x49, 0xf2, 0xbe, 0x2d, 0x4d, 0xe8, 0x43, 0xf2, 0xc7, 0x86, 0xd6, + 0x02, 0x01, 0x00, 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xe8, 0xfb, 0x13, 0xc3, 0xc7, 0x86, 0x32, 0x02, + 0x07, 0x00, 0xc6, 0x86, 0x6c, 0x02, 0x01, 0xc6, 0x86, 0x60, 0x02, 0x00, 0xc6, 0x86, 0x61, 0x02, + 0x00, 0xbe, 0xcd, 0x4c, 0xe8, 0x19, 0xf2, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x75, 0x0d, 0xc6, 0x86, + 0x72, 0x02, 0x01, 0xb8, 0x00, 0x80, 0xe8, 0x39, 0x2c, 0xeb, 0x0a, 0x83, 0xa6, 0x0a, 0x02, 0xdf, + 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc6, 0x86, 0x08, 0x01, 0x00, 0xe8, 0x74, 0xf7, 0xe8, 0x23, 0xf7, + 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0xff, + 0xf7, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff, + 0x7f, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x15, 0xe8, 0xcf, 0xf6, 0xc7, 0x86, 0xc8, 0x01, 0x14, + 0x00, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xbe, 0xd3, 0x4c, 0xe8, 0xb3, 0xf1, 0xc3, 0xbe, 0x33, + 0x4d, 0xe8, 0xac, 0xf1, 0xc6, 0x86, 0x78, 0x02, 0x00, 0xc6, 0x86, 0x74, 0x02, 0x00, 0xc6, 0x86, + 0xfe, 0x00, 0x02, 0xe8, 0xda, 0xf3, 0xbe, 0x45, 0x4d, 0xe8, 0x94, 0xf1, 0xc3, 0x90, 0xc6, 0x86, + 0x6c, 0x02, 0x00, 0xc6, 0x46, 0x09, 0x1e, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, + 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xc7, 0x86, 0xda, 0x02, 0x05, 0x00, 0xbe, 0x39, 0x4d, + 0xe8, 0x6d, 0xf1, 0xb0, 0x00, 0xe8, 0xc6, 0x15, 0xe8, 0x81, 0x13, 0xc3, 0xb8, 0x00, 0x80, 0xe8, + 0x90, 0x2b, 0xc6, 0x86, 0x08, 0x01, 0x00, 0xe8, 0xd7, 0xf6, 0xe8, 0x86, 0xf6, 0x8e, 0x46, 0x02, + 0x26, 0xc7, 0x06, 0x68, 0x00, 0x18, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x01, + 0x26, 0x81, 0x26, 0x32, 0x00, 0xff, 0x7f, 0xc3, 0xc7, 0x86, 0x36, 0x02, 0x01, 0x00, 0xc7, 0x86, + 0xc6, 0x01, 0xff, 0xff, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00, + 0x80, 0x7e, 0x07, 0x10, 0x74, 0x4b, 0xb0, 0x00, 0xe8, 0x73, 0x15, 0x80, 0x7e, 0x06, 0x0e, 0x74, + 0x02, 0xeb, 0x3e, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, + 0x00, 0xff, 0x7f, 0x83, 0xa6, 0x0a, 0x02, 0xdf, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf6, 0x86, 0x5f, + 0x02, 0x01, 0x74, 0x1d, 0xf6, 0x86, 0x6a, 0x02, 0x01, 0x74, 0x16, 0xf6, 0x86, 0x67, 0x02, 0x01, + 0x75, 0x0f, 0xc6, 0x86, 0x67, 0x02, 0x01, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x75, 0x03, 0xe8, 0x29, + 0x0f, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, + 0x00, 0x80, 0xc7, 0x86, 0x36, 0x02, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xe8, 0xf0, 0xf2, + 0xe8, 0x9e, 0xf5, 0xbe, 0xaf, 0x4c, 0xe8, 0xa7, 0xf0, 0xe8, 0xb9, 0x0e, 0xc3, 0x90, 0x8e, 0x46, + 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xc7, 0x86, + 0x36, 0x02, 0x03, 0x00, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc8, 0x01, 0x0a, 0x00, + 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x0f, 0xc6, 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, + 0x81, 0x26, 0x64, 0x00, 0xff, 0x7f, 0xc6, 0x86, 0x5e, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x01, + 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0x98, 0xf2, 0x81, 0xa6, 0x0a, 0x02, 0xff, 0x2f, 0x83, 0x8e, + 0x0a, 0x02, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xbe, 0x79, 0x4c, 0xe8, 0x42, 0xf0, 0xbe, 0x9d, + 0x4c, 0xe8, 0x3c, 0xf0, 0xc7, 0x86, 0xbc, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xbe, 0x02, 0x01, 0x00, + 0xe8, 0xf1, 0x0d, 0xc3, 0xff, 0x86, 0x48, 0x02, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, + 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xe8, 0xec, 0xf5, 0xf6, 0x86, 0x63, 0x02, 0x01, + 0x75, 0x03, 0xe8, 0x95, 0x0d, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, + 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x75, 0x20, 0xc6, 0x86, 0x6c, + 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x21, 0xf2, 0xe8, + 0xb2, 0xf1, 0xbe, 0xa3, 0x4c, 0xe8, 0xd8, 0xef, 0xe8, 0xc7, 0xf5, 0xeb, 0x59, 0xc6, 0x86, 0x71, + 0x02, 0x01, 0xf6, 0x86, 0x70, 0x02, 0x01, 0x75, 0x4d, 0xe8, 0x98, 0xf1, 0xe8, 0xd9, 0xe8, 0xc6, + 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, 0x71, 0x02, 0x00, 0xbe, 0xa3, 0x4c, 0xe8, 0xb1, 0xef, 0x8e, + 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, + 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xb9, 0x3c, 0xe8, 0x6b, 0xf5, 0x33, 0xc0, 0x88, 0x86, + 0x8d, 0x02, 0x88, 0x86, 0x8e, 0x02, 0xc6, 0x86, 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64, 0x01, 0x02, + 0x06, 0xc6, 0x86, 0x69, 0x01, 0x02, 0xc3, 0x90, 0xff, 0x86, 0x48, 0x02, 0x8e, 0x46, 0x02, 0x26, + 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xe8, 0x38, 0xf5, 0xc7, + 0x86, 0xb8, 0x02, 0x02, 0x00, 0xc7, 0x86, 0xba, 0x02, 0x08, 0x00, 0xc6, 0x86, 0x58, 0x02, 0x00, + 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x64, 0x00, 0xff, 0x7f, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, + 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x79, 0xf1, 0xf6, 0x86, 0x85, 0x02, 0x01, 0x75, 0x06, 0xbe, 0x6d, + 0x4c, 0xe8, 0x2c, 0xef, 0x81, 0xa6, 0x0a, 0x02, 0xff, 0x6f, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x40, + 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, + 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0x83, 0xbe, 0xca, 0x01, 0x00, 0x74, 0x0d, 0x8b, 0x86, 0xca, + 0x01, 0xc7, 0x86, 0xca, 0x01, 0x00, 0x00, 0xe8, 0x2a, 0x10, 0xbe, 0x79, 0x4c, 0xe8, 0xf0, 0xee, + 0xc3, 0x90, 0xc7, 0x86, 0x36, 0x02, 0x01, 0x00, 0xc7, 0x86, 0x34, 0x02, 0x02, 0x00, 0xb0, 0x00, + 0xe8, 0x3b, 0x13, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x10, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, + 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff, 0x7f, 0xc3, 0xc7, 0x86, 0x34, 0x02, 0x03, 0x00, + 0xff, 0x86, 0x48, 0x02, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, + 0x32, 0x00, 0x00, 0x80, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, 0x73, 0x02, 0x00, 0xbe, 0xfd, + 0x4c, 0xe8, 0x9c, 0xee, 0xbe, 0x09, 0x4d, 0xe8, 0x96, 0xee, 0xbe, 0x21, 0x4d, 0xe8, 0x90, 0xee, + 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x08, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0xc1, 0xf0, 0x81, + 0x8e, 0x0a, 0x02, 0x04, 0x50, 0xc6, 0x86, 0x89, 0x02, 0x01, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, + 0x0d, 0xf6, 0x86, 0x65, 0x02, 0x01, 0x74, 0x06, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x80, 0xe8, 0x31, + 0x30, 0xe8, 0xe6, 0x0b, 0xc3, 0x90, 0xc7, 0x86, 0x34, 0x02, 0x04, 0x00, 0xbe, 0xfd, 0x4c, 0xe8, + 0x4e, 0xee, 0xbe, 0x09, 0x4d, 0xe8, 0x48, 0xee, 0x81, 0xa6, 0x0a, 0x02, 0xfb, 0x6f, 0x81, 0x8e, + 0x0a, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc3, 0xc7, 0x86, 0x34, 0x02, 0x05, 0x00, + 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x1a, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, + 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0x31, + 0x3b, 0x81, 0xa6, 0x0a, 0x02, 0xfb, 0x2f, 0x83, 0x8e, 0x0a, 0x02, 0x20, 0xc6, 0x86, 0x89, 0x02, + 0x01, 0xe8, 0x5e, 0x01, 0xc3, 0x90, 0xc7, 0x86, 0x34, 0x02, 0x01, 0x00, 0xc3, 0x90, 0xc3, 0x53, + 0x50, 0x89, 0x86, 0x22, 0x01, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x0f, 0x50, 0xe8, 0x1b, 0xe6, + 0xe8, 0xb1, 0x26, 0xc6, 0x46, 0x07, 0x00, 0x58, 0xe9, 0xea, 0x00, 0xf6, 0x86, 0x08, 0x01, 0x01, + 0x74, 0x05, 0xe8, 0xfd, 0x27, 0xeb, 0x6c, 0x83, 0xf8, 0x10, 0x75, 0x08, 0x81, 0x8e, 0x1e, 0x01, + 0x00, 0x80, 0xeb, 0x5f, 0x83, 0x8e, 0x1e, 0x01, 0x02, 0x8b, 0x9e, 0x0a, 0x02, 0x83, 0xf8, 0x01, + 0x75, 0x04, 0x81, 0xcb, 0x00, 0x04, 0x83, 0xf8, 0x0c, 0x75, 0x04, 0x81, 0xcb, 0x00, 0x08, 0x83, + 0xf8, 0x0b, 0x75, 0x03, 0x83, 0xcb, 0x02, 0x83, 0xf8, 0x09, 0x75, 0x03, 0x83, 0xcb, 0x04, 0x83, + 0xf8, 0x0a, 0x75, 0x09, 0x81, 0xcb, 0x00, 0x01, 0x83, 0x8e, 0x1e, 0x01, 0x04, 0x83, 0xf8, 0x06, + 0x75, 0x03, 0x83, 0xcb, 0x01, 0x83, 0xf8, 0x0f, 0x74, 0x19, 0x83, 0xf8, 0x02, 0x75, 0x03, 0x83, + 0xcb, 0x08, 0x83, 0xf8, 0x03, 0x75, 0x03, 0x83, 0xcb, 0x08, 0x89, 0x9e, 0x0a, 0x02, 0xc6, 0x86, + 0x89, 0x02, 0x01, 0x8a, 0x4e, 0x06, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x72, 0x2e, 0xf7, 0x86, 0x0a, + 0x02, 0x08, 0x00, 0x75, 0x1c, 0x80, 0xf9, 0x48, 0x74, 0x11, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, + 0x10, 0x80, 0xf9, 0x44, 0x74, 0x05, 0x80, 0xf9, 0x46, 0x75, 0x06, 0xc6, 0x46, 0x07, 0x4c, 0xeb, + 0x44, 0xc6, 0x46, 0x07, 0x12, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0x3a, 0xc6, 0x46, 0x07, 0x12, 0xc6, + 0x46, 0x09, 0x1e, 0xf6, 0x86, 0xac, 0x02, 0x01, 0x74, 0x1a, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, + 0x5f, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, + 0x01, 0xe8, 0x1e, 0x3a, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x02, 0xeb, 0x08, 0xc6, 0x46, 0x07, + 0x10, 0xc6, 0x46, 0x09, 0x00, 0x58, 0x5b, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x40, 0x00, + 0x02, 0x00, 0x74, 0x0b, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x40, 0x00, 0xfd, 0xeb, 0x09, 0x8e, + 0x46, 0x02, 0x26, 0x83, 0x0e, 0x40, 0x00, 0x02, 0xc3, 0x90, 0xc7, 0x86, 0x32, 0x02, 0x01, 0x00, + 0xc3, 0xb9, 0x01, 0x01, 0x38, 0xc8, 0x75, 0x19, 0x8b, 0xb6, 0xf6, 0x00, 0x81, 0xe6, 0x00, 0xc0, + 0x81, 0xfe, 0x00, 0x80, 0x75, 0x0b, 0xc6, 0x86, 0x5a, 0x02, 0x01, 0xbe, 0x7f, 0x4c, 0xe8, 0x9f, + 0xec, 0xc3, 0xc3, 0x90, 0x50, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x18, 0xf7, 0x86, 0xf6, 0x00, + 0x00, 0x10, 0x74, 0x05, 0xc6, 0x86, 0xfe, 0x00, 0x01, 0xc6, 0x86, 0x95, 0x02, 0x01, 0xe8, 0xbf, + 0xee, 0xe8, 0x02, 0x00, 0x58, 0xc3, 0xc7, 0x86, 0x98, 0x02, 0x00, 0x00, 0xc7, 0x86, 0x9a, 0x02, + 0x05, 0x00, 0xb8, 0x05, 0x00, 0xe8, 0x1a, 0x00, 0xc7, 0x86, 0xa2, 0x02, 0x05, 0x00, 0xc3, 0x90, + 0xc6, 0x86, 0x95, 0x02, 0x00, 0x06, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x40, 0x00, 0xdf, 0x07, + 0xc3, 0x90, 0x52, 0x53, 0x51, 0xb9, 0x10, 0x27, 0x83, 0xe0, 0x3f, 0x8b, 0xd0, 0xe5, 0x00, 0x50, + 0x8b, 0x1e, 0xcc, 0x5d, 0x53, 0xb8, 0xe7, 0x03, 0xf7, 0xe2, 0xf7, 0xf1, 0x5b, 0x03, 0xd8, 0x58, + 0x03, 0xc2, 0x3b, 0xc1, 0x72, 0x03, 0x2b, 0xc1, 0x43, 0x8b, 0xcb, 0x41, 0x89, 0x9e, 0x9c, 0x02, + 0x89, 0x8e, 0x9e, 0x02, 0x89, 0x86, 0xa0, 0x02, 0x59, 0x5b, 0x5a, 0xc3, 0xa1, 0xcc, 0x5d, 0x3b, + 0x86, 0x9e, 0x02, 0x74, 0x0e, 0x3b, 0x86, 0x9c, 0x02, 0x75, 0x0d, 0xe5, 0x00, 0x3b, 0x86, 0xa0, + 0x02, 0x72, 0x05, 0xb8, 0x01, 0x00, 0xeb, 0x02, 0x2b, 0xc0, 0x85, 0xc0, 0xc3, 0x90, 0x80, 0x7e, + 0x06, 0x04, 0x74, 0x0a, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x75, 0x02, 0xeb, 0x05, 0xb8, 0x01, + 0x00, 0xeb, 0x02, 0x2b, 0xc0, 0x85, 0xc0, 0xc3, 0xe8, 0xc1, 0xff, 0x74, 0x1e, 0xb8, 0x02, 0x00, + 0xe8, 0x7f, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x54, 0x00, 0x25, 0x24, 0x01, 0x8b, 0xd8, 0x33, + 0x86, 0x98, 0x02, 0x75, 0x0a, 0xff, 0x8e, 0xa2, 0x02, 0x74, 0x02, 0xeb, 0x75, 0xeb, 0x23, 0xc7, + 0x86, 0xa2, 0x02, 0x05, 0x00, 0x89, 0x9e, 0x98, 0x02, 0xa9, 0x04, 0x00, 0x74, 0x12, 0xf7, 0xc3, + 0x04, 0x00, 0x74, 0x07, 0xc6, 0x86, 0x96, 0x02, 0x01, 0xeb, 0x05, 0xc6, 0x86, 0x96, 0x02, 0x00, + 0xeb, 0x50, 0x8b, 0x86, 0x98, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x40, 0x00, 0x02, 0x00, + 0x74, 0x23, 0x25, 0x04, 0x01, 0x3d, 0x04, 0x01, 0x75, 0x38, 0xe8, 0x81, 0xff, 0x74, 0x2a, 0xc6, + 0x86, 0xfe, 0x00, 0x01, 0xe8, 0xa9, 0xed, 0xc7, 0x86, 0x98, 0x02, 0x00, 0x00, 0xb8, 0x05, 0x00, + 0xe8, 0x0f, 0xff, 0xeb, 0x1d, 0x25, 0x24, 0x01, 0x3d, 0x24, 0x01, 0x75, 0x15, 0xe8, 0x5e, 0xff, + 0x74, 0x07, 0xc6, 0x86, 0xfe, 0x00, 0x00, 0xeb, 0xdb, 0xe8, 0xe4, 0xfe, 0xb8, 0x0e, 0x00, 0xe8, + 0x4d, 0xfd, 0xc3, 0x90, 0x55, 0x1e, 0x06, 0x33, 0xed, 0x8e, 0xdd, 0x8b, 0x2e, 0xea, 0x5d, 0x8e, + 0x46, 0x02, 0xeb, 0x00, 0x60, 0xfa, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x44, 0x00, 0x89, 0x86, 0x18, + 0x01, 0xc7, 0x86, 0x1c, 0x01, 0x01, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x46, 0x00, 0x89, 0x86, + 0x1a, 0x01, 0xb8, 0x07, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x46, 0x00, 0xb8, 0xff, 0xff, 0x8e, + 0x46, 0x02, 0x26, 0xa3, 0x44, 0x00, 0xfb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x48, 0x00, 0x8b, 0xd8, + 0x81, 0xe3, 0xff, 0xfc, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x48, 0x00, 0x8e, 0x46, 0x02, 0x26, + 0x8b, 0x1e, 0x4a, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x4a, 0x00, 0x50, 0xb0, 0xa0, 0xe6, + 0x10, 0x58, 0xa9, 0x00, 0x08, 0x74, 0x0f, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x05, 0xe8, 0x6b, + 0x36, 0xeb, 0x03, 0xe8, 0xe8, 0x30, 0xa9, 0x00, 0x01, 0x75, 0x22, 0xf7, 0x86, 0xa8, 0x02, 0x01, + 0x00, 0x75, 0x21, 0xa9, 0xcd, 0x01, 0x74, 0x1c, 0x80, 0xbe, 0x6a, 0x01, 0x0a, 0x72, 0x0e, 0xc7, + 0x86, 0xa8, 0x02, 0x01, 0x00, 0x81, 0x8e, 0x18, 0x01, 0xcd, 0x00, 0xeb, 0x07, 0xfe, 0x86, 0x6a, + 0x01, 0xe8, 0xec, 0x32, 0xa9, 0x00, 0x04, 0x74, 0x29, 0xf7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0x75, + 0x21, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x44, 0x00, 0x00, 0x04, 0xe8, 0x8b, 0xe8, 0xc7, 0x44, + 0x02, 0x01, 0x00, 0x89, 0x44, 0x04, 0xc7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0x8d, 0x7e, 0x16, 0xe8, + 0x95, 0xe8, 0xa9, 0x00, 0x10, 0x74, 0x27, 0x80, 0xbe, 0x0c, 0x01, 0x01, 0x74, 0x20, 0xf6, 0x86, + 0xb8, 0x01, 0x01, 0x75, 0x19, 0xe8, 0x61, 0xe8, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0x10, 0xc7, 0x44, + 0x02, 0x03, 0x00, 0xc6, 0x86, 0xb8, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x69, 0xe8, 0xa9, 0x00, + 0x20, 0x74, 0x61, 0x80, 0xbe, 0x0c, 0x01, 0x01, 0x75, 0x07, 0xc6, 0x86, 0x0d, 0x01, 0x01, 0xeb, + 0x53, 0x50, 0x26, 0xa1, 0x78, 0x00, 0x26, 0x8b, 0x1e, 0x70, 0x00, 0x3b, 0xc3, 0x77, 0x10, 0x2b, + 0x86, 0xa8, 0x15, 0x8b, 0xc8, 0x8b, 0x86, 0xaa, 0x15, 0x2b, 0xc3, 0x03, 0xc1, 0xeb, 0x02, 0x2b, + 0xc3, 0x3d, 0x00, 0x02, 0x77, 0x0d, 0xe8, 0xe9, 0xef, 0xc6, 0x86, 0xbc, 0x01, 0x01, 0x83, 0x8e, + 0xe6, 0x02, 0x40, 0x58, 0xf6, 0x86, 0xb9, 0x01, 0x01, 0x75, 0x19, 0xe8, 0xfb, 0xe7, 0xf7, 0xc6, + 0xff, 0xff, 0x74, 0x10, 0xc7, 0x44, 0x02, 0x04, 0x00, 0xc6, 0x86, 0xb9, 0x01, 0x01, 0x8d, 0x7e, + 0x16, 0xe8, 0x03, 0xe8, 0xfa, 0x8b, 0x86, 0x18, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x44, 0x00, + 0xc7, 0x86, 0x1c, 0x01, 0x00, 0x00, 0x8b, 0x86, 0x1a, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x46, + 0x00, 0x61, 0x07, 0x1f, 0x5d, 0xcf, 0x50, 0x25, 0x00, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x48, + 0x00, 0x8b, 0x86, 0xcc, 0x02, 0x40, 0x89, 0x86, 0xcc, 0x02, 0x83, 0xf8, 0x01, 0x75, 0x08, 0x56, + 0xbe, 0xd3, 0x4c, 0xe8, 0x8a, 0xe9, 0x5e, 0x3b, 0x86, 0xc8, 0x01, 0x76, 0x0a, 0x80, 0xbe, 0x65, + 0x02, 0x01, 0x74, 0x03, 0xe8, 0xc1, 0x32, 0x58, 0xc3, 0x8d, 0x71, 0x18, 0x8b, 0x49, 0x14, 0x86, + 0xcd, 0x83, 0xe9, 0x04, 0x7e, 0x1b, 0x33, 0xc0, 0x03, 0xf0, 0x8a, 0x04, 0x0a, 0xc0, 0x74, 0x11, + 0x3a, 0x54, 0x01, 0x74, 0x17, 0x32, 0xe4, 0x3c, 0xff, 0x74, 0x0a, 0x2b, 0xc8, 0x72, 0x02, 0x77, + 0xe7, 0x33, 0xc0, 0xf9, 0xc3, 0x8b, 0x44, 0x02, 0x86, 0xc4, 0xeb, 0xef, 0x0a, 0xe4, 0x75, 0xf1, + 0x38, 0xf0, 0x75, 0xed, 0x8d, 0x74, 0x02, 0xf8, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0xb6, 0xa8, + 0x15, 0x8b, 0xbe, 0xaa, 0x15, 0x47, 0xa5, 0xa5, 0xa5, 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x07, 0x80, + 0xe1, 0xfe, 0x8b, 0xc7, 0x2b, 0xc3, 0x2b, 0xc8, 0x76, 0x0a, 0x81, 0xf9, 0x00, 0x01, 0x73, 0x09, + 0xd1, 0xe9, 0xf3, 0xa5, 0x8b, 0x07, 0xe9, 0xd1, 0x01, 0xb9, 0x19, 0x00, 0xf3, 0xa5, 0x33, 0xff, + 0xf6, 0x47, 0x0e, 0x80, 0x74, 0x0e, 0x8b, 0x47, 0x14, 0x83, 0xe0, 0x1f, 0x74, 0x0f, 0xa8, 0x01, + 0x75, 0x0b, 0x8b, 0xf8, 0xba, 0x80, 0x09, 0x68, 0x45, 0x29, 0xe9, 0xa3, 0x05, 0xe9, 0xd9, 0x02, + 0xc3, 0x80, 0x7f, 0x17, 0x02, 0x75, 0xf9, 0x50, 0x56, 0x8b, 0xb6, 0x1a, 0x06, 0x8b, 0x04, 0x5e, + 0x3b, 0x86, 0xc6, 0x01, 0x74, 0x07, 0x89, 0x86, 0xc6, 0x01, 0x58, 0xeb, 0x3d, 0x58, 0xeb, 0x12, + 0x8a, 0x4f, 0x07, 0x80, 0xe1, 0x3f, 0x74, 0xd8, 0x8a, 0xe9, 0x86, 0x8e, 0xfe, 0x01, 0x38, 0xcd, + 0x75, 0x18, 0x57, 0x51, 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, + 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x06, 0x59, 0x5f, 0xeb, 0xb6, 0x57, 0x51, 0x8d, 0xbe, 0x00, 0x02, + 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x59, 0x5f, 0xeb, 0x0d, 0x8b, 0x7e, 0x04, 0x58, + 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00, 0x74, 0xf7, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x08, 0x80, + 0x7e, 0x06, 0x48, 0x74, 0x02, 0xeb, 0xe9, 0x50, 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0x07, 0xa9, 0x00, + 0x40, 0x75, 0xdc, 0x0d, 0x00, 0x40, 0x89, 0x07, 0xe8, 0x8a, 0x00, 0x8b, 0x4f, 0x04, 0x83, 0xc1, + 0x03, 0x80, 0xe1, 0xfe, 0x89, 0x7e, 0x04, 0x8b, 0xbe, 0xc2, 0x01, 0x3b, 0xfe, 0x72, 0x11, 0x8d, + 0x86, 0xa8, 0x08, 0x05, 0xff, 0x00, 0x2b, 0xc7, 0x3b, 0xc1, 0x7d, 0x0a, 0x8d, 0xbe, 0xa8, 0x08, + 0x2b, 0xf7, 0x3b, 0xf1, 0x7c, 0xa6, 0x8b, 0xd7, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8b, 0xf3, + 0xd1, 0xe9, 0x83, 0xc7, 0x02, 0x49, 0xad, 0xf3, 0xa5, 0x8b, 0xcf, 0xc7, 0x05, 0x00, 0x00, 0x8b, + 0xfa, 0x89, 0x4d, 0x02, 0x51, 0x8b, 0x4d, 0x04, 0x83, 0xe9, 0x04, 0x89, 0x4d, 0x04, 0x59, 0x89, + 0x05, 0x8d, 0x86, 0xa8, 0x08, 0x3b, 0xf8, 0x75, 0x0e, 0x8b, 0x86, 0xc0, 0x01, 0x3b, 0x86, 0xc2, + 0x01, 0x75, 0x1c, 0x89, 0xbe, 0xc0, 0x01, 0x89, 0x8e, 0xc2, 0x01, 0x8b, 0x7e, 0x04, 0xc7, 0x86, + 0xc4, 0x01, 0x00, 0x00, 0xb9, 0x40, 0x60, 0x8e, 0xc1, 0xe8, 0x2b, 0x23, 0xe9, 0x4d, 0xff, 0x97, + 0x89, 0x45, 0x02, 0xeb, 0xe2, 0x8b, 0xb6, 0xc0, 0x01, 0xf7, 0x86, 0xc4, 0x01, 0x01, 0x00, 0x75, + 0x0f, 0x81, 0x3c, 0x00, 0x80, 0x75, 0x05, 0x8b, 0x74, 0x02, 0xeb, 0xf5, 0x89, 0xb6, 0xc0, 0x01, + 0xc3, 0xf7, 0x07, 0x01, 0x09, 0x74, 0x03, 0xe9, 0x9f, 0x01, 0xf7, 0x07, 0x00, 0x10, 0x75, 0x34, + 0x68, 0x16, 0x28, 0xe9, 0x0e, 0x27, 0xa8, 0x02, 0x74, 0x22, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x1c, + 0x80, 0xbe, 0x62, 0x02, 0x00, 0x74, 0x15, 0x24, 0x28, 0x3c, 0x28, 0x75, 0x0f, 0xf6, 0x47, 0x0e, + 0x80, 0x75, 0x64, 0x81, 0x8e, 0xe6, 0x02, 0x80, 0x00, 0xeb, 0x5c, 0x90, 0xeb, 0x59, 0xe9, 0x38, + 0xfe, 0x90, 0xeb, 0xd2, 0xeb, 0x34, 0x8b, 0x47, 0x14, 0x83, 0xe0, 0x1f, 0x74, 0x06, 0xa8, 0x01, + 0x8b, 0xf8, 0x74, 0x4b, 0xe9, 0x52, 0x01, 0x50, 0x8b, 0x9e, 0xb2, 0x01, 0x8b, 0x07, 0xa9, 0x00, + 0x80, 0x75, 0x02, 0x58, 0xc3, 0xa9, 0x00, 0x20, 0x74, 0x0b, 0xff, 0x86, 0x40, 0x02, 0x8b, 0x4f, + 0x04, 0x01, 0x8e, 0x42, 0x02, 0xe8, 0xd0, 0x03, 0x75, 0xc4, 0xf7, 0x86, 0xb6, 0x01, 0x00, 0x02, + 0x75, 0x11, 0xa9, 0x01, 0x09, 0x75, 0x40, 0x80, 0x7e, 0x07, 0x10, 0x74, 0x3a, 0x80, 0x7e, 0x07, + 0x12, 0x74, 0x34, 0xa8, 0x28, 0x75, 0xab, 0x33, 0xff, 0xf6, 0x47, 0x0e, 0x80, 0x75, 0xa7, 0x8b, + 0x47, 0x04, 0x83, 0xf8, 0x12, 0x77, 0x05, 0x33, 0xc0, 0xe9, 0xd7, 0x01, 0x83, 0xe8, 0x12, 0x2b, + 0xc7, 0x83, 0xf8, 0x04, 0x7c, 0x38, 0x8b, 0x49, 0x16, 0x88, 0xae, 0x08, 0x02, 0x51, 0x80, 0xe1, + 0xf0, 0x80, 0xf9, 0x00, 0x74, 0x04, 0x59, 0xe9, 0xdf, 0x00, 0x59, 0x0b, 0xff, 0x74, 0x0f, 0xf6, + 0xc1, 0x0f, 0x74, 0xf3, 0x80, 0xf9, 0x33, 0x74, 0xee, 0x80, 0xf9, 0x03, 0x74, 0xe9, 0x86, 0xc4, + 0x39, 0x41, 0x14, 0x86, 0xc4, 0x75, 0x03, 0xeb, 0x0d, 0x90, 0xe9, 0x91, 0x01, 0x90, 0xe9, 0x92, + 0x01, 0x90, 0xe9, 0x9a, 0x01, 0x90, 0xf6, 0x86, 0x95, 0x02, 0x01, 0x74, 0x11, 0xe8, 0x50, 0xfa, + 0x80, 0x7e, 0x06, 0x04, 0x75, 0x08, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0xe2, 0xe8, 0xf6, 0x86, + 0x97, 0x02, 0x01, 0x74, 0x28, 0xc6, 0x86, 0x97, 0x02, 0x00, 0xf7, 0x86, 0xf8, 0x00, 0x00, 0x01, + 0x74, 0x09, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x74, 0x14, 0xeb, 0x07, 0x80, 0xbe, 0xfe, 0x00, 0x00, + 0x74, 0x0b, 0xb8, 0x0e, 0x00, 0xe8, 0x87, 0xf8, 0xeb, 0x6f, 0xe9, 0x52, 0x01, 0x80, 0xfd, 0x17, + 0x77, 0x11, 0x80, 0xfd, 0x01, 0x74, 0xab, 0x80, 0xfd, 0x09, 0x74, 0xa6, 0x80, 0xfd, 0x0a, 0x74, + 0xa1, 0xeb, 0x12, 0x80, 0xfd, 0x20, 0x72, 0xe2, 0x80, 0xfd, 0x29, 0x77, 0xdd, 0x80, 0xfd, 0x21, + 0x74, 0xd8, 0xe9, 0x62, 0xff, 0x80, 0xfd, 0x10, 0x76, 0x02, 0xeb, 0x05, 0x80, 0xfd, 0x0e, 0x73, + 0x1d, 0x53, 0x8b, 0xd9, 0xc1, 0xeb, 0x08, 0x80, 0xe1, 0x0f, 0x3a, 0x8f, 0x78, 0x04, 0x74, 0x23, + 0x83, 0xfb, 0x0b, 0x74, 0x19, 0x83, 0xfb, 0x0c, 0x74, 0x14, 0x5b, 0xe9, 0xfa, 0x00, 0x80, 0xe1, + 0x0f, 0x80, 0xf9, 0x00, 0x74, 0xf5, 0x80, 0xf9, 0x03, 0x74, 0xf0, 0xe9, 0xa1, 0x01, 0x80, 0xf9, + 0x08, 0x75, 0xe7, 0x5b, 0xe9, 0x98, 0x01, 0x5b, 0x5f, 0x8b, 0x9e, 0xb2, 0x01, 0xf7, 0x86, 0xf6, + 0x00, 0x01, 0x00, 0x74, 0x28, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, + 0x1c, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x08, 0x74, 0x06, 0x68, 0x79, 0x29, 0xe9, 0x21, 0xfd, 0xf7, + 0x86, 0x12, 0x01, 0x80, 0x00, 0x74, 0x06, 0x68, 0x79, 0x29, 0xe9, 0xf4, 0xfc, 0x8b, 0x5f, 0x02, + 0x89, 0x9e, 0xb2, 0x01, 0x8b, 0xc3, 0x83, 0xe8, 0x02, 0x3b, 0x86, 0xa8, 0x15, 0x77, 0x04, 0x8b, + 0x86, 0xaa, 0x15, 0x8e, 0x46, 0x02, 0x53, 0x26, 0x8b, 0x1e, 0x78, 0x00, 0x81, 0x7f, 0xfc, 0xde, + 0xad, 0x75, 0x07, 0x81, 0x7f, 0xfe, 0xbe, 0xaf, 0x74, 0x05, 0xc6, 0x86, 0xbd, 0x01, 0x01, 0x5b, + 0x26, 0xa3, 0x78, 0x00, 0x26, 0xa1, 0x78, 0x00, 0x93, 0xc7, 0x47, 0xfc, 0xde, 0xad, 0xc7, 0x47, + 0xfe, 0xbe, 0xaf, 0x93, 0xfa, 0x8b, 0x07, 0xa9, 0x00, 0x80, 0x74, 0x17, 0xfb, 0xff, 0x86, 0x3c, + 0x01, 0x83, 0xbe, 0x3c, 0x01, 0x05, 0x77, 0x2b, 0x8a, 0x4e, 0x09, 0x3a, 0x4e, 0x08, 0x75, 0x23, + 0xe9, 0x22, 0xfe, 0xc6, 0x86, 0xb9, 0x01, 0x00, 0xfb, 0xf6, 0x86, 0xbc, 0x01, 0x01, 0x74, 0x08, + 0xc6, 0x86, 0xbc, 0x01, 0x00, 0xe8, 0x2f, 0xeb, 0xc7, 0x86, 0x3c, 0x01, 0x00, 0x00, 0x58, 0xc3, + 0xe9, 0x46, 0xff, 0xe8, 0x63, 0xe3, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0xd7, 0xc7, 0x44, 0x02, 0x04, + 0x00, 0xc6, 0x86, 0xb9, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x6b, 0xe3, 0xeb, 0xcb, 0xba, 0x80, + 0x02, 0xeb, 0x1d, 0xba, 0x80, 0x01, 0xeb, 0x18, 0xba, 0x80, 0x04, 0xeb, 0x13, 0x5f, 0x5b, 0xf7, + 0x86, 0x12, 0x01, 0x00, 0x10, 0x74, 0x06, 0x68, 0x79, 0x29, 0xe9, 0x94, 0xfc, 0xba, 0x80, 0x03, + 0x33, 0xc0, 0x8e, 0xc0, 0x68, 0x45, 0x29, 0xe9, 0xc6, 0x01, 0x33, 0xd2, 0x32, 0xed, 0x8a, 0x4d, + 0xff, 0x89, 0x55, 0x02, 0x83, 0xc7, 0x05, 0xe2, 0xf8, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x38, + 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x0b, 0xc6, 0x46, 0x09, 0x04, 0xc6, 0x86, 0x63, 0x02, 0x00, 0xeb, + 0x24, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x21, 0xc6, 0x86, 0x63, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, + 0x01, 0xe8, 0x0c, 0xe7, 0xbe, 0x9d, 0x4c, 0xe8, 0xc6, 0xe4, 0x50, 0x53, 0x33, 0xc0, 0x8e, 0xc0, + 0xe8, 0x47, 0x02, 0x5b, 0x58, 0xbb, 0x00, 0x00, 0x8b, 0xf8, 0x8b, 0xf3, 0x5b, 0x57, 0x53, 0x68, + 0x43, 0x29, 0xff, 0x66, 0x12, 0xeb, 0x87, 0x8b, 0xc7, 0x8b, 0xbf, 0x90, 0x04, 0x0b, 0xff, 0x78, + 0xf4, 0x74, 0xa6, 0x03, 0xfd, 0xf6, 0x45, 0x01, 0x80, 0x75, 0x02, 0xeb, 0x8d, 0xe9, 0x21, 0x01, + 0xe9, 0x03, 0x01, 0x5f, 0x5b, 0xba, 0x80, 0x08, 0xe9, 0x75, 0xff, 0x8b, 0x54, 0x02, 0x86, 0xd6, + 0x83, 0xc6, 0x02, 0xb0, 0x04, 0xeb, 0x51, 0x5f, 0x5b, 0xba, 0x80, 0x05, 0xe9, 0x61, 0xff, 0x53, + 0x8d, 0x71, 0x18, 0x32, 0xff, 0x8a, 0xdd, 0xd1, 0xe3, 0x83, 0xe8, 0x04, 0x0b, 0xc0, 0x74, 0xb7, + 0x89, 0x46, 0x04, 0x57, 0x8b, 0xbf, 0x90, 0x04, 0x0b, 0xff, 0x74, 0xc4, 0x79, 0x03, 0xe9, 0x2c, + 0xff, 0x03, 0xfd, 0x8e, 0xc7, 0x33, 0xc0, 0x32, 0xed, 0x8a, 0x4d, 0xff, 0x89, 0x45, 0x02, 0x83, + 0xc7, 0x05, 0xe2, 0xf8, 0x33, 0xd2, 0x03, 0xf2, 0x8a, 0x4c, 0x01, 0x8a, 0x14, 0x0a, 0xd2, 0x74, + 0xb6, 0x80, 0xfa, 0xff, 0x74, 0xa5, 0xb0, 0x02, 0x29, 0x56, 0x04, 0x72, 0xaa, 0x0a, 0xc9, 0x78, + 0x92, 0x8a, 0xe1, 0x80, 0xe1, 0x3f, 0x8c, 0xc7, 0x8a, 0x6d, 0xff, 0xeb, 0x12, 0x80, 0x7d, 0x04, + 0xff, 0x74, 0x15, 0xeb, 0x92, 0xe9, 0x7b, 0xff, 0xfe, 0xcd, 0x74, 0xf9, 0x83, 0xc7, 0x05, 0x3a, + 0x0d, 0x75, 0xf5, 0x3a, 0x55, 0x04, 0x75, 0xe5, 0x8d, 0x44, 0x02, 0x87, 0x45, 0x02, 0x0b, 0xc0, + 0x74, 0x09, 0xf6, 0x45, 0x01, 0x80, 0x75, 0xdd, 0x89, 0x45, 0x02, 0x83, 0x7e, 0x04, 0x00, 0x75, + 0xa5, 0x33, 0xc0, 0x8c, 0xc6, 0xf6, 0x44, 0x01, 0x80, 0x74, 0x0e, 0x39, 0x44, 0x02, 0x74, 0x60, + 0x83, 0xc6, 0x05, 0xf6, 0x44, 0x01, 0x80, 0x75, 0xf2, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x36, + 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x0b, 0xc6, 0x86, 0x63, 0x02, 0x00, 0xc6, 0x46, 0x09, 0x04, 0xeb, + 0x22, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x1f, 0xc6, 0x86, 0x63, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, + 0x01, 0xe8, 0xdc, 0xe5, 0xbe, 0x9d, 0x4c, 0xe8, 0x96, 0xe3, 0x33, 0xc0, 0x8e, 0xc0, 0x53, 0xe8, + 0x18, 0x01, 0x5b, 0xbb, 0x00, 0x00, 0x89, 0x5e, 0x04, 0x8b, 0xf3, 0x5f, 0x5b, 0x33, 0xc0, 0x8e, + 0xc0, 0x3b, 0xb6, 0xba, 0x01, 0x73, 0x06, 0x68, 0x45, 0x29, 0xff, 0x66, 0x12, 0xe9, 0x69, 0xfd, + 0x5f, 0x5b, 0xba, 0x80, 0x07, 0xe9, 0x58, 0xfe, 0x56, 0x57, 0x50, 0x33, 0xc0, 0x8e, 0xc0, 0x8b, + 0xb6, 0xa8, 0x15, 0x8b, 0xbe, 0xaa, 0x15, 0x83, 0xc7, 0x01, 0xa5, 0xa5, 0xa5, 0x8b, 0xc3, 0x03, + 0x47, 0x04, 0x8b, 0xbe, 0xaa, 0x15, 0x3b, 0xc7, 0x7f, 0x02, 0x32, 0xc0, 0x58, 0x5f, 0x5e, 0xc3, + 0x8c, 0xd8, 0x8e, 0xc0, 0xf6, 0x41, 0x16, 0x0f, 0x74, 0x60, 0x89, 0x96, 0xee, 0x02, 0x81, 0xfa, + 0x80, 0x02, 0x74, 0x13, 0xba, 0x09, 0x04, 0xe8, 0xaf, 0xf9, 0x72, 0x0b, 0xad, 0x86, 0xe0, 0x89, + 0x86, 0x18, 0x02, 0x86, 0xe0, 0xeb, 0x06, 0x8b, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xea, + 0x02, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x4d, 0x22, 0x57, 0x53, 0xe8, 0x2b, 0x06, 0x5a, 0x5f, 0x72, + 0x29, 0x57, 0xe8, 0x26, 0x00, 0xb8, 0x00, 0x0e, 0xab, 0x47, 0xb0, 0x00, 0xaa, 0x8d, 0xb6, 0xe8, + 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0xec, 0x02, 0xa5, 0xa5, 0x55, 0x8b, 0xea, 0x8a, 0x47, 0x16, 0x8a, + 0x66, 0x17, 0xab, 0x5d, 0xe8, 0xa1, 0x06, 0x8b, 0xda, 0x5f, 0xc3, 0x55, 0x8b, 0xea, 0x8a, 0x43, + 0x16, 0xc0, 0xe0, 0x04, 0x88, 0x41, 0x16, 0xc7, 0x47, 0x06, 0xe0, 0x00, 0x83, 0xe9, 0x06, 0x89, + 0x4f, 0x04, 0x0b, 0xff, 0x75, 0x18, 0x8d, 0x76, 0x0e, 0x8d, 0x7f, 0x08, 0x8c, 0xd8, 0x8e, 0xc0, + 0xa5, 0xa5, 0xa5, 0x8b, 0xd5, 0x5d, 0x8d, 0xb6, 0x00, 0x03, 0xa5, 0xa5, 0xa5, 0xc3, 0x8b, 0xcf, + 0xd1, 0xe9, 0x8d, 0x76, 0x0e, 0x8d, 0x7f, 0x08, 0x8c, 0xd8, 0x8e, 0xc0, 0xad, 0x24, 0x7f, 0xab, + 0xa5, 0xa5, 0x8b, 0xd5, 0x5d, 0x56, 0x8d, 0xb6, 0x00, 0x03, 0xad, 0x0c, 0x80, 0xab, 0xa5, 0xa5, + 0x5e, 0xad, 0x80, 0xcc, 0x80, 0xab, 0x49, 0xf3, 0xa5, 0xc3, 0x8b, 0x86, 0x0c, 0x03, 0x86, 0xe0, + 0x89, 0x86, 0x14, 0x02, 0x89, 0x86, 0x06, 0x02, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0x00, 0x02, + 0x8d, 0xb6, 0x00, 0x03, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0xb9, 0x2a, 0x00, 0xe8, 0x5f, 0x05, 0x72, + 0xd8, 0x8d, 0xb6, 0xf2, 0x02, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, + 0x0d, 0x06, 0xeb, 0x6a, 0xb9, 0x26, 0x00, 0xe8, 0x44, 0x05, 0x72, 0xf6, 0x8d, 0xb6, 0x1c, 0x03, + 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xf2, 0x05, 0x8d, 0x7f, 0x08, + 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x03, 0x80, 0xe1, 0xfe, 0x57, 0xe8, 0x21, 0x05, 0x5f, 0x8b, 0xd7, + 0x72, 0x22, 0x83, 0xe9, 0x08, 0x8d, 0x7f, 0x04, 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0xc1, 0xab, 0x8b, + 0x86, 0x22, 0x03, 0xab, 0x8b, 0xf2, 0xd1, 0xe9, 0x49, 0xf3, 0xa5, 0xbe, 0x79, 0x4c, 0xe8, 0xef, + 0xe1, 0xe9, 0xbb, 0x05, 0xc3, 0xb9, 0x26, 0x00, 0xe8, 0xf3, 0x04, 0x72, 0x11, 0x8c, 0xd8, 0x8e, + 0xc0, 0x8d, 0xb6, 0x42, 0x03, 0x8b, 0xfb, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xa1, 0x05, 0xc3, 0xb9, + 0x26, 0x00, 0xe8, 0xf3, 0x04, 0x72, 0xf7, 0x8d, 0xb6, 0x68, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, + 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xc6, 0x86, 0x67, 0x02, 0x01, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, + 0x03, 0xe9, 0x74, 0x05, 0x68, 0xc9, 0x31, 0xe9, 0x6e, 0x05, 0xb9, 0x26, 0x00, 0xe8, 0xc8, 0x04, + 0x72, 0xcc, 0x8d, 0xb6, 0x8e, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, + 0xc6, 0x86, 0x67, 0x02, 0x01, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x49, 0x05, 0x68, + 0xc9, 0x31, 0xe9, 0x43, 0x05, 0xb9, 0x18, 0x00, 0xe8, 0x9d, 0x04, 0x72, 0xa1, 0x8d, 0xb6, 0xb4, + 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x2a, 0x05, 0x83, 0xc1, + 0x1c, 0x56, 0x57, 0x52, 0xe8, 0x81, 0x04, 0x5a, 0x5f, 0x5e, 0x72, 0x53, 0x56, 0x8c, 0xd8, 0x8e, + 0xc0, 0x83, 0xe9, 0x08, 0x8b, 0xc1, 0x8d, 0x7f, 0x04, 0xab, 0xba, 0xe0, 0x00, 0x8b, 0xc2, 0xab, + 0x8d, 0xb6, 0xd4, 0x03, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x00, 0x03, 0x80, 0xbe, 0x62, 0x01, 0x01, + 0x75, 0x04, 0x8d, 0xb6, 0x00, 0x01, 0xa5, 0xa5, 0xa5, 0x83, 0xe9, 0x0e, 0x80, 0xbe, 0x63, 0x01, + 0x02, 0x75, 0x03, 0x83, 0xe9, 0x04, 0x8b, 0xc1, 0x86, 0xe0, 0xab, 0xb8, 0x00, 0x08, 0xab, 0x83, + 0xe9, 0x04, 0xb8, 0xff, 0x26, 0xab, 0x8b, 0xc1, 0x86, 0xe0, 0xab, 0x5e, 0xe9, 0xc9, 0x04, 0xeb, + 0x69, 0xf6, 0x86, 0x8b, 0x02, 0x01, 0x75, 0x03, 0xe9, 0xfb, 0x04, 0x83, 0xc1, 0x1a, 0x57, 0x52, + 0xe8, 0x15, 0x04, 0x5a, 0x5f, 0x72, 0x53, 0x8c, 0xd8, 0x8e, 0xc0, 0x83, 0xe9, 0x08, 0x8b, 0xc1, + 0x8d, 0x7f, 0x04, 0xab, 0xb9, 0x07, 0x00, 0x8d, 0xb6, 0xec, 0x03, 0xf3, 0xa5, 0x83, 0xe8, 0x0e, + 0x8b, 0xc8, 0x86, 0xe0, 0xab, 0xb8, 0x00, 0x08, 0xab, 0x83, 0xe9, 0x04, 0x8b, 0xc1, 0xb4, 0x26, + 0xab, 0xbe, 0x80, 0x03, 0xb9, 0x23, 0x00, 0xf3, 0xa5, 0xc6, 0x86, 0x8b, 0x02, 0x00, 0xe9, 0x77, + 0x04, 0xb9, 0x44, 0x00, 0xe8, 0xd1, 0x03, 0x72, 0x11, 0x8d, 0xb6, 0x00, 0x04, 0x8b, 0xfb, 0x8c, + 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe8, 0x5e, 0x04, 0xc3, 0xb9, 0x36, 0x00, 0xe8, 0xb7, + 0x03, 0x72, 0xf7, 0xff, 0x86, 0x56, 0x02, 0x8d, 0xb6, 0xd2, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, + 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x33, 0xc0, 0x8d, 0xbe, 0xec, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe, + 0xf4, 0x05, 0xab, 0xab, 0xaa, 0xe9, 0x30, 0x04, 0x8d, 0x4d, 0x3a, 0x57, 0x53, 0xe8, 0x88, 0x03, + 0x5a, 0x5f, 0x72, 0x5b, 0x57, 0xe8, 0x83, 0xfd, 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x26, 0xab, + 0x47, 0xb0, 0x22, 0xaa, 0x8d, 0xb6, 0xe8, 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0x0e, 0x03, 0xa5, 0xa5, + 0xa5, 0x8d, 0xb6, 0x14, 0x03, 0xa5, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x44, 0x04, 0xa5, 0xa5, 0x8d, + 0xb6, 0x48, 0x04, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x4e, 0x04, 0xa5, 0x53, 0x8c, 0xdb, 0x8e, 0x46, + 0x02, 0x26, 0xa1, 0x66, 0x00, 0xe8, 0x15, 0xdd, 0x8e, 0xc3, 0xab, 0x8e, 0x46, 0x02, 0x26, 0xa1, + 0x64, 0x00, 0xe8, 0x08, 0xdd, 0x8e, 0xc3, 0xab, 0x5b, 0xe8, 0xcc, 0x03, 0x8b, 0xda, 0x5f, 0xc3, + 0x8d, 0x4d, 0x38, 0x57, 0x53, 0xe8, 0x20, 0x03, 0x5a, 0x5f, 0x72, 0xf3, 0x57, 0xe8, 0x1b, 0xfd, + 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x24, 0xab, 0x47, 0xb0, 0x23, 0xaa, 0x8d, 0xb6, 0xe8, 0x02, + 0xa5, 0xa5, 0x8d, 0xb6, 0x18, 0x04, 0xb9, 0x06, 0x00, 0xf3, 0xa5, 0x8d, 0xb6, 0x5c, 0x04, 0xa5, + 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x54, 0x04, 0xa5, 0xa5, 0xa5, 0xa5, 0xe8, 0x8a, 0x03, 0x8b, 0xda, + 0x5f, 0xc3, 0x8d, 0x4d, 0x3e, 0x57, 0x53, 0xe8, 0xde, 0x02, 0x5a, 0x5f, 0x72, 0x64, 0x57, 0xe8, + 0xd9, 0xfc, 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x2a, 0xab, 0x47, 0xb0, 0x24, 0xaa, 0x8d, 0xb6, + 0xe8, 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0x2c, 0x04, 0xb9, 0x0a, 0x00, 0xf3, 0xa5, 0x8d, 0xb6, 0x4e, + 0x04, 0xa5, 0x53, 0x8c, 0xdb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x66, 0x00, 0xe8, 0x7e, 0xdc, 0x8e, + 0xc3, 0xab, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x64, 0x00, 0xe8, 0x71, 0xdc, 0x8e, 0xc3, 0xab, 0x5b, + 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xb6, 0x64, 0x04, 0xa5, 0x8b, 0x86, 0xfc, 0x01, 0x86, 0xc4, 0xab, + 0x8d, 0xb6, 0x68, 0x04, 0xa5, 0x8b, 0x86, 0xfa, 0x01, 0x86, 0xc4, 0xab, 0xe8, 0x19, 0x03, 0x8b, + 0xda, 0x5f, 0xc3, 0xb9, 0x3a, 0x00, 0xe8, 0x6f, 0x02, 0x72, 0xf7, 0x8d, 0xb6, 0x6c, 0x04, 0x8b, + 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0x03, + 0xe9, 0xf5, 0x02, 0x68, 0xc9, 0x31, 0xe9, 0xef, 0x02, 0xb9, 0x26, 0x00, 0xe8, 0x49, 0x02, 0x72, + 0xd1, 0xff, 0x86, 0x52, 0x02, 0x8d, 0xb6, 0xa6, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, + 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0x03, 0xe9, 0xcb, 0x02, 0x68, 0xc9, 0x31, + 0xe9, 0xc5, 0x02, 0xb9, 0x20, 0x00, 0xe8, 0x1f, 0x02, 0x72, 0xa7, 0x8d, 0xb6, 0xf2, 0x01, 0x8d, + 0xbe, 0xe6, 0x04, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0xcc, 0x04, 0x8b, 0xfb, + 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x9a, 0x02, 0x68, 0xc9, + 0x31, 0xe9, 0x94, 0x02, 0x89, 0x86, 0x06, 0x05, 0x86, 0xc4, 0x89, 0x86, 0x12, 0x02, 0xb9, 0x2a, + 0x00, 0xe8, 0xe4, 0x01, 0x72, 0x18, 0x8d, 0xb6, 0xec, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, + 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0x07, 0xe9, 0x6a, 0x02, 0xe9, 0x5a, + 0x01, 0x90, 0x68, 0xc9, 0x31, 0xe9, 0x60, 0x02, 0xb9, 0x18, 0x00, 0xe8, 0xba, 0x01, 0x73, 0x03, + 0xe9, 0x3f, 0xff, 0x8d, 0xb6, 0x8a, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, + 0xa5, 0xe9, 0x44, 0x02, 0xb9, 0x24, 0x00, 0xe8, 0x9e, 0x01, 0x73, 0x03, 0xe9, 0x23, 0xff, 0x8b, + 0x86, 0x34, 0x05, 0x86, 0xc4, 0x89, 0x86, 0x2a, 0x02, 0x8d, 0xb6, 0x16, 0x05, 0x8b, 0xfb, 0x8c, + 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x1e, 0x02, 0xb9, 0x1c, 0x00, 0xe8, 0x78, 0x01, + 0x73, 0x03, 0xe9, 0xfd, 0xfe, 0x8d, 0xb6, 0x3a, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, + 0xe9, 0xf3, 0xa5, 0xe9, 0x02, 0x02, 0xb9, 0x18, 0x00, 0xe8, 0x5c, 0x01, 0x73, 0x03, 0xe9, 0xe1, + 0xfe, 0x8d, 0xb6, 0x56, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, + 0xe6, 0x01, 0xb9, 0x1c, 0x00, 0x50, 0xe8, 0x3f, 0x01, 0x58, 0x73, 0x03, 0xe9, 0xc3, 0xfe, 0x8d, + 0xb6, 0x6e, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xc8, 0x01, + 0xb9, 0x18, 0x00, 0xe8, 0x22, 0x01, 0x73, 0x03, 0xe9, 0xa7, 0xfe, 0x8d, 0xb6, 0xa2, 0x05, 0x8b, + 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xac, 0x01, 0xb9, 0x18, 0x00, 0xe8, + 0x06, 0x01, 0x73, 0x03, 0xe9, 0x8b, 0xfe, 0x8d, 0xb6, 0xba, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, + 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x90, 0x01, 0x8b, 0x4f, 0x04, 0x53, 0xe8, 0xe9, 0x00, 0x5e, + 0x72, 0x17, 0x89, 0x9e, 0x3c, 0x02, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, + 0xc7, 0x86, 0x3e, 0x02, 0x01, 0x00, 0xe9, 0x6f, 0x01, 0xe9, 0x7d, 0x12, 0xb9, 0x18, 0x00, 0xe8, + 0xc6, 0x00, 0x8d, 0xb6, 0xb4, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, + 0x33, 0xc0, 0x8d, 0x7f, 0x08, 0xb9, 0x06, 0x00, 0xf3, 0xab, 0xe9, 0x4b, 0x01, 0x53, 0x8b, 0x9e, + 0xb0, 0x01, 0x8b, 0xb6, 0xae, 0x01, 0x3b, 0xde, 0x74, 0x15, 0x8a, 0x47, 0x17, 0xf6, 0x44, 0x0e, + 0x80, 0x75, 0x0e, 0x38, 0x44, 0x17, 0x75, 0x09, 0x8b, 0x74, 0x02, 0x89, 0xb6, 0xae, 0x01, 0xeb, + 0x1a, 0x8b, 0xfe, 0x8b, 0x74, 0x02, 0x3b, 0xde, 0x74, 0x11, 0xf6, 0x44, 0x0e, 0x80, 0x75, 0xf1, + 0x38, 0x44, 0x17, 0x75, 0xec, 0x8b, 0x44, 0x02, 0x89, 0x45, 0x02, 0x5b, 0xc3, 0xe8, 0x37, 0xd8, + 0xc6, 0x86, 0x87, 0x02, 0x00, 0x8d, 0xb6, 0xa6, 0x01, 0x8d, 0xbe, 0xac, 0x01, 0x8c, 0xd8, 0x8e, + 0xc0, 0xa5, 0xa5, 0xa5, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x16, 0x8d, 0x9e, + 0xa8, 0x12, 0x89, 0x9e, 0xa8, 0x01, 0x89, 0x9e, 0xaa, 0x01, 0xc7, 0x07, 0x30, 0x80, 0xc7, 0x47, + 0x04, 0x00, 0x00, 0x83, 0xc3, 0x08, 0x89, 0x9e, 0xa6, 0x01, 0xc6, 0x86, 0x8a, 0x02, 0x01, 0x83, + 0xc1, 0x02, 0xeb, 0x4a, 0x8b, 0x9e, 0xac, 0x01, 0x8b, 0xb6, 0xae, 0x01, 0xeb, 0x29, 0x80, 0xbe, + 0x87, 0x02, 0x01, 0x74, 0xa8, 0x8d, 0x96, 0xa8, 0x15, 0x8d, 0xbe, 0xa8, 0x12, 0x8b, 0x9e, 0xa6, + 0x01, 0x8b, 0xb6, 0xa8, 0x01, 0xeb, 0x18, 0x90, 0x8b, 0x9e, 0xa6, 0x01, 0x8b, 0xb6, 0xa8, 0x01, + 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0xcd, 0x8d, 0x96, 0xa8, 0x12, 0x8d, 0xbe, 0xa8, 0x09, 0x83, + 0xc1, 0x02, 0x3b, 0xde, 0x73, 0x17, 0x8b, 0xc6, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0x25, 0xc7, 0x07, + 0x00, 0x00, 0x83, 0xc3, 0x02, 0xc7, 0x07, 0x00, 0x00, 0x83, 0xe9, 0x02, 0xc3, 0x8b, 0xc2, 0x2b, + 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xe7, 0x8b, 0xdf, 0x8b, 0xc6, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, + 0x02, 0xeb, 0xdb, 0x3b, 0xb6, 0xae, 0x01, 0x74, 0x11, 0x80, 0xbe, 0x62, 0x02, 0x01, 0x75, 0x05, + 0x83, 0x8e, 0xe6, 0x02, 0x02, 0xe8, 0x8e, 0x01, 0xf9, 0xc3, 0x8b, 0x74, 0x02, 0x89, 0xb6, 0xae, + 0x01, 0x3b, 0xdd, 0x74, 0x04, 0x3b, 0xde, 0x77, 0xc4, 0x8b, 0xc6, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, + 0xe9, 0x89, 0xb6, 0xae, 0x01, 0xeb, 0xa7, 0x8b, 0xb6, 0xb0, 0x01, 0x89, 0x5c, 0x02, 0x80, 0x4c, + 0x05, 0x80, 0x89, 0x9e, 0xb0, 0x01, 0x03, 0x5f, 0x04, 0x83, 0xc3, 0x06, 0x89, 0x9e, 0xac, 0x01, + 0xc6, 0x86, 0x8c, 0x02, 0x01, 0xc3, 0xeb, 0xdf, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0xf7, 0x8e, + 0x46, 0x02, 0x26, 0xa1, 0x4c, 0x00, 0x0c, 0x02, 0x80, 0xbe, 0x8a, 0x02, 0x01, 0x74, 0x45, 0x8b, + 0xb6, 0xaa, 0x01, 0x89, 0x5c, 0x02, 0x80, 0x4c, 0x05, 0x80, 0x83, 0xc8, 0x04, 0x25, 0xff, 0xf7, + 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x4c, 0x00, 0x89, 0x9e, 0xaa, 0x01, 0x03, 0x5f, 0x04, 0x83, 0xc3, + 0x06, 0x89, 0x9e, 0xa6, 0x01, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x4c, 0x00, 0x0c, 0x02, 0x8b, + 0x9e, 0xaa, 0x01, 0xc7, 0x07, 0x00, 0x00, 0x26, 0x89, 0x1e, 0x6c, 0x00, 0x83, 0xc8, 0x08, 0x25, + 0xff, 0xf7, 0xeb, 0xcc, 0x8e, 0x46, 0x02, 0x89, 0x9e, 0xa8, 0x01, 0x26, 0x89, 0x1e, 0x6c, 0x00, + 0x83, 0xc8, 0x08, 0x25, 0xff, 0xf7, 0xc6, 0x86, 0x8a, 0x02, 0x00, 0xeb, 0xb3, 0x53, 0xf6, 0x86, + 0x87, 0x02, 0x01, 0x74, 0x13, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, + 0x0e, 0x32, 0x00, 0x00, 0x80, 0xe8, 0x65, 0xfe, 0x5b, 0xc3, 0xe9, 0xb8, 0x00, 0x90, 0x80, 0xbe, + 0x87, 0x02, 0x00, 0x75, 0xf5, 0x50, 0xfa, 0x8d, 0xb6, 0xac, 0x01, 0x8d, 0xbe, 0xa6, 0x01, 0x8c, + 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x80, 0xbe, 0x63, 0x01, 0x01, 0x75, 0x16, 0x8e, 0x46, 0x02, + 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x02, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00, 0xff, + 0xe3, 0xeb, 0x27, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x02, 0xf6, 0x86, 0xaf, + 0x02, 0x01, 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x1c, 0xeb, 0x0a, + 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00, 0xff, 0xe3, 0x33, 0xc0, 0x89, 0x86, 0xae, 0x01, + 0x40, 0x88, 0x86, 0x87, 0x02, 0x58, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x0a, 0xe8, 0x21, 0xe0, + 0x8e, 0x46, 0x02, 0x26, 0xa2, 0x5c, 0x00, 0x8b, 0x9e, 0xa8, 0x01, 0x83, 0x3f, 0x00, 0x74, 0x0f, + 0xf7, 0x07, 0x20, 0x00, 0x75, 0x06, 0xc7, 0x07, 0x00, 0x00, 0xeb, 0x03, 0xe8, 0x90, 0x00, 0xf6, + 0x86, 0x8c, 0x02, 0x01, 0x74, 0x19, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x6c, 0x00, 0xc6, 0x86, + 0x8c, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x08, 0xfb, 0xeb, 0x06, 0xc6, + 0x86, 0x8a, 0x02, 0x01, 0xfb, 0xc3, 0x56, 0x8d, 0xb6, 0xa8, 0x09, 0xc7, 0x86, 0xa6, 0x01, 0xb0, + 0x09, 0x01, 0xae, 0xa6, 0x01, 0x89, 0xb6, 0xa8, 0x01, 0x89, 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30, + 0x80, 0xc7, 0x44, 0x04, 0x00, 0x00, 0xc6, 0x86, 0x8a, 0x02, 0x01, 0x5e, 0xc3, 0xff, 0xa4, 0x22, + 0x04, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x32, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x1c, 0xf6, 0x86, + 0x7a, 0x02, 0x01, 0x74, 0x15, 0xff, 0x8e, 0xd6, 0x02, 0x75, 0x0f, 0xc6, 0x86, 0x7a, 0x02, 0x00, + 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0xd8, 0xdc, 0xeb, 0x10, 0x83, 0xfe, 0x10, 0x74, 0x07, 0x83, + 0xfe, 0x0e, 0x74, 0x02, 0xeb, 0x04, 0xff, 0xa4, 0x22, 0x04, 0xc3, 0x8b, 0x9e, 0xa8, 0x01, 0x8b, + 0x07, 0xfb, 0xa9, 0x10, 0x00, 0x74, 0x6c, 0xa9, 0x00, 0x80, 0x75, 0x46, 0x8b, 0x77, 0x17, 0x81, + 0xe6, 0xff, 0x00, 0xf7, 0x86, 0x3e, 0x02, 0x01, 0x00, 0x74, 0x1b, 0x3b, 0x9e, 0x3c, 0x02, 0x75, + 0x15, 0x89, 0x86, 0xcc, 0x15, 0x50, 0x53, 0x56, 0xe8, 0x2e, 0x0f, 0x5e, 0x5b, 0x58, 0xc7, 0x86, + 0x3e, 0x02, 0x00, 0x00, 0xeb, 0x18, 0xf7, 0x46, 0x14, 0xff, 0xff, 0x74, 0x11, 0x83, 0xfe, 0x2a, + 0x77, 0x0c, 0xd1, 0xe6, 0x68, 0x1a, 0x35, 0xff, 0x66, 0x14, 0x5b, 0x83, 0xc4, 0x02, 0x81, 0x0f, + 0x00, 0x80, 0xfa, 0xf6, 0x47, 0x05, 0x80, 0x74, 0x1a, 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xa8, 0x01, + 0xf7, 0x07, 0x10, 0x00, 0x74, 0x0d, 0xff, 0x86, 0x3a, 0x01, 0x83, 0xbe, 0x3a, 0x01, 0x06, 0x77, + 0x0f, 0xeb, 0x8c, 0xc6, 0x86, 0xb8, 0x01, 0x00, 0xc7, 0x86, 0x3a, 0x01, 0x00, 0x00, 0xfb, 0xc3, + 0xe8, 0x16, 0xd8, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0xea, 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6, 0x86, + 0xb8, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x1e, 0xd8, 0xeb, 0xdd, 0xa9, 0x20, 0x00, 0x75, 0x74, + 0xf7, 0x47, 0x04, 0x00, 0x80, 0x74, 0x05, 0xe8, 0x08, 0x00, 0x72, 0x9f, 0x53, 0x68, 0x16, 0x35, + 0xff, 0xe6, 0x8a, 0x47, 0x17, 0x8b, 0xfb, 0x8b, 0x7d, 0x02, 0x38, 0x45, 0x17, 0x74, 0x09, 0xf7, + 0x45, 0x04, 0x00, 0x80, 0x75, 0xf1, 0xf8, 0xc3, 0xf9, 0xc3, 0xa9, 0x20, 0x00, 0x75, 0x05, 0xa9, + 0x00, 0x10, 0x75, 0x0c, 0x33, 0xc9, 0xa9, 0x05, 0x00, 0x75, 0x0a, 0xa9, 0x0a, 0x04, 0x74, 0x05, + 0x8b, 0x0d, 0xe3, 0x01, 0x49, 0x89, 0x0d, 0xc3, 0x53, 0x8b, 0x4f, 0x04, 0x80, 0xe5, 0x7f, 0x89, + 0x4f, 0x04, 0x83, 0xc1, 0x06, 0xe8, 0xb0, 0xfc, 0x72, 0x19, 0x5e, 0x56, 0x8b, 0xfb, 0xd1, 0xe9, + 0x83, 0xe9, 0x02, 0x83, 0xc6, 0x04, 0x83, 0xc7, 0x04, 0x8c, 0xd8, 0x8e, 0xc0, 0xf3, 0xa5, 0xe8, + 0x36, 0xfd, 0xf8, 0x5b, 0xc3, 0x80, 0x7e, 0x08, 0x02, 0x75, 0x0b, 0xa9, 0x20, 0x00, 0x75, 0x06, + 0xc7, 0x86, 0xcc, 0x01, 0x01, 0x00, 0xc3, 0x8a, 0x56, 0x06, 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80, + 0xfa, 0x44, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x18, 0x80, 0xfa, 0x0c, 0x74, 0x07, 0x80, + 0xfa, 0x0e, 0x74, 0x02, 0xeb, 0x0b, 0xa9, 0x20, 0x00, 0x75, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0x3e, + 0xeb, 0xc3, 0xb9, 0x06, 0x00, 0xa9, 0x20, 0x00, 0x74, 0x09, 0xb9, 0x08, 0x00, 0xa9, 0x0f, 0x00, + 0x75, 0x01, 0xc3, 0xff, 0x86, 0xce, 0x02, 0x83, 0xbe, 0xce, 0x02, 0x02, 0x72, 0x06, 0x8b, 0xc1, + 0xe8, 0x1c, 0xeb, 0xc3, 0x53, 0xe8, 0x8d, 0xf7, 0x5b, 0xc3, 0x53, 0x68, 0x16, 0x35, 0xe9, 0x50, + 0xf8, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x1d, 0xa9, 0x00, 0x10, 0x75, 0xee, 0xa9, 0x20, 0x00, 0x74, + 0xe9, 0xa8, 0x0a, 0x75, 0x10, 0xff, 0x86, 0xc4, 0x02, 0x83, 0xbe, 0xc4, 0x02, 0x04, 0x72, 0xda, + 0xc6, 0x46, 0x07, 0x0e, 0xc3, 0x83, 0xbe, 0xc2, 0x02, 0x04, 0x73, 0xf8, 0xbe, 0xa9, 0x4c, 0xe8, + 0xce, 0xd8, 0xeb, 0xf0, 0x8d, 0xbe, 0xc8, 0x02, 0xe8, 0x0f, 0xff, 0x0b, 0xc9, 0x74, 0xe5, 0x53, + 0x68, 0x16, 0x35, 0xe9, 0x0b, 0xf8, 0x8d, 0xbe, 0xc0, 0x02, 0xe8, 0xfd, 0xfe, 0x0b, 0xc9, 0x74, + 0x03, 0xe9, 0x14, 0xff, 0xc3, 0x53, 0x8a, 0x56, 0x06, 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80, 0xfa, + 0x44, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x34, 0x80, 0xfa, 0x0c, 0x74, 0x07, 0x80, 0xfa, + 0x0e, 0x74, 0x02, 0xeb, 0x28, 0xa9, 0x20, 0x00, 0x74, 0x25, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, + 0x1c, 0x8b, 0x96, 0x66, 0x01, 0x4a, 0x89, 0x96, 0x66, 0x01, 0x83, 0xfa, 0x01, 0x77, 0x1b, 0xbe, + 0x91, 0x4c, 0xe8, 0x6b, 0xd8, 0xc6, 0x86, 0x8a, 0x02, 0x01, 0xe8, 0xe8, 0xf6, 0x5b, 0xc3, 0xfe, + 0x8e, 0x68, 0x01, 0x75, 0x05, 0xe8, 0x44, 0x20, 0xeb, 0xf3, 0xbe, 0x91, 0x4c, 0xe8, 0x50, 0xd8, + 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6, 0x86, 0x8a, 0x02, 0x01, 0xfa, 0xe8, 0xde, 0xf6, + 0xeb, 0xdb, 0xa9, 0x20, 0x00, 0x74, 0x41, 0xa9, 0x0f, 0x00, 0x75, 0x25, 0xc6, 0x86, 0x69, 0x02, + 0x01, 0xc6, 0x86, 0x6a, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, + 0xbe, 0xf2, 0x01, 0xab, 0xab, 0xab, 0x8b, 0x86, 0x0a, 0x02, 0x83, 0x8e, 0x0a, 0x02, 0x40, 0xeb, + 0x17, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xf2, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8b, + 0x86, 0x0a, 0x02, 0x83, 0xa6, 0x0a, 0x02, 0xbf, 0x33, 0x86, 0x0a, 0x02, 0x74, 0x05, 0xc6, 0x86, + 0x89, 0x02, 0x01, 0xc3, 0xfb, 0xc3, 0xff, 0xa4, 0xc6, 0x03, 0x53, 0x56, 0x8b, 0xc7, 0xf7, 0x07, + 0x00, 0x10, 0x75, 0x18, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xd4, 0x01, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, + 0x03, 0x00, 0xf3, 0xa7, 0x8b, 0xf8, 0x75, 0x0c, 0x81, 0x0f, 0x00, 0x10, 0x80, 0x7e, 0x06, 0x44, + 0x74, 0x47, 0xeb, 0x42, 0x8b, 0x49, 0x16, 0x80, 0xf9, 0x00, 0x74, 0x05, 0x80, 0xf9, 0x03, 0x75, + 0x38, 0x8d, 0xbe, 0x16, 0x03, 0x83, 0x3d, 0x00, 0x75, 0x0c, 0x83, 0x7d, 0x02, 0x00, 0x75, 0x06, + 0x83, 0x7d, 0x04, 0x00, 0x74, 0x23, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x16, 0x03, 0x8c, 0xd9, 0x8e, + 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x8b, 0xf8, 0x74, 0x0f, 0xc7, 0x86, 0x2e, 0x02, 0x0e, 0x00, + 0xb8, 0x0b, 0x00, 0xe8, 0x89, 0xe9, 0x5e, 0x5b, 0xc3, 0x8b, 0xf8, 0x5e, 0x5b, 0xff, 0xa4, 0xf2, + 0x03, 0xff, 0x86, 0x4c, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x06, 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, + 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x8b, 0xb6, 0x1a, 0x06, 0x8b, + 0x04, 0x86, 0xe0, 0x89, 0x86, 0x06, 0x02, 0x89, 0x86, 0x16, 0x02, 0x8b, 0xb6, 0x1f, 0x06, 0x8b, + 0x04, 0x89, 0x86, 0x1a, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x86, 0x1c, 0x02, 0x8b, 0x44, 0x04, 0x89, + 0x86, 0x1e, 0x02, 0x8b, 0xb6, 0x24, 0x06, 0x8b, 0x04, 0x89, 0x86, 0x24, 0x02, 0x8b, 0x44, 0x02, + 0x89, 0x86, 0x26, 0x02, 0x8b, 0xb6, 0x1a, 0x06, 0x8b, 0x04, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x56, + 0xf7, 0x07, 0x00, 0x10, 0x74, 0x14, 0xf6, 0x47, 0x06, 0x08, 0x75, 0x0b, 0x80, 0xbe, 0x63, 0x02, + 0x00, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x04, 0xe9, 0x1b, 0x01, 0x3b, 0x86, 0x0c, 0x03, 0x77, 0xf7, + 0x80, 0xbe, 0x62, 0x02, 0x01, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0xea, 0xc6, 0x46, 0x07, + 0x10, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0xe0, 0x80, 0xbe, 0x63, 0x02, 0x00, 0x75, 0xd9, 0xc6, 0x46, + 0x09, 0x0a, 0xf6, 0x86, 0x0b, 0x02, 0x10, 0x74, 0xce, 0x80, 0xa6, 0x0b, 0x02, 0x6f, 0xc6, 0x86, + 0x89, 0x02, 0x01, 0xe9, 0xdf, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x5b, 0xc6, 0x86, 0x58, 0x02, + 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xbf, 0xbe, 0x6d, 0x4c, 0xe8, 0xa0, 0xd6, + 0x8b, 0xb6, 0x1f, 0x06, 0x8d, 0xbe, 0x00, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, + 0xa7, 0x75, 0x21, 0x83, 0xf8, 0x01, 0x74, 0x1c, 0xff, 0x8e, 0xba, 0x02, 0x75, 0x13, 0xf6, 0x86, + 0x5c, 0x02, 0x01, 0x75, 0x0c, 0xc6, 0x86, 0x5c, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x08, 0xe9, 0x94, + 0x00, 0xe9, 0x91, 0x00, 0xc7, 0x86, 0xba, 0x02, 0x08, 0x00, 0x83, 0xf8, 0x01, 0x75, 0x0a, 0xc7, + 0x86, 0xb8, 0x02, 0x02, 0x00, 0xeb, 0x7e, 0xeb, 0x2e, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x16, 0x03, + 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0xe4, 0xff, 0x8e, 0xb8, 0x02, 0x75, + 0x14, 0xc7, 0x86, 0xb8, 0x02, 0x02, 0x00, 0xc6, 0x86, 0x58, 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, + 0x83, 0x0e, 0x4c, 0x00, 0x40, 0xeb, 0x4e, 0x80, 0xbe, 0x62, 0x02, 0x00, 0x74, 0x0c, 0x80, 0x7e, + 0x08, 0x08, 0x74, 0x41, 0xc6, 0x46, 0x09, 0x0a, 0xeb, 0x3b, 0xb7, 0x10, 0x8a, 0x5e, 0x06, 0x80, + 0xfb, 0x06, 0x74, 0x1f, 0x80, 0xfb, 0x08, 0x74, 0x1a, 0x80, 0xfb, 0x04, 0x74, 0x15, 0x80, 0xfb, + 0x0c, 0x74, 0x10, 0x80, 0xfb, 0x0a, 0x75, 0x07, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xeb, 0x04, 0xb7, + 0x12, 0xeb, 0x12, 0x88, 0x7e, 0x07, 0x80, 0xff, 0x12, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x1e, 0xb8, + 0x07, 0x00, 0xe8, 0xea, 0xe7, 0xc3, 0xff, 0x86, 0x4c, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x06, 0x00, + 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa5, + 0x80, 0x7e, 0x06, 0x48, 0x74, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0xc3, 0xe7, 0xeb, 0x37, 0xf6, 0x86, + 0x72, 0x02, 0x01, 0x74, 0x26, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x20, 0xc6, 0x46, 0x09, 0x1a, 0xc6, + 0x86, 0x73, 0x02, 0x00, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, + 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xeb, 0x0a, 0x80, 0x7e, 0x08, 0x18, 0x75, + 0x04, 0xc6, 0x46, 0x09, 0x1a, 0xc3, 0x8a, 0x4e, 0x06, 0x80, 0xbe, 0xac, 0x02, 0x01, 0x74, 0x02, + 0xeb, 0x06, 0xb8, 0x06, 0x00, 0xe8, 0x77, 0xe7, 0xc3, 0xe9, 0x8e, 0x00, 0xeb, 0x6e, 0xeb, 0x64, + 0x80, 0x7e, 0x06, 0x42, 0x75, 0xf3, 0x8b, 0x47, 0x1a, 0x83, 0xf8, 0x00, 0x75, 0xee, 0x80, 0xbe, + 0xfe, 0x00, 0x02, 0x74, 0xe9, 0xf6, 0x86, 0x78, 0x02, 0x01, 0x74, 0x29, 0xc6, 0x86, 0x78, 0x02, + 0x00, 0xc6, 0x86, 0xb0, 0x02, 0x01, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x02, 0xc7, 0x86, 0xd8, 0x02, + 0x05, 0x00, 0xbe, 0x27, 0x4d, 0xe8, 0x28, 0xd5, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x08, 0x74, 0x03, + 0xe8, 0xa1, 0xf6, 0xeb, 0x45, 0xf6, 0x86, 0x82, 0x02, 0x01, 0x75, 0x18, 0xf7, 0x86, 0xf4, 0x00, + 0x00, 0x10, 0x74, 0x10, 0xb8, 0x02, 0x00, 0xe8, 0xa3, 0x11, 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, + 0x07, 0x02, 0xeb, 0x26, 0xb8, 0x06, 0x00, 0xe8, 0x05, 0xe7, 0xeb, 0x1e, 0x3d, 0x00, 0x02, 0x75, + 0x10, 0xc6, 0x86, 0x7b, 0x02, 0x01, 0xe8, 0xfa, 0x06, 0xbe, 0x0f, 0x4d, 0xe8, 0xe1, 0xd4, 0xeb, + 0x09, 0x3d, 0x00, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x4a, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x02, + 0x00, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x2b, 0x8b, 0x47, 0x1a, 0x83, 0xf8, 0x00, 0x75, 0x10, 0xc6, + 0x46, 0x07, 0x48, 0x80, 0x7e, 0x08, 0x1c, 0x75, 0x19, 0xc6, 0x46, 0x09, 0x16, 0xeb, 0x13, 0x86, + 0xc4, 0x3d, 0x20, 0x80, 0x75, 0x0c, 0xc7, 0x86, 0x2e, 0x02, 0x11, 0x00, 0xb8, 0x08, 0x00, 0xe8, + 0xad, 0xe6, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x0f, 0x00, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x06, 0x80, + 0x7e, 0x06, 0x42, 0x75, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0x94, 0xe6, 0xeb, 0x0d, 0xf6, 0x86, 0x73, + 0x02, 0x01, 0x74, 0x06, 0xbe, 0x1b, 0x4d, 0xe8, 0x76, 0xd4, 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75, + 0x14, 0xe8, 0x85, 0xd2, 0xc7, 0x44, 0x02, 0x02, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x98, 0xd2, 0xbe, + 0x91, 0x4c, 0xe8, 0x0d, 0xd5, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x40, 0x00, 0x74, 0x18, 0xf7, 0x86, + 0xf4, 0x00, 0x00, 0x20, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x08, 0x72, 0x0a, 0x80, 0x7e, 0x06, 0x0e, + 0x77, 0x04, 0xc6, 0x46, 0x07, 0x14, 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75, 0x2e, 0xff, 0x8e, 0x66, + 0x01, 0x75, 0x1d, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x64, 0x00, 0xfd, 0xf7, 0x86, 0x12, 0x01, + 0x00, 0x84, 0x74, 0x06, 0xc6, 0x46, 0x07, 0x4e, 0xeb, 0x11, 0xc6, 0x46, 0x07, 0x46, 0xeb, 0x0b, + 0xc6, 0x86, 0x77, 0x02, 0x01, 0xb9, 0x5a, 0x00, 0xe8, 0x06, 0xf3, 0xc3, 0x80, 0x7e, 0x06, 0x44, + 0x75, 0x1f, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x64, 0x00, 0x02, 0xc6, 0x86, 0x76, 0x02, 0x00, + 0xbe, 0x91, 0x4c, 0xe8, 0xea, 0xd3, 0xb9, 0x5a, 0x00, 0xc6, 0x86, 0x8b, 0x02, 0x01, 0xe8, 0xe0, + 0xf2, 0xc3, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x72, 0x18, 0x8a, 0x4e, 0x06, 0x80, 0xf9, 0x44, 0x74, + 0x0a, 0x80, 0xf9, 0x46, 0x74, 0x05, 0x80, 0xf9, 0x48, 0x75, 0x06, 0xb8, 0x03, 0x00, 0xe8, 0xce, + 0xe5, 0xc3, 0xff, 0x86, 0x50, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x0b, 0x00, 0x8a, 0x86, 0x58, 0x02, + 0x88, 0x86, 0x84, 0x02, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xc6, 0x86, 0x65, 0x02, 0x00, 0x83, + 0x8e, 0x0a, 0x02, 0x20, 0x81, 0xa6, 0x0a, 0x02, 0xff, 0x2f, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf6, + 0x86, 0x58, 0x02, 0x01, 0x74, 0x38, 0xc6, 0x86, 0x84, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, + 0x26, 0x64, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0a, 0xc6, 0x86, 0x6d, 0x02, 0x00, + 0xc6, 0x86, 0x6f, 0x02, 0x00, 0x8a, 0xa6, 0x84, 0x02, 0x88, 0xa6, 0x58, 0x02, 0xe8, 0xa0, 0xd5, + 0x88, 0x86, 0x58, 0x02, 0xc6, 0x46, 0x09, 0x0c, 0xc7, 0x86, 0xca, 0x01, 0x00, 0x01, 0x80, 0x7e, + 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x06, 0x80, 0x7e, 0x08, 0x02, 0x75, 0x04, 0xc6, 0x46, + 0x09, 0x0c, 0x80, 0x7e, 0x08, 0x06, 0x74, 0x05, 0xc6, 0x86, 0x5e, 0x02, 0x01, 0x8d, 0x77, 0x0e, + 0x8d, 0xbe, 0x00, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x06, 0x00, 0xf3, 0xa6, 0x74, 0x08, 0x77, + 0x03, 0xe9, 0x95, 0x00, 0xe9, 0xfe, 0x00, 0xf6, 0x47, 0x06, 0x08, 0x75, 0x59, 0x80, 0x7e, 0x08, + 0x04, 0x75, 0x53, 0x8b, 0xb6, 0x2a, 0x06, 0x8d, 0xbe, 0x16, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, + 0x03, 0x00, 0xb8, 0x01, 0x00, 0xf3, 0xa7, 0x74, 0x02, 0xeb, 0x3e, 0xff, 0x86, 0xbe, 0x02, 0x83, + 0xbe, 0xbe, 0x02, 0x03, 0x72, 0x30, 0x83, 0xbe, 0xbc, 0x02, 0x03, 0x72, 0x29, 0xc6, 0x46, 0x09, + 0x02, 0xc6, 0x86, 0x84, 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x64, 0x00, 0x00, 0x80, + 0x8a, 0x86, 0x58, 0x02, 0x8a, 0xa6, 0x84, 0x02, 0x88, 0xa6, 0x58, 0x02, 0xe8, 0x01, 0xd5, 0x88, + 0x86, 0x58, 0x02, 0xe8, 0x6d, 0xf3, 0xe9, 0xec, 0x00, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x1d, 0xc6, + 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0x8a, 0x86, 0x58, 0x02, 0x8a, 0xa6, 0x84, + 0x02, 0x88, 0xa6, 0x58, 0x02, 0xe8, 0xd8, 0xd4, 0x88, 0x86, 0x58, 0x02, 0xc6, 0x46, 0x09, 0x0c, + 0xb8, 0x00, 0x03, 0xe8, 0xbe, 0xf3, 0xe9, 0xbc, 0x00, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x3d, 0xf6, + 0x86, 0x58, 0x02, 0x01, 0x75, 0x16, 0xf6, 0x86, 0x6c, 0x02, 0x01, 0x74, 0x16, 0xf6, 0x86, 0x62, + 0x02, 0x01, 0x74, 0x08, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x75, 0x16, 0xc6, 0x46, 0x09, 0x0c, + 0xe9, 0x92, 0x00, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x9c, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, + 0x74, 0x94, 0xc6, 0x46, 0x09, 0x04, 0xff, 0x86, 0x4e, 0x02, 0xeb, 0x79, 0x80, 0x7e, 0x08, 0x0a, + 0x75, 0x73, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x75, 0x0e, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x75, + 0x06, 0xc6, 0x46, 0x09, 0x0c, 0xeb, 0x5e, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x74, 0x56, 0xc6, + 0x46, 0x09, 0x04, 0xeb, 0x50, 0x80, 0x7e, 0x08, 0x04, 0x75, 0x2c, 0xc6, 0x46, 0x09, 0x0c, 0x80, + 0x7e, 0x0a, 0x00, 0x75, 0x1d, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0x8a, + 0x86, 0x58, 0x02, 0x8a, 0xa6, 0x84, 0x02, 0x88, 0xa6, 0x58, 0x02, 0xe8, 0x32, 0xd4, 0x88, 0x86, + 0x58, 0x02, 0xe8, 0xc8, 0xef, 0xeb, 0x1e, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x09, 0xf6, 0x86, 0x6c, + 0x02, 0x01, 0x74, 0x02, 0xeb, 0xab, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x09, 0xf6, 0x86, 0x63, 0x02, + 0x01, 0x75, 0x02, 0xeb, 0x9c, 0x8a, 0x86, 0x84, 0x02, 0x88, 0x86, 0x58, 0x02, 0xc3, 0xc7, 0x86, + 0xc6, 0x02, 0x02, 0x00, 0xff, 0x86, 0x46, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x0c, 0x00, 0x80, 0x7e, + 0x06, 0x04, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x06, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0x80, 0x7e, + 0x08, 0x00, 0x75, 0x56, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x3b, 0xc6, 0x86, 0x58, 0x02, 0x00, + 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x64, 0x00, 0xff, 0x7f, 0xb8, 0x00, 0x02, 0xe8, 0xb4, 0xf2, + 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x0c, 0xbe, 0x97, 0x4c, 0xe8, 0x73, 0xd1, 0xbe, 0xb5, 0x4c, + 0xe8, 0x6d, 0xd1, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0d, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, + 0x6f, 0x02, 0x00, 0xe8, 0x9a, 0xd3, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x34, 0xc6, 0x86, 0x5c, + 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xe9, 0xc9, 0x00, 0x80, 0x7e, 0x08, 0x0c, 0x75, 0x24, + 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x16, 0xbe, 0x97, 0x4c, 0xe8, 0x2f, + 0xd1, 0xbe, 0xb5, 0x4c, 0xe8, 0x29, 0xd1, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, + 0x00, 0xe9, 0x9f, 0x00, 0x80, 0x7e, 0x08, 0x02, 0x75, 0xf7, 0xc7, 0x86, 0xcc, 0x01, 0x00, 0x00, + 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x0a, 0xc6, 0x86, 0x5c, 0x02, 0x00, + 0xc6, 0x86, 0x5d, 0x02, 0x00, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x00, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, + 0xb9, 0x06, 0x00, 0xf3, 0xa6, 0x74, 0x2e, 0xc6, 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, + 0x81, 0x26, 0x64, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0a, 0xc6, 0x86, 0x6d, 0x02, + 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x07, 0xd3, 0xb8, 0x00, 0x02, 0xe8, 0xf5, 0xf1, 0xc6, + 0x46, 0x09, 0x00, 0xeb, 0x3e, 0x8e, 0x46, 0x02, 0x26, 0xa0, 0x5c, 0x00, 0xc6, 0x46, 0x09, 0x00, + 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xe8, + 0xde, 0xd2, 0x24, 0x07, 0xe8, 0xf7, 0xf4, 0xbe, 0x67, 0x4c, 0xe8, 0x93, 0xd0, 0x8c, 0xd8, 0x8e, + 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0xf2, 0x01, 0xab, 0xab, 0xab, 0xe8, 0xb2, 0xee, 0xbe, 0xb5, 0x4c, + 0xe8, 0x7d, 0xd0, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x03, 0xe8, 0xf9, 0xee, 0xc3, 0x8c, 0xd8, 0x8e, + 0xc0, 0xff, 0x86, 0x54, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x0f, 0x00, 0xf6, 0x86, 0xce, 0x01, 0x01, + 0x74, 0x3b, 0xb8, 0x38, 0x5f, 0xa3, 0x2c, 0x5f, 0x8d, 0x77, 0x0e, 0x8b, 0xf8, 0xa5, 0xa5, 0xa5, + 0xc7, 0x06, 0x34, 0x5f, 0x01, 0x00, 0xc6, 0x86, 0xcf, 0x01, 0x00, 0x33, 0xff, 0xba, 0x02, 0x08, + 0xe8, 0xc6, 0xe6, 0xbf, 0x2e, 0x5f, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x8d, 0x77, 0x0e, 0xbf, 0x2e, + 0x5f, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x05, 0xe8, 0x8b, 0x04, 0xeb, 0x00, 0x8d, 0x77, 0x0e, + 0x8d, 0xbe, 0xf2, 0x01, 0xa5, 0xa5, 0xa5, 0x80, 0x7e, 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, + 0x08, 0x8b, 0x8e, 0xc6, 0x02, 0xe3, 0x05, 0x49, 0x89, 0x8e, 0xc6, 0x02, 0xf7, 0x07, 0x3c, 0x00, + 0x75, 0x0a, 0xf6, 0x86, 0x6c, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x07, 0x02, 0xf6, 0x86, 0x58, 0x02, + 0x01, 0x75, 0x03, 0xe9, 0x93, 0x00, 0xbe, 0xb5, 0x4c, 0xe8, 0xe4, 0xcf, 0xf7, 0x07, 0x00, 0x10, + 0x75, 0x37, 0xc6, 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x64, 0x00, 0xff, + 0x7f, 0xb8, 0x00, 0x02, 0xe8, 0xfd, 0xf0, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x06, 0xbe, 0x97, + 0x4c, 0xe8, 0xbc, 0xcf, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x38, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, + 0x86, 0x6f, 0x02, 0x00, 0xe8, 0xe9, 0xd1, 0xeb, 0x29, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x33, 0xc6, + 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6a, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, + 0x77, 0x0e, 0x8d, 0xbe, 0xf2, 0x01, 0xab, 0xab, 0xab, 0x8b, 0x86, 0x0a, 0x02, 0xa9, 0x40, 0x00, + 0x74, 0x02, 0xeb, 0x48, 0x83, 0xc8, 0x40, 0x89, 0x86, 0x0a, 0x02, 0xc6, 0x86, 0x89, 0x02, 0x01, + 0xeb, 0x3a, 0x83, 0xa6, 0x0a, 0x02, 0xbf, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77, 0x0e, + 0x8d, 0xbe, 0xf2, 0x01, 0xa5, 0xa5, 0xa5, 0xeb, 0x23, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x06, + 0xbe, 0xb5, 0x4c, 0xe8, 0x4a, 0xcf, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xf7, 0x07, 0x3c, 0x00, 0x75, + 0x0b, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xbe, 0x9d, 0x4c, 0xe8, 0x34, 0xcf, 0xc3, 0xeb, 0x61, 0x8c, + 0xd8, 0x8e, 0xc0, 0xc7, 0x86, 0x2e, 0x02, 0x0d, 0x00, 0xf6, 0x86, 0xce, 0x01, 0x01, 0x74, 0x50, + 0x33, 0xff, 0xba, 0x02, 0x08, 0xe8, 0xa1, 0xe5, 0x8b, 0x3e, 0x2c, 0x5f, 0xb9, 0x03, 0x00, 0xf3, + 0xa7, 0x75, 0x3d, 0x81, 0xff, 0x46, 0x66, 0x73, 0x6f, 0x89, 0x3e, 0x2c, 0x5f, 0x8d, 0x77, 0x0e, + 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, 0x05, 0xc6, 0x86, 0xd0, 0x01, 0x01, 0x81, 0xff, 0x46, 0x66, + 0x73, 0x56, 0x89, 0x3e, 0x2c, 0x5f, 0x8d, 0x77, 0x0e, 0xa5, 0xa5, 0xa5, 0xff, 0x06, 0x34, 0x5f, + 0x8d, 0x77, 0x0e, 0xbf, 0x2e, 0x5f, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x03, 0xe8, 0x36, 0x03, + 0x8a, 0x86, 0x0a, 0x02, 0xa8, 0x40, 0x75, 0x3d, 0x80, 0x7e, 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, + 0x07, 0x08, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x3a, 0xf6, 0x86, 0x6c, 0x02, 0x01, 0x74, 0x35, 0xf6, + 0x86, 0x58, 0x02, 0x01, 0x74, 0x07, 0xf6, 0x86, 0x69, 0x02, 0x01, 0x75, 0x27, 0xe8, 0xb3, 0x00, + 0xc7, 0x86, 0xc8, 0x02, 0x01, 0x00, 0xeb, 0x1c, 0xbf, 0x40, 0x66, 0x33, 0xc0, 0xab, 0xab, 0xab, + 0xe8, 0xf3, 0x02, 0xeb, 0xbb, 0x24, 0xbf, 0x88, 0x86, 0x0a, 0x02, 0xc6, 0x86, 0x89, 0x02, 0x01, + 0xeb, 0xb6, 0xeb, 0x79, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x3c, 0xf6, 0x86, 0x69, 0x02, 0x01, + 0x74, 0x19, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x12, 0x83, 0xbe, 0xc6, 0x02, 0x00, 0x75, 0x0b, + 0x80, 0x7e, 0x08, 0x00, 0x75, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x08, 0xc6, 0x86, 0x69, 0x02, 0x01, + 0xc6, 0x86, 0x6a, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, + 0xf2, 0x01, 0xab, 0xab, 0xab, 0xeb, 0x4b, 0xf6, 0x86, 0x6c, 0x02, 0x01, 0x74, 0x44, 0xf6, 0x86, + 0x6b, 0x02, 0x01, 0x75, 0x0d, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xbe, 0x9d, 0x4c, 0xe8, 0x20, 0xce, + 0xeb, 0x30, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x0c, 0x83, + 0xbe, 0xc6, 0x02, 0x00, 0x75, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x08, 0xeb, 0x15, 0xf6, 0x86, 0x58, + 0x02, 0x01, 0x74, 0x0e, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xf2, 0x01, 0xa5, + 0xa5, 0xa5, 0xc3, 0x53, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x16, 0x03, 0x8c, + 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, 0x54, 0x8b, 0x44, 0xfe, 0x89, 0x45, 0xfe, + 0xf3, 0xa5, 0xbb, 0x02, 0x05, 0xb9, 0x0b, 0x00, 0x8d, 0xb6, 0x16, 0x03, 0xad, 0x8b, 0x14, 0x8b, + 0x74, 0x02, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x15, 0x89, 0x75, 0x02, 0x83, 0xc3, 0x02, 0xe2, + 0xf1, 0xf6, 0x86, 0xaf, 0x02, 0x01, 0x75, 0x26, 0x8b, 0xb6, 0x2f, 0x06, 0x8d, 0xbe, 0xee, 0x01, + 0xa5, 0xa5, 0x80, 0x7e, 0x06, 0x08, 0x76, 0x0b, 0xc7, 0x86, 0xc8, 0x02, 0x04, 0x00, 0xe8, 0x68, + 0xee, 0xeb, 0x0b, 0xc6, 0x86, 0x88, 0x02, 0x01, 0xc7, 0x86, 0xc8, 0x02, 0x01, 0x00, 0x5b, 0xc3, + 0xb8, 0x80, 0x0a, 0xf6, 0x86, 0xab, 0x02, 0x01, 0x75, 0x45, 0xf6, 0x86, 0xad, 0x02, 0x01, 0x75, + 0x3e, 0xf7, 0x86, 0xf6, 0x00, 0x10, 0x00, 0x75, 0x36, 0xf7, 0x07, 0x82, 0x00, 0x74, 0x2f, 0xc7, + 0x86, 0x2e, 0x02, 0x07, 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x01, + 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf6, 0x86, 0xac, 0x02, 0x01, 0x75, 0x0c, 0x80, 0x7e, 0x06, 0x08, + 0x72, 0x0c, 0x80, 0x7e, 0x06, 0x0e, 0x77, 0x06, 0xb8, 0x0a, 0x00, 0xe8, 0x41, 0xdf, 0xc3, 0x89, + 0x86, 0xee, 0x02, 0xe9, 0x1b, 0xea, 0xf7, 0x07, 0x02, 0x00, 0x74, 0x0f, 0x80, 0x7e, 0x06, 0x0c, + 0x75, 0x09, 0xc6, 0x86, 0x64, 0x02, 0x01, 0xc6, 0x46, 0x07, 0x0e, 0x8b, 0x86, 0x18, 0x02, 0x86, + 0xe0, 0x8b, 0xb6, 0x54, 0x06, 0x0b, 0xf6, 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x18, 0x02, + 0x86, 0xe0, 0x89, 0x86, 0xea, 0x02, 0x8b, 0xb6, 0x3b, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, + 0xc4, 0x89, 0x86, 0x10, 0x02, 0x8b, 0xb6, 0x40, 0x06, 0x0b, 0xf6, 0x74, 0x05, 0x8b, 0xc6, 0xe8, + 0xa2, 0x00, 0x8b, 0xb6, 0x45, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x0c, + 0x02, 0x8b, 0xb6, 0x4a, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89, 0x86, 0xfc, 0x01, + 0x8b, 0xb6, 0x4f, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89, 0x86, 0xfa, 0x01, 0x8b, + 0x07, 0xa9, 0x02, 0x00, 0x75, 0x07, 0xa8, 0x28, 0x74, 0x03, 0xe9, 0x71, 0xff, 0xc7, 0x86, 0xee, + 0x02, 0x00, 0x01, 0xe9, 0x8b, 0xe9, 0xc3, 0xf7, 0x07, 0x02, 0x02, 0x74, 0xf9, 0x8b, 0x86, 0x18, + 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0x69, 0x06, 0x0b, 0xf6, 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, + 0x18, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xea, 0x02, 0x8b, 0xb6, 0x5a, 0x06, 0x0b, 0xf6, 0x74, 0x07, + 0xad, 0x86, 0xc4, 0x89, 0x86, 0x10, 0x02, 0x8b, 0xb6, 0x5f, 0x06, 0x0b, 0xf6, 0x74, 0x05, 0x8b, + 0xc6, 0xe8, 0x20, 0x00, 0x8b, 0xb6, 0x64, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xe0, 0x89, + 0x86, 0x0c, 0x02, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x96, 0xc6, 0x86, 0x64, 0x02, 0x01, 0xc6, 0x46, + 0x07, 0x0e, 0xeb, 0x8b, 0x53, 0x57, 0x8c, 0xdb, 0x8e, 0xc3, 0xbb, 0x18, 0x05, 0xb9, 0x0a, 0x00, + 0x8b, 0xf0, 0xad, 0x8b, 0x34, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x35, 0x83, 0xc3, 0x02, 0xe2, + 0xf4, 0x5f, 0x5b, 0xc3, 0x68, 0xe4, 0x2e, 0xeb, 0x08, 0x68, 0x4c, 0x2f, 0xeb, 0x03, 0x68, 0x8e, + 0x2f, 0xf7, 0x07, 0x82, 0x02, 0x74, 0x1c, 0x8b, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0xa0, + 0x06, 0x0b, 0xf6, 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x89, 0x86, + 0xea, 0x02, 0xc3, 0x83, 0xc4, 0x02, 0xc3, 0x8b, 0x07, 0xf6, 0x86, 0x63, 0x01, 0x01, 0x74, 0x1e, + 0xa9, 0x00, 0x20, 0x74, 0x40, 0x56, 0x57, 0xe8, 0xef, 0xc9, 0xc7, 0x44, 0x02, 0x02, 0x00, 0x8d, + 0x7e, 0x16, 0xe8, 0x02, 0xca, 0xbe, 0x91, 0x4c, 0xe8, 0x77, 0xcc, 0x5f, 0x5e, 0xc3, 0x80, 0x7e, + 0x06, 0x08, 0x75, 0x21, 0xa9, 0x00, 0x10, 0x74, 0x1c, 0xa9, 0x3c, 0x00, 0x75, 0x17, 0xff, 0x86, + 0xd2, 0x02, 0xff, 0x86, 0xd0, 0x02, 0x83, 0xbe, 0xd0, 0x02, 0x02, 0x72, 0x05, 0xc6, 0x46, 0x07, + 0x0a, 0xc3, 0xe8, 0x20, 0xea, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8b, 0x3e, 0x2c, 0x5f, + 0x83, 0xc7, 0x06, 0x81, 0xff, 0x46, 0x66, 0x72, 0x03, 0xbf, 0x40, 0x66, 0xab, 0xab, 0xab, 0xf6, + 0x86, 0xd0, 0x01, 0x01, 0x74, 0x18, 0xc6, 0x86, 0xcf, 0x01, 0x01, 0xe8, 0x8b, 0xc9, 0xc7, 0x44, + 0x02, 0x05, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x9e, 0xc9, 0xc6, 0x86, 0xce, 0x01, 0x00, 0xc3, 0xf7, + 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x06, 0xbe, 0x5d, 0x4d, 0xe8, 0x53, 0xcb, 0x8d, 0xb6, 0xc4, + 0x15, 0x8e, 0x46, 0x02, 0x8a, 0x1c, 0xf6, 0xc3, 0x80, 0x75, 0x0d, 0x80, 0xfb, 0x10, 0x77, 0x14, + 0x32, 0xff, 0xd1, 0xe3, 0xff, 0xa7, 0xe0, 0x04, 0xc7, 0x86, 0x0a, 0x01, 0x00, 0x00, 0xc3, 0xb8, + 0x00, 0x80, 0xeb, 0x08, 0xb8, 0x00, 0x80, 0xeb, 0x03, 0xb8, 0x00, 0x20, 0x8d, 0xb6, 0xc4, 0x15, + 0x89, 0x44, 0x02, 0x80, 0x0c, 0x80, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0xc7, 0x86, 0x0a, 0x01, 0x00, + 0x00, 0x26, 0xc7, 0x06, 0x30, 0x00, 0x08, 0x00, 0xc3, 0xeb, 0xe1, 0xb8, 0x04, 0x00, 0x80, 0xbe, + 0x06, 0x01, 0x01, 0x75, 0xf4, 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x74, 0xea, 0xc6, + 0x86, 0x08, 0x01, 0x01, 0xc6, 0x86, 0xd1, 0x01, 0x00, 0xc6, 0x86, 0x09, 0x01, 0x00, 0x8b, 0x86, + 0xf8, 0x00, 0x89, 0x86, 0xf6, 0x00, 0x8d, 0xb6, 0xce, 0x15, 0xb8, 0x03, 0x00, 0xf6, 0x04, 0x80, + 0x75, 0xc7, 0x33, 0xc0, 0x39, 0x04, 0x75, 0x1e, 0x39, 0x44, 0x02, 0x75, 0x19, 0x39, 0x44, 0x04, + 0x75, 0x14, 0x8b, 0x86, 0x00, 0x01, 0x89, 0x04, 0x8b, 0x86, 0x02, 0x01, 0x89, 0x44, 0x02, 0x8b, + 0x86, 0x04, 0x01, 0x89, 0x44, 0x04, 0xad, 0x8b, 0x14, 0x8b, 0x74, 0x02, 0x89, 0x86, 0xd4, 0x01, + 0x89, 0x96, 0xd6, 0x01, 0x89, 0xb6, 0xd8, 0x01, 0x8e, 0x46, 0x02, 0x50, 0xe8, 0x8e, 0xc7, 0x26, + 0xa3, 0x5e, 0x00, 0x8b, 0xc2, 0xe8, 0x85, 0xc7, 0x26, 0xa3, 0x60, 0x00, 0x8b, 0xc6, 0xe8, 0x7c, + 0xc7, 0x26, 0xa3, 0x62, 0x00, 0x58, 0xbb, 0x30, 0x05, 0xb9, 0x16, 0x00, 0x1e, 0x07, 0x8b, 0x3f, + 0x03, 0xfd, 0xab, 0x89, 0x15, 0x89, 0x75, 0x02, 0x83, 0xc3, 0x02, 0xe2, 0xf1, 0xbb, 0x2c, 0x05, + 0x8d, 0x96, 0xdc, 0x15, 0xb8, 0x02, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0x8b, 0xf2, 0xb9, 0x09, 0x00, + 0xf3, 0xa5, 0x83, 0xc3, 0x02, 0x48, 0x75, 0xef, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x06, + 0xbe, 0x5d, 0x4d, 0xe8, 0x3a, 0xca, 0x8d, 0xb6, 0xc4, 0x15, 0x8b, 0x44, 0x08, 0x89, 0x86, 0x12, + 0x01, 0x89, 0x86, 0x14, 0x01, 0xf7, 0x86, 0x12, 0x01, 0x01, 0x00, 0x74, 0x08, 0xc7, 0x06, 0x8f, + 0x4c, 0x58, 0x02, 0xeb, 0x06, 0xc7, 0x06, 0x8f, 0x4c, 0x08, 0x07, 0x8e, 0x46, 0x02, 0x26, 0x8b, + 0x1e, 0x68, 0x00, 0x81, 0xe3, 0xff, 0xf4, 0xa9, 0x04, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x08, + 0xa9, 0x02, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x03, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x68, + 0x00, 0x8d, 0xb6, 0xd8, 0x15, 0xe8, 0x64, 0x02, 0x8d, 0xb6, 0xd4, 0x15, 0xe8, 0x23, 0x00, 0xf6, + 0x06, 0x23, 0x5f, 0x01, 0x74, 0x03, 0xe8, 0x87, 0x16, 0xc6, 0x86, 0x07, 0x01, 0x01, 0xe8, 0xd0, + 0x03, 0xe8, 0xc7, 0x05, 0xe9, 0xa2, 0xfe, 0x56, 0x83, 0xc6, 0x08, 0xe8, 0x04, 0x00, 0x5e, 0xe9, + 0x97, 0xfe, 0x8e, 0x46, 0x02, 0xb8, 0xc0, 0x00, 0xe8, 0xb2, 0xc6, 0x26, 0xa3, 0x7a, 0x00, 0x8b, + 0x04, 0x0d, 0x80, 0x00, 0x89, 0x86, 0xda, 0x01, 0xe8, 0xa2, 0xc6, 0x26, 0xa3, 0x7c, 0x00, 0x8b, + 0x44, 0x02, 0x89, 0x86, 0xdc, 0x01, 0xe8, 0x94, 0xc6, 0x26, 0xa3, 0x7e, 0x00, 0xc3, 0x83, 0x8e, + 0x1e, 0x01, 0x01, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x8a, 0x46, 0x06, 0x3c, 0x00, 0x74, 0x46, 0x3c, + 0x10, 0x75, 0x03, 0xe9, 0x53, 0xfe, 0x3c, 0x12, 0x74, 0x3b, 0x3c, 0x4c, 0x75, 0x03, 0xe9, 0x48, + 0xfe, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x72, 0x1a, 0x3c, 0x48, 0x74, 0x0f, 0xf6, 0x86, 0x72, 0x02, + 0x01, 0x74, 0x17, 0x3c, 0x44, 0x74, 0x04, 0x3c, 0x46, 0x75, 0x28, 0xc6, 0x46, 0x07, 0x4c, 0xe9, + 0x27, 0xfe, 0x3c, 0x0e, 0x74, 0x17, 0x3c, 0x48, 0x74, 0x19, 0xe8, 0x1c, 0xfe, 0xb8, 0x0f, 0x00, + 0xe8, 0x4c, 0xdb, 0xeb, 0x35, 0xe8, 0x11, 0xfe, 0xe8, 0x04, 0x04, 0xeb, 0x2d, 0xc6, 0x46, 0x07, + 0x10, 0xeb, 0x20, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, + 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0x35, 0x16, 0xc6, 0x46, 0x07, + 0x12, 0xeb, 0x00, 0xc6, 0x46, 0x09, 0x1e, 0xe9, 0xdf, 0xfd, 0xc3, 0xc6, 0x86, 0x06, 0x01, 0x00, + 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03, 0xe9, 0xcf, 0xfd, 0x8b, 0x44, 0x08, + 0x89, 0x86, 0xf4, 0x00, 0x8b, 0x44, 0x0a, 0xa9, 0x00, 0x10, 0x74, 0x03, 0x0d, 0x00, 0x01, 0x89, + 0x86, 0xf6, 0x00, 0x89, 0x86, 0xf8, 0x00, 0x8b, 0x44, 0x12, 0x0b, 0xc0, 0x75, 0x21, 0xf7, 0x86, + 0xf4, 0x00, 0x00, 0x40, 0x74, 0x0b, 0xb8, 0x1f, 0x47, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x12, 0x75, + 0x0e, 0xb8, 0x18, 0x47, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x01, 0x75, 0x03, 0xb8, 0xc6, 0x11, 0x89, + 0x86, 0xfa, 0x00, 0xe8, 0xab, 0x02, 0x8d, 0xbe, 0x56, 0x04, 0x8b, 0x44, 0x0c, 0x89, 0x05, 0x89, + 0x86, 0x00, 0x01, 0x8b, 0x44, 0x0e, 0x89, 0x45, 0x02, 0x89, 0x86, 0x02, 0x01, 0x8b, 0x44, 0x10, + 0x89, 0x45, 0x04, 0x89, 0x86, 0x04, 0x01, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x21, 0x8b, 0x44, + 0x0c, 0x89, 0x86, 0xbc, 0x03, 0x89, 0x86, 0xc2, 0x03, 0x8b, 0x44, 0x0e, 0x89, 0x86, 0xbe, 0x03, + 0x89, 0x86, 0xc4, 0x03, 0x8b, 0x44, 0x10, 0x89, 0x86, 0xc0, 0x03, 0x89, 0x86, 0xc6, 0x03, 0x8e, + 0x46, 0x02, 0x8b, 0x86, 0xfa, 0x00, 0x26, 0xa3, 0x52, 0x00, 0x8b, 0x44, 0x14, 0x26, 0xa3, 0x6a, + 0x00, 0x8b, 0x44, 0x16, 0x25, 0xff, 0xf4, 0x83, 0xc8, 0x30, 0x26, 0xa3, 0x68, 0x00, 0x8d, 0x1e, + 0x72, 0x05, 0x8b, 0x44, 0x18, 0xc1, 0xe8, 0x04, 0x83, 0xe0, 0x0f, 0xd7, 0xa2, 0x87, 0x03, 0x8b, + 0x44, 0x18, 0xc1, 0xe8, 0x0c, 0x83, 0xe0, 0x0f, 0xd7, 0xa2, 0x88, 0x03, 0x33, 0xc0, 0xd7, 0xa2, + 0x89, 0x03, 0x06, 0x51, 0x8c, 0xd8, 0x8e, 0xc0, 0xbe, 0x80, 0x03, 0x8d, 0xbe, 0x1a, 0x04, 0xb9, + 0x05, 0x00, 0xf3, 0xa5, 0x59, 0x07, 0x8b, 0x86, 0xf4, 0x00, 0x25, 0xff, 0xfe, 0xc1, 0xe8, 0x08, + 0x89, 0x86, 0x28, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x04, 0x00, 0x74, 0x0f, 0xf6, 0x06, 0x23, 0x5f, + 0x01, 0x75, 0x08, 0xc6, 0x06, 0x23, 0x5f, 0x01, 0xe8, 0xd0, 0x11, 0x80, 0xbe, 0x62, 0x01, 0x01, + 0x75, 0x01, 0xc3, 0xc6, 0x86, 0x06, 0x01, 0x01, 0xe9, 0xae, 0xfc, 0x56, 0x8c, 0xd8, 0x8e, 0xc0, + 0x8d, 0x7c, 0x08, 0x8d, 0xb6, 0xdc, 0x02, 0xb9, 0x05, 0x00, 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, + 0xdc, 0x02, 0x33, 0xc0, 0x8b, 0xca, 0xf3, 0xab, 0x81, 0xa6, 0x0a, 0x02, 0x7f, 0xdf, 0x5e, 0xe9, + 0x87, 0xfc, 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6, 0x40, 0x02, 0xb9, 0x0c, + 0x00, 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, 0x40, 0x02, 0x33, 0xc0, 0x8b, 0xca, 0xf3, 0xab, 0x5e, + 0xe9, 0x66, 0xfc, 0x83, 0xc6, 0x08, 0xe8, 0x03, 0x00, 0xe9, 0x5d, 0xfc, 0x06, 0x8e, 0x46, 0x02, + 0x8b, 0x04, 0x89, 0x86, 0xde, 0x01, 0xe8, 0x74, 0xc4, 0x26, 0xa3, 0x66, 0x00, 0x8b, 0x44, 0x02, + 0x23, 0x86, 0xfc, 0x01, 0xe8, 0x66, 0xc4, 0x25, 0xff, 0x7f, 0x26, 0x8b, 0x0e, 0x64, 0x00, 0x81, + 0xe1, 0x00, 0x80, 0x0b, 0xc1, 0x26, 0xa3, 0x64, 0x00, 0xe8, 0x51, 0xc4, 0x89, 0x86, 0xe0, 0x01, + 0x07, 0xc3, 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03, 0xe9, 0x1d, 0xfc, 0xc6, + 0x86, 0x62, 0x01, 0x01, 0xe8, 0x34, 0xfe, 0xc6, 0x86, 0x62, 0x01, 0x00, 0xc6, 0x86, 0x06, 0x01, + 0x01, 0xe9, 0x05, 0xfc, 0xb8, 0x11, 0x00, 0xc6, 0x86, 0x62, 0x01, 0x00, 0xe9, 0xfd, 0xfb, 0xc3, + 0x8b, 0xd8, 0x26, 0x8b, 0x04, 0x50, 0x33, 0xc0, 0x50, 0x23, 0xc3, 0x8b, 0xc8, 0x26, 0x89, 0x04, + 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58, 0x75, 0x3c, 0x05, 0x55, 0x55, 0x73, 0xe9, 0xb8, + 0x01, 0x00, 0x50, 0x23, 0xc3, 0x8b, 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, + 0xc1, 0x58, 0x75, 0x22, 0xd1, 0xc0, 0x73, 0xea, 0xf7, 0xd0, 0x50, 0x23, 0xc3, 0x8b, 0xc8, 0x26, + 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58, 0x75, 0x0a, 0xd1, 0xc0, 0x72, 0xea, + 0xf8, 0x58, 0x26, 0x89, 0x04, 0xc3, 0xf9, 0xeb, 0xf8, 0x8b, 0x44, 0x08, 0x25, 0xff, 0x7b, 0x89, + 0x86, 0x12, 0x01, 0x89, 0x86, 0x14, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x68, 0x00, 0x81, + 0xe3, 0xff, 0xf4, 0xa9, 0x04, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74, + 0x04, 0x81, 0xcb, 0x00, 0x03, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x68, 0x00, 0xe9, 0x69, 0xfb, + 0xe9, 0x61, 0xfb, 0x8b, 0x44, 0x08, 0x89, 0x86, 0x30, 0x01, 0xbe, 0x4b, 0x4d, 0xe8, 0x80, 0xc6, + 0xe9, 0x56, 0xfb, 0x8b, 0x44, 0x08, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x6a, 0x00, 0xe9, 0x49, 0xfb, + 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x13, 0x80, 0x7e, 0x08, 0x00, + 0x74, 0x06, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x07, 0x8d, 0x5c, 0x08, 0xe8, 0x8a, 0xe8, 0xc3, 0xb8, + 0x00, 0x10, 0xe9, 0x27, 0xfb, 0xb8, 0x04, 0x00, 0xf6, 0x86, 0x07, 0x01, 0x01, 0x74, 0x1e, 0x8e, + 0x46, 0x02, 0x26, 0xa1, 0x68, 0x00, 0x8b, 0x5c, 0x08, 0x81, 0xe3, 0xff, 0xf4, 0x25, 0x00, 0x0b, + 0x0b, 0xd8, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x68, 0x00, 0xb8, 0x00, 0x20, 0xe9, 0xfc, 0xfa, + 0xb8, 0x05, 0x00, 0xf6, 0x86, 0x07, 0x01, 0x01, 0x75, 0x11, 0xfa, 0xe8, 0xe6, 0xc7, 0xfa, 0xe8, + 0xe7, 0xfa, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x32, 0x00, 0x02, 0xe9, 0xde, 0xfa, 0xe9, 0xd8, + 0xfa, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x40, 0x74, 0x0d, 0xc6, 0x86, 0xfe, 0x00, 0x02, 0xf7, 0x86, + 0xf6, 0x00, 0x00, 0x12, 0x75, 0x12, 0xc6, 0x86, 0xfe, 0x00, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, + 0x11, 0x75, 0x05, 0xc6, 0x86, 0xfe, 0x00, 0x00, 0xc3, 0x8b, 0xd0, 0xb8, 0x01, 0x00, 0xe9, 0xa3, + 0x01, 0xc3, 0x80, 0xbe, 0xb2, 0x02, 0x01, 0x74, 0x0e, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0xf1, + 0x80, 0xbe, 0x09, 0x01, 0x01, 0x74, 0xea, 0xc6, 0x86, 0x09, 0x01, 0x01, 0xc6, 0x86, 0xb2, 0x02, + 0x00, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x74, 0x0c, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x08, 0x0d, + 0x00, 0x08, 0xeb, 0x03, 0x0d, 0x00, 0x01, 0x80, 0xbe, 0xaa, 0x02, 0x01, 0x74, 0x0a, 0x80, 0xbe, + 0xac, 0x02, 0x01, 0x74, 0x03, 0x0d, 0x00, 0x04, 0x80, 0xbe, 0xaa, 0x02, 0x01, 0x74, 0x0a, 0x80, + 0xbe, 0xab, 0x02, 0x01, 0x74, 0x03, 0x0d, 0x00, 0x02, 0xf7, 0x86, 0xa6, 0x02, 0x01, 0x00, 0x74, + 0x03, 0x0d, 0x00, 0x08, 0xa9, 0x00, 0x80, 0x74, 0x1d, 0xc7, 0x86, 0x2e, 0x01, 0x02, 0x00, 0xf6, + 0x86, 0x2c, 0x01, 0x01, 0x74, 0x1d, 0x53, 0xbb, 0x40, 0x60, 0x8e, 0xc3, 0x26, 0x81, 0x0e, 0x32, + 0x00, 0x00, 0x02, 0x5b, 0xeb, 0x0d, 0x8a, 0x56, 0x06, 0xd0, 0xe2, 0xd0, 0xe2, 0xd0, 0xe2, 0x24, + 0x0f, 0x0a, 0xc2, 0x89, 0x86, 0x38, 0x02, 0x8b, 0xd0, 0xb8, 0x02, 0x00, 0xe9, 0x92, 0x00, 0x8b, + 0x96, 0x1e, 0x01, 0x8b, 0x86, 0x12, 0x01, 0xa9, 0x00, 0x02, 0x74, 0x06, 0xf7, 0xc2, 0x05, 0x80, + 0x74, 0x0e, 0xc6, 0x86, 0x07, 0x01, 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0xca, 0x80, 0x00, + 0x33, 0xc0, 0x89, 0x86, 0x1e, 0x01, 0x89, 0x96, 0x20, 0x01, 0xc7, 0x86, 0x38, 0x02, 0x00, 0x00, + 0xf7, 0xc2, 0x01, 0x00, 0x75, 0x22, 0x83, 0xbe, 0x2e, 0x01, 0x03, 0x74, 0x1b, 0xc7, 0x86, 0x2e, + 0x01, 0x03, 0x00, 0xf6, 0x86, 0x2c, 0x01, 0x01, 0x74, 0x0e, 0x53, 0xbb, 0x40, 0x60, 0x8e, 0xc3, + 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x02, 0x5b, 0xb8, 0x03, 0x00, 0xeb, 0x34, 0x3b, 0xc0, 0x74, + 0x00, 0x8b, 0xd0, 0xb8, 0x04, 0x00, 0xeb, 0x29, 0xc3, 0xc6, 0x86, 0xce, 0x01, 0x00, 0xc6, 0x86, + 0xcf, 0x01, 0x00, 0x55, 0x33, 0xed, 0xbe, 0x1c, 0x5e, 0xe8, 0xb4, 0xc4, 0x5d, 0xb8, 0x05, 0x00, + 0xeb, 0x0f, 0xb8, 0x06, 0x00, 0xeb, 0x0a, 0xb8, 0x07, 0x00, 0xeb, 0x05, 0xb8, 0x08, 0x00, 0xeb, + 0x00, 0x8b, 0xb6, 0x60, 0x01, 0x3b, 0xb6, 0x5e, 0x01, 0x75, 0x0a, 0xf7, 0x86, 0xb0, 0x15, 0x00, + 0x80, 0x74, 0x02, 0xeb, 0x5f, 0x8b, 0x8e, 0x5e, 0x01, 0x41, 0x80, 0xe1, 0x07, 0x3b, 0xf1, 0x75, + 0x20, 0x46, 0x83, 0xe6, 0x07, 0x89, 0xb6, 0x60, 0x01, 0x51, 0x8b, 0xce, 0xd1, 0xe1, 0xd1, 0xe1, + 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x8b, 0x0c, 0x83, 0xf9, 0x05, 0x74, 0x03, 0x0d, 0x00, 0x01, + 0x59, 0x83, 0xf8, 0x04, 0x75, 0x1a, 0x51, 0xb9, 0x08, 0x00, 0x8d, 0xb6, 0x3e, 0x01, 0x39, 0x04, + 0x74, 0x08, 0x83, 0xc6, 0x04, 0xe2, 0xf7, 0x59, 0xeb, 0x06, 0x89, 0x54, 0x02, 0x59, 0xeb, 0x13, + 0x89, 0x8e, 0x5e, 0x01, 0xd1, 0xe1, 0xd1, 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x89, 0x04, + 0x89, 0x54, 0x02, 0xc3, 0x8d, 0xb6, 0xb0, 0x15, 0x89, 0x54, 0x06, 0xc7, 0x44, 0x04, 0x08, 0x00, + 0x3c, 0x05, 0x75, 0x05, 0xc7, 0x44, 0x04, 0x06, 0x00, 0x25, 0xff, 0x7f, 0x89, 0x04, 0xb8, 0x40, + 0x60, 0x8e, 0xc0, 0x26, 0xc7, 0x06, 0x30, 0x00, 0x00, 0x20, 0xc3, 0x8b, 0x86, 0x14, 0x01, 0x89, + 0x86, 0x12, 0x01, 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x08, 0x1e, 0xc6, 0x46, 0x0b, 0x00, 0xc7, + 0x86, 0x28, 0x01, 0x00, 0x00, 0xc7, 0x86, 0x2a, 0x01, 0x00, 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, + 0xc0, 0x8d, 0xbe, 0xe4, 0x01, 0xb9, 0x2b, 0x00, 0xf3, 0xab, 0xc7, 0x86, 0x2a, 0x02, 0xff, 0xff, + 0x8e, 0x46, 0x02, 0xb8, 0x02, 0x00, 0xf7, 0x86, 0xf4, 0x00, 0x80, 0x00, 0x74, 0x03, 0x83, 0xc8, + 0x01, 0xf7, 0x86, 0xf4, 0x00, 0x40, 0x00, 0x74, 0x03, 0x83, 0xc8, 0x04, 0xf7, 0x86, 0xf4, 0x00, + 0x20, 0x00, 0x74, 0x03, 0x83, 0xc8, 0x08, 0x26, 0xa3, 0x4e, 0x00, 0xb0, 0x02, 0xe8, 0x0e, 0xc8, + 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x20, 0x74, 0x28, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x74, 0x0c, + 0xb8, 0x05, 0x00, 0xe8, 0x27, 0x00, 0xc6, 0x46, 0x07, 0x42, 0xeb, 0x20, 0xf7, 0x86, 0xf6, 0x00, + 0x80, 0x00, 0x74, 0x0c, 0xb8, 0x05, 0x00, 0xe8, 0x13, 0x00, 0xc6, 0x46, 0x07, 0x42, 0xeb, 0x0c, + 0xb8, 0x02, 0x00, 0xe8, 0x07, 0x00, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x00, 0xc3, 0x50, 0xb0, 0x00, + 0x88, 0x86, 0xaa, 0x02, 0x88, 0x86, 0xab, 0x02, 0x88, 0x86, 0xac, 0x02, 0x88, 0x86, 0xad, 0x02, + 0x88, 0x86, 0xaf, 0x02, 0x88, 0x86, 0xae, 0x02, 0x58, 0x9c, 0xfa, 0x83, 0xf8, 0x02, 0x74, 0x13, + 0x83, 0xf8, 0x05, 0x74, 0x0c, 0xc7, 0x46, 0x12, 0x5a, 0x21, 0xc7, 0x46, 0x14, 0x5a, 0x21, 0xeb, + 0x42, 0xeb, 0x21, 0xc6, 0x86, 0xaa, 0x02, 0x01, 0xc6, 0x86, 0xae, 0x02, 0x01, 0xc6, 0x86, 0xaf, + 0x02, 0x00, 0xc7, 0x46, 0x12, 0x62, 0x37, 0xc7, 0x46, 0x14, 0x89, 0x34, 0xc7, 0x86, 0xba, 0x01, + 0x2c, 0x00, 0xeb, 0x1f, 0xc6, 0x86, 0xac, 0x02, 0x01, 0xc6, 0x86, 0xae, 0x02, 0x00, 0xc6, 0x86, + 0xaf, 0x02, 0x01, 0xc7, 0x46, 0x12, 0x66, 0x37, 0xc7, 0x46, 0x14, 0x8d, 0x34, 0xc7, 0x86, 0xba, + 0x01, 0x30, 0x00, 0x0e, 0xe8, 0x02, 0x00, 0xeb, 0x01, 0xcf, 0xc3, 0x8c, 0x00, 0x76, 0x4d, 0xbc, + 0x02, 0x96, 0x00, 0xac, 0x4d, 0x14, 0x00, 0x96, 0x00, 0xc0, 0x4d, 0x08, 0x07, 0x96, 0x00, 0xfe, + 0x4d, 0x6e, 0x00, 0x78, 0x00, 0x64, 0x50, 0x00, 0x00, 0x6e, 0x00, 0xc0, 0x4e, 0xf4, 0x01, 0x6e, + 0x00, 0xf0, 0x4e, 0x08, 0x07, 0x6e, 0x00, 0x1c, 0x52, 0x02, 0x00, 0xaa, 0x00, 0x38, 0x4f, 0xfa, + 0x00, 0x8c, 0x00, 0x88, 0x4f, 0x02, 0x00, 0x8c, 0x00, 0x8a, 0x4e, 0x3c, 0x00, 0x78, 0x00, 0xf4, + 0x4f, 0x04, 0x01, 0x96, 0x00, 0x20, 0x50, 0x64, 0x00, 0x96, 0x00, 0x44, 0x50, 0xdc, 0x05, 0xbe, + 0x00, 0x72, 0x51, 0xf4, 0x01, 0xbe, 0x00, 0x72, 0x51, 0x32, 0x00, 0xa0, 0x00, 0xee, 0x52, 0xf4, + 0x01, 0xbe, 0x00, 0x9c, 0x51, 0xf4, 0x01, 0x82, 0x00, 0xc0, 0x55, 0x19, 0x00, 0x6e, 0x00, 0xd4, + 0x52, 0x14, 0x00, 0x78, 0x00, 0xb0, 0x51, 0xc4, 0x09, 0x6e, 0x00, 0xc4, 0x51, 0x02, 0x00, 0xd2, + 0x00, 0x4a, 0x56, 0x2c, 0x01, 0x78, 0x00, 0xc6, 0x54, 0xf0, 0x00, 0x6e, 0x00, 0x46, 0x53, 0x32, + 0x00, 0xa0, 0x00, 0xa8, 0x53, 0xbc, 0x02, 0x6e, 0x00, 0xba, 0x53, 0x08, 0x07, 0x6e, 0x00, 0xc8, + 0x53, 0xe8, 0x03, 0x6e, 0x00, 0xda, 0x53, 0x14, 0x00, 0x96, 0x00, 0xe6, 0x53, 0x64, 0x00, 0xa0, + 0x00, 0xd4, 0x54, 0xf4, 0x01, 0xc8, 0x00, 0x72, 0x4f, 0x02, 0x00, 0x6e, 0x00, 0x16, 0x54, 0x04, + 0x00, 0x8c, 0x00, 0x9e, 0x54, 0x14, 0x00, 0x6e, 0x00, 0x84, 0x56, 0x84, 0x03, 0x96, 0x00, 0x92, + 0x56, 0x02, 0x00, 0x82, 0x00, 0xc6, 0x52, 0x14, 0x00, 0xb4, 0x00, 0xbe, 0x56, 0x02, 0x00, 0xdc, + 0x00, 0x7a, 0x56, 0x64, 0x00, 0xa0, 0x00, 0xe5, 0x55, 0x64, 0x00, 0xc8, 0x00, 0xfc, 0x55, 0x03, + 0x00, 0xd2, 0x00, 0x4e, 0x56, 0xf4, 0x01, 0xd2, 0x00, 0x60, 0x56, 0x4c, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x80, 0xbe, 0x58, 0x02, 0x01, 0x75, + 0x28, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x22, 0xf6, 0x86, 0x69, 0x02, 0x01, 0x74, 0x1c, 0xe8, 0xee, + 0xdf, 0xbe, 0x67, 0x4c, 0xe8, 0xb9, 0xc1, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0xf2, + 0x01, 0xab, 0xab, 0xab, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc3, 0xe8, 0xa6, 0xe2, 0xeb, 0xdf, 0x90, + 0x8a, 0x46, 0x08, 0x3c, 0x0a, 0x75, 0x0b, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, + 0x09, 0x04, 0xc3, 0x90, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x32, 0x80, 0x7e, 0x08, 0x06, 0x75, + 0x2c, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x0f, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x08, 0xb8, 0x07, + 0x00, 0xe8, 0x7b, 0xd3, 0xeb, 0x17, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x10, 0xf6, 0x86, 0x5d, + 0x02, 0x01, 0x75, 0x09, 0xc6, 0x86, 0x5d, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x08, 0xc3, 0xe9, 0x84, + 0x00, 0x90, 0x8a, 0x4e, 0x06, 0x8a, 0x56, 0x08, 0x80, 0xf9, 0x06, 0x74, 0xf1, 0x80, 0xf9, 0x08, + 0x74, 0x05, 0x80, 0xf9, 0x0a, 0x75, 0x0a, 0x80, 0xfa, 0x0c, 0x74, 0xe2, 0x80, 0xfa, 0x04, 0x74, + 0xdd, 0x80, 0xfa, 0x0c, 0x74, 0x05, 0x80, 0xfa, 0x04, 0x75, 0x59, 0xf6, 0x86, 0x67, 0x02, 0x01, + 0x74, 0x52, 0xe8, 0xed, 0x02, 0xf6, 0x86, 0x65, 0x02, 0x01, 0x74, 0x0b, 0x81, 0x8e, 0x0a, 0x02, + 0x00, 0x80, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x06, 0x81, 0x8e, 0x0a, 0x02, 0x00, + 0x50, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc6, 0x86, 0x6e, 0x02, 0x01, 0xc6, 0x86, 0x6d, 0x02, 0x01, + 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0x28, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, + 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xbe, 0x73, 0x4c, 0xe8, 0xd2, 0xc0, 0xbe, 0x9d, + 0x4c, 0xe8, 0xcc, 0xc0, 0xc3, 0xb8, 0x07, 0x00, 0xe8, 0xd4, 0xd2, 0xeb, 0xf7, 0x90, 0x80, 0xbe, + 0xaa, 0x02, 0x01, 0x74, 0x02, 0xeb, 0x2b, 0x80, 0x7e, 0x06, 0x10, 0x75, 0x06, 0xc6, 0x46, 0x07, + 0x12, 0xeb, 0x1f, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x19, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, + 0x6f, 0x02, 0x01, 0xe8, 0xda, 0xc2, 0xbe, 0xdf, 0x4c, 0xe8, 0x94, 0xc0, 0xbe, 0xe5, 0x4c, 0xe8, + 0x8e, 0xc0, 0xc3, 0x90, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x28, 0xc6, 0x86, 0x63, 0x02, 0x00, + 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x06, + 0x75, 0x11, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xe8, 0xa6, 0xc2, 0xbe, 0x9d, 0x4c, 0xe8, 0x60, 0xc0, + 0xe8, 0xe7, 0xdd, 0xc3, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x75, 0x31, 0xf7, 0x86, 0xf6, 0x00, 0x00, + 0x10, 0x75, 0x21, 0xe8, 0xea, 0xd3, 0xc6, 0x86, 0x97, 0x02, 0x00, 0x8b, 0x86, 0xf8, 0x00, 0x89, + 0x86, 0xf6, 0x00, 0xe8, 0x3b, 0xfa, 0xc6, 0x46, 0x07, 0x06, 0xc6, 0x46, 0x06, 0x06, 0xc6, 0x46, + 0x09, 0x04, 0xeb, 0x16, 0xb8, 0x0d, 0x00, 0xe8, 0x35, 0xd2, 0xeb, 0x0e, 0x3c, 0x08, 0x72, 0x0a, + 0x3c, 0x0c, 0x77, 0x06, 0xb8, 0x05, 0x00, 0xe8, 0x25, 0xd2, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x00, + 0x75, 0x33, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x75, 0x2c, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x25, + 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x03, 0x00, 0x74, 0x11, 0x8e, 0x46, 0x02, 0x26, + 0x83, 0x26, 0x54, 0x00, 0x03, 0xbe, 0x97, 0x4c, 0xe8, 0xe5, 0xbf, 0xeb, 0x08, 0xc6, 0x46, 0x09, + 0x04, 0xff, 0x86, 0x4e, 0x02, 0xc3, 0x80, 0x7e, 0x08, 0x18, 0x75, 0x0e, 0xbe, 0x21, 0x4d, 0xe8, + 0xce, 0xbf, 0xe8, 0x9d, 0x01, 0xe8, 0x52, 0xdd, 0xeb, 0x00, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x00, + 0x75, 0x35, 0x80, 0xbe, 0x5f, 0x02, 0x01, 0x75, 0x58, 0x80, 0xbe, 0x58, 0x02, 0x01, 0x74, 0x1f, + 0xe8, 0x07, 0xde, 0x80, 0x7e, 0x06, 0x0a, 0x75, 0x16, 0xc6, 0x86, 0x67, 0x02, 0x01, 0xc6, 0x46, + 0x07, 0x0c, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x40, 0x75, 0x05, 0xc6, 0x86, 0x62, 0x02, 0x01, 0xc3, + 0xbe, 0x9d, 0x4c, 0xe8, 0x8a, 0xbf, 0xc3, 0x8a, 0x46, 0x08, 0x3c, 0x04, 0x75, 0x0e, 0xbe, 0x9d, + 0x4c, 0xe8, 0x7c, 0xbf, 0xff, 0x86, 0xbc, 0x02, 0xe8, 0x39, 0xdd, 0xc3, 0x3c, 0x06, 0x75, 0xdf, + 0xf6, 0x86, 0x63, 0x02, 0x01, 0x75, 0xd8, 0xbe, 0x9d, 0x4c, 0xe8, 0x63, 0xbf, 0xe8, 0xea, 0xdc, + 0xc3, 0xc6, 0x86, 0x6a, 0x02, 0x01, 0xc3, 0x90, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x22, 0x80, + 0x7e, 0x06, 0x0c, 0x75, 0x1b, 0xff, 0x86, 0xc2, 0x02, 0x83, 0xbe, 0xc2, 0x02, 0x04, 0x77, 0x0a, + 0xbe, 0xa9, 0x4c, 0xe8, 0x3a, 0xbf, 0xe8, 0x88, 0xde, 0xc3, 0xb8, 0x09, 0x00, 0xe8, 0x3f, 0xd1, + 0xc3, 0xeb, 0xfd, 0x90, 0x80, 0x7e, 0x08, 0x02, 0x75, 0x1d, 0x80, 0xbe, 0x62, 0x02, 0x01, 0x74, + 0x08, 0xb8, 0x05, 0x00, 0xe8, 0x28, 0xd1, 0xeb, 0x0e, 0xff, 0x86, 0x4e, 0x02, 0xc6, 0x46, 0x09, + 0x04, 0xb8, 0x00, 0x01, 0xe8, 0x3d, 0xe0, 0xc3, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x16, 0x80, 0xbe, + 0x58, 0x02, 0x01, 0x74, 0x07, 0x80, 0xbe, 0x62, 0x02, 0x00, 0x74, 0x08, 0xff, 0x86, 0x4e, 0x02, + 0xc6, 0x46, 0x09, 0x04, 0xc3, 0xe9, 0xb8, 0x00, 0xf6, 0x86, 0xaf, 0x02, 0x01, 0x75, 0x07, 0xf6, + 0x86, 0x62, 0x02, 0x01, 0x74, 0xef, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x74, 0x06, 0xbe, 0x7f, + 0x4c, 0xe8, 0xcc, 0xbe, 0x8d, 0xbe, 0xdc, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x05, 0x00, 0x33, + 0xc0, 0xf3, 0xaf, 0x74, 0xd0, 0x80, 0xbe, 0xaa, 0x02, 0x01, 0x74, 0x45, 0x80, 0xbe, 0xab, 0x02, + 0x01, 0x74, 0x5f, 0x80, 0xbe, 0xac, 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe, 0xad, 0x02, 0x01, 0x74, + 0x51, 0xeb, 0x6d, 0xc7, 0x86, 0xc0, 0x02, 0x04, 0x00, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x20, 0xc6, + 0x86, 0x89, 0x02, 0x01, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x14, 0x80, 0x7e, 0x08, 0x16, 0x75, + 0x0e, 0xc6, 0x86, 0x5a, 0x02, 0x00, 0xe8, 0xe2, 0xdd, 0xc7, 0x86, 0x2e, 0x02, 0x03, 0x00, 0xeb, + 0x3f, 0xc7, 0x86, 0xc0, 0x02, 0x04, 0x00, 0xc6, 0x86, 0x5a, 0x02, 0x00, 0xe8, 0xcc, 0xdd, 0xc7, + 0x86, 0x2e, 0x02, 0x03, 0x00, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01, + 0xeb, 0x1e, 0xc7, 0x86, 0xc0, 0x02, 0x04, 0x00, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x20, 0xc6, 0x86, + 0x89, 0x02, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x75, 0x05, 0xc6, 0x86, 0x5a, 0x02, 0x00, + 0xc3, 0x90, 0xc7, 0x86, 0x36, 0x02, 0x06, 0x00, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x18, 0xb8, + 0x00, 0x02, 0x80, 0xbe, 0x65, 0x02, 0x01, 0x74, 0x37, 0xf6, 0x86, 0xac, 0x02, 0x01, 0x75, 0x07, + 0xf6, 0x86, 0xad, 0x02, 0x01, 0x74, 0x05, 0xb8, 0x00, 0x05, 0xeb, 0x24, 0xb8, 0x00, 0x04, 0xc7, + 0x86, 0x36, 0x02, 0x04, 0x00, 0x8a, 0x4e, 0x08, 0x80, 0xf9, 0x0c, 0x74, 0x13, 0xb8, 0x00, 0x04, + 0x80, 0xbe, 0x5e, 0x02, 0x01, 0x74, 0x09, 0xb8, 0x00, 0x03, 0xc7, 0x86, 0x36, 0x02, 0x07, 0x00, + 0x89, 0x86, 0x0c, 0x03, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x08, 0x74, 0x23, 0x8a, 0x46, 0x06, 0x3c, + 0x04, 0x72, 0x1c, 0x3c, 0x48, 0x74, 0x04, 0x3c, 0x0e, 0x77, 0x14, 0xf6, 0x86, 0x61, 0x02, 0x01, + 0x74, 0x0d, 0xf6, 0x86, 0x60, 0x02, 0x01, 0x74, 0x06, 0xb8, 0x0c, 0x00, 0xe8, 0xc0, 0xcf, 0xc3, + 0xc6, 0x86, 0x61, 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0xff, 0xf7, 0xe8, + 0xcc, 0x03, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x02, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x06, + 0xb8, 0x01, 0x00, 0xe8, 0x99, 0xcf, 0xc3, 0x90, 0x51, 0x52, 0x56, 0x80, 0xbe, 0xfe, 0x00, 0x02, + 0x75, 0x02, 0xeb, 0x48, 0x33, 0xd2, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xe8, 0xb2, 0xbf, 0x8d, 0xb6, + 0xa6, 0x01, 0x8d, 0xbe, 0xac, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0xc6, 0x86, 0x87, + 0x02, 0x00, 0xb0, 0x00, 0xe8, 0xb7, 0xe1, 0xc6, 0x86, 0x68, 0x01, 0x02, 0xc7, 0x86, 0x66, 0x01, + 0x20, 0x03, 0xbe, 0x91, 0x4c, 0xe8, 0x48, 0xbd, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0x8e, + 0x46, 0x02, 0x26, 0xc7, 0x06, 0x5c, 0x00, 0x00, 0x00, 0xe8, 0xd2, 0xdb, 0x5e, 0x5a, 0x59, 0xc3, + 0x80, 0x7e, 0x06, 0x02, 0x74, 0x0f, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x09, 0x80, 0x7e, 0x08, 0x08, + 0x74, 0x03, 0xe9, 0x94, 0x00, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x26, 0xf6, 0x86, 0x76, 0x02, + 0x01, 0x74, 0x0b, 0xbe, 0x91, 0x4c, 0xe8, 0x07, 0xbd, 0xe8, 0x04, 0xdf, 0xeb, 0x7b, 0xf6, 0x86, + 0x77, 0x02, 0x01, 0x74, 0x0d, 0xc6, 0x86, 0x77, 0x02, 0x00, 0xbe, 0x91, 0x4c, 0xe8, 0xf0, 0xbc, + 0xeb, 0x67, 0xfe, 0x8e, 0x68, 0x01, 0x75, 0x05, 0xe8, 0xd1, 0x04, 0xeb, 0x5c, 0xbe, 0x91, 0x4c, + 0xe8, 0xdd, 0xbc, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x08, 0xb9, 0x5a, 0x00, 0xe8, 0xd1, 0xdb, + 0xeb, 0x47, 0xe8, 0xc2, 0xb7, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c, 0x00, 0x00, 0x01, 0x90, + 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x4c, 0x00, 0xff, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, + 0x5c, 0x00, 0x00, 0x00, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6, 0x86, 0x8a, 0x02, 0x01, + 0x83, 0xbe, 0x66, 0x01, 0x01, 0x75, 0x07, 0xe8, 0x1b, 0xdb, 0xeb, 0x0d, 0xeb, 0x05, 0xe8, 0x2d, + 0xdb, 0xeb, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0x96, 0xce, 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75, 0x07, + 0xf6, 0x86, 0x76, 0x02, 0x01, 0x75, 0xec, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x80, 0x00, 0x74, 0x10, + 0x80, 0x7e, 0x06, 0x14, 0x75, 0x0a, 0xb8, 0x05, 0x00, 0xe8, 0x01, 0xf9, 0xc6, 0x46, 0x07, 0x42, + 0xc3, 0x90, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x4e, 0xc6, 0x86, 0x70, 0x02, 0x00, 0x80, 0x7e, + 0x08, 0x08, 0x75, 0x2c, 0xf6, 0x86, 0x71, 0x02, 0x01, 0x74, 0x25, 0xe9, 0x7b, 0xcc, 0xbe, 0xa3, + 0x4c, 0xe8, 0x3c, 0xbc, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08, 0x26, 0x83, + 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0x44, 0x09, 0xeb, 0x16, + 0x80, 0x7e, 0x06, 0x10, 0x75, 0x10, 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x86, 0x58, 0x02, 0x00, 0xc6, + 0x86, 0x6c, 0x02, 0x00, 0xeb, 0xc8, 0xc3, 0xeb, 0xfd, 0x90, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x14, + 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x72, 0x27, 0xf6, 0x86, 0x74, 0x02, 0x01, 0x75, 0x08, 0xb8, 0x02, + 0x00, 0xe8, 0x0e, 0x04, 0xeb, 0x45, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x02, 0xc7, 0x86, 0x30, 0x05, + 0x00, 0x02, 0xc6, 0x86, 0x79, 0x02, 0x01, 0xc6, 0x86, 0xb0, 0x02, 0x00, 0xeb, 0x1e, 0xc6, 0x86, + 0xb0, 0x02, 0x01, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x02, 0xc7, 0x86, 0x30, 0x05, 0x00, 0x01, 0xf6, + 0x86, 0x78, 0x02, 0x01, 0x74, 0x06, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x06, 0xc7, 0x86, 0xd8, 0x02, + 0x05, 0x00, 0xbe, 0x27, 0x4d, 0xe8, 0xa8, 0xbb, 0xe8, 0x29, 0xdd, 0xc3, 0x80, 0x7e, 0x08, 0x18, + 0x74, 0x06, 0x80, 0x7e, 0x08, 0x1a, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x1c, 0xc3, 0x90, 0x80, 0x7e, + 0x06, 0x46, 0x75, 0x06, 0xb8, 0x05, 0x00, 0xe8, 0x95, 0xcd, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x1c, + 0x75, 0x0a, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44, 0xc3, 0x90, 0x80, 0x7e, + 0x06, 0x42, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44, 0xc3, 0x90, 0xf6, 0x86, 0x73, 0x02, 0x01, 0x74, + 0x27, 0xf6, 0x46, 0x06, 0x46, 0x75, 0x18, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x11, 0xc6, 0x86, + 0x6f, 0x02, 0x01, 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xe8, 0x85, 0xbd, 0xff, 0x86, 0xd6, 0x02, 0xe8, + 0x98, 0xd9, 0xbe, 0x15, 0x4d, 0xe8, 0x38, 0xbb, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x35, + 0xf6, 0x86, 0x7b, 0x02, 0x01, 0x75, 0x2e, 0x83, 0xbe, 0xd8, 0x02, 0x00, 0x74, 0x29, 0xff, 0x8e, + 0xd8, 0x02, 0xbe, 0x27, 0x4d, 0xe8, 0x18, 0xbb, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x77, 0x13, 0xc7, + 0x86, 0x34, 0x05, 0x00, 0x02, 0xf6, 0x86, 0x78, 0x02, 0x01, 0x74, 0x06, 0xc7, 0x86, 0x34, 0x05, + 0x00, 0x06, 0xe8, 0x7f, 0xdc, 0xeb, 0x49, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x1c, 0x80, + 0xbe, 0xfe, 0x00, 0x00, 0x74, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0x06, 0x03, 0xeb, 0x32, 0xf7, 0x86, + 0xf6, 0x00, 0x00, 0x10, 0x74, 0x05, 0xc6, 0x86, 0xfe, 0x00, 0x01, 0x80, 0xbe, 0xfe, 0x00, 0x02, + 0x74, 0x18, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x10, 0x74, 0x10, 0xb8, 0x02, 0x00, 0xe8, 0x5d, 0xf7, + 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x06, 0xb8, 0x06, 0x00, 0xe8, 0xbf, 0xcc, + 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x21, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x11, 0xc6, + 0x86, 0x6f, 0x02, 0x01, 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xe8, 0xd4, 0xbc, 0xff, 0x86, 0xd6, 0x02, + 0xbe, 0x2d, 0x4d, 0xe8, 0x8a, 0xba, 0xe8, 0x4d, 0xdc, 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75, 0x06, + 0xb8, 0x05, 0x00, 0xe8, 0x89, 0xcc, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x08, 0xb8, 0x06, + 0x00, 0xe8, 0x7b, 0xcc, 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x11, 0xc7, 0x86, 0x2e, 0x02, + 0x04, 0x00, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09, 0x18, 0xc3, 0x8e, 0x46, + 0x02, 0x26, 0x8b, 0x16, 0x42, 0x00, 0xf7, 0xc2, 0x02, 0x00, 0x74, 0x14, 0x8b, 0xc2, 0x83, 0xe0, + 0xfd, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x42, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x16, 0x42, 0x00, + 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x03, 0x00, 0x74, 0x10, 0x8e, 0x46, + 0x02, 0x26, 0x83, 0x26, 0x54, 0x00, 0x03, 0xc6, 0x86, 0x59, 0x02, 0x01, 0xeb, 0x00, 0xf6, 0x86, + 0x59, 0x02, 0x01, 0x75, 0x14, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x0e, 0xc6, 0x46, 0x09, 0x02, 0xff, + 0x86, 0x44, 0x02, 0x81, 0x8e, 0xe6, 0x02, 0x00, 0x02, 0xc6, 0x86, 0x59, 0x02, 0x00, 0xc3, 0x90, + 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x10, 0x75, 0x15, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, + 0x03, 0x00, 0x74, 0x09, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x54, 0x00, 0x03, 0xc3, 0x80, 0xbe, + 0xb0, 0x02, 0x01, 0x75, 0x3d, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x08, 0x00, 0x74, + 0x2c, 0xf6, 0x86, 0x61, 0x02, 0x01, 0x74, 0x2a, 0xf6, 0x86, 0x60, 0x02, 0x01, 0x75, 0x23, 0xc7, + 0x86, 0x2e, 0x02, 0x0a, 0x00, 0xbe, 0xbb, 0x4c, 0xf7, 0x86, 0x12, 0x01, 0x20, 0x00, 0x74, 0x03, + 0xbe, 0xc1, 0x4c, 0xe8, 0x9a, 0xb9, 0xc6, 0x86, 0x60, 0x02, 0x01, 0xeb, 0x05, 0xc6, 0x86, 0x60, + 0x02, 0x00, 0xc3, 0x90, 0xbe, 0xd3, 0x4c, 0xe8, 0x86, 0xb9, 0x33, 0xc0, 0x87, 0x86, 0xcc, 0x02, + 0x0b, 0xc0, 0x75, 0x14, 0x80, 0xbe, 0x65, 0x02, 0x00, 0x74, 0x0d, 0xc6, 0x86, 0x65, 0x02, 0x00, + 0x80, 0xa6, 0x0b, 0x02, 0x7f, 0xe8, 0x3a, 0xfb, 0xc3, 0x80, 0x7e, 0x06, 0x12, 0x75, 0x10, 0xc6, + 0x86, 0x08, 0x01, 0x01, 0xc6, 0x86, 0x09, 0x01, 0x00, 0xe8, 0x55, 0xf3, 0xe8, 0x4c, 0xf5, 0xc3, + 0xf6, 0x86, 0x6e, 0x01, 0x01, 0x74, 0x15, 0x80, 0xbe, 0x70, 0x01, 0x03, 0x73, 0x07, 0xc6, 0x86, + 0x6c, 0x01, 0x01, 0xeb, 0x23, 0xc6, 0x86, 0x6e, 0x01, 0x00, 0xeb, 0x1c, 0xf6, 0x86, 0x6f, 0x01, + 0x01, 0x74, 0x15, 0x80, 0xbe, 0x71, 0x01, 0x03, 0x73, 0x07, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xeb, + 0x07, 0xc6, 0x86, 0x6f, 0x01, 0x00, 0xeb, 0x00, 0xc3, 0xf7, 0x86, 0xb0, 0x15, 0x00, 0x80, 0x75, + 0x07, 0x83, 0xbe, 0xb0, 0x15, 0x05, 0x74, 0x05, 0xc6, 0x86, 0xce, 0x01, 0x01, 0xc3, 0xe8, 0x63, + 0xcc, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x09, 0xe8, 0x45, 0xf4, 0xbe, 0x63, 0x4d, + 0xe8, 0xed, 0xb8, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x11, 0x81, 0x8e, 0x0a, 0x02, + 0x00, 0x04, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xb8, 0x10, 0x00, 0xe8, 0xe2, 0xca, 0xc3, 0x8b, 0x86, + 0x30, 0x01, 0x88, 0xa6, 0x2c, 0x01, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x4a, 0x75, 0x06, 0xb8, 0x04, + 0x00, 0xe8, 0xcb, 0xca, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x4c, 0x75, 0x25, 0xf6, 0x86, 0x74, 0x02, + 0x01, 0x74, 0x07, 0x83, 0xbe, 0xda, 0x02, 0x00, 0x75, 0x0a, 0xc6, 0x46, 0x07, 0x12, 0xc6, 0x46, + 0x09, 0x1e, 0xeb, 0x0d, 0xff, 0x8e, 0xda, 0x02, 0xbe, 0x39, 0x4d, 0xe8, 0x92, 0xb8, 0xe8, 0xab, + 0xda, 0xc3, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x2e, 0x8a, 0x3e, 0x22, 0x5f, 0xb3, 0x01, 0xe8, + 0xf1, 0xbe, 0xf6, 0x86, 0x74, 0x02, 0x01, 0x74, 0x24, 0xa9, 0x04, 0x00, 0x75, 0x1d, 0xff, 0x8e, + 0xb5, 0x02, 0x75, 0x15, 0xc6, 0x86, 0x74, 0x02, 0x00, 0x8a, 0x4e, 0x06, 0x80, 0xf9, 0x42, 0x74, + 0x08, 0xb8, 0x02, 0x00, 0xe8, 0x68, 0xca, 0xeb, 0x41, 0xeb, 0x39, 0xeb, 0x31, 0xa9, 0x04, 0x00, + 0x74, 0x2c, 0xc6, 0x86, 0x74, 0x02, 0x01, 0x8a, 0x4e, 0x06, 0x80, 0xf9, 0x4a, 0x75, 0x1d, 0xc6, + 0x46, 0x07, 0x42, 0xc6, 0x46, 0x06, 0x42, 0xe8, 0x0d, 0xbe, 0xbe, 0xf7, 0x4c, 0xe8, 0x30, 0xb8, + 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0x32, 0xfe, 0xeb, 0x08, 0xeb, 0x06, 0xc7, 0x86, + 0xb5, 0x02, 0x02, 0x00, 0xbe, 0x45, 0x4d, 0xe8, 0x16, 0xb8, 0xc3, 0x90, 0xf7, 0x86, 0xf6, 0x00, + 0x00, 0x10, 0x74, 0x26, 0x80, 0x8e, 0xfe, 0x00, 0x00, 0x74, 0x1f, 0xfe, 0x8e, 0xfe, 0x00, 0xc6, + 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0x34, 0xba, 0xbe, 0xdf, 0x4c, 0xe8, + 0xee, 0xb7, 0xbe, 0xe5, 0x4c, 0xe8, 0xe8, 0xb7, 0xeb, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0xef, 0xc9, + 0xc3, 0x90, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x32, 0x80, 0x8e, 0xfe, 0x00, 0x00, 0x74, + 0x2b, 0xfe, 0x8e, 0xfe, 0x00, 0xbe, 0xf7, 0x4c, 0xe8, 0xc5, 0xb7, 0xb0, 0x02, 0xe8, 0x2e, 0xbc, + 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0xf3, 0xb9, 0x8e, 0x46, 0x02, + 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x1e, 0xe8, 0x7d, 0xbd, 0xeb, 0x03, 0xe8, 0xb0, 0xc9, 0xc3, + 0xf6, 0x86, 0x95, 0x02, 0x01, 0x74, 0x0a, 0xa8, 0x24, 0x74, 0x06, 0xc7, 0x86, 0xa2, 0x02, 0x05, + 0x00, 0xf6, 0x86, 0xae, 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe, 0x62, 0x02, 0x01, 0x75, 0x58, 0xeb, + 0x09, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x75, 0x10, 0xeb, 0x52, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x02, + 0xeb, 0x45, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x3f, 0xa8, 0x01, 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02, + 0x10, 0xa8, 0x04, 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x04, 0xa8, 0x08, 0x74, 0x05, 0x83, 0x8e, + 0xe6, 0x02, 0x40, 0xa8, 0x20, 0x74, 0x10, 0x81, 0x8e, 0xe6, 0x02, 0x00, 0x01, 0xf6, 0x86, 0x58, + 0x02, 0x01, 0x75, 0x03, 0xe8, 0x2a, 0xbc, 0xa8, 0x40, 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x01, + 0xa8, 0x80, 0x74, 0x03, 0xe8, 0x52, 0x00, 0xa9, 0x00, 0x01, 0x75, 0x01, 0xc3, 0x50, 0x80, 0x7e, + 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x1b, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x23, + 0xc6, 0x46, 0x09, 0x02, 0xff, 0x86, 0x44, 0x02, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x06, 0x81, + 0x8e, 0xe6, 0x02, 0x00, 0x02, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, + 0x4c, 0x00, 0x10, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x48, 0x00, 0x00, 0x00, 0x8e, 0x46, 0x02, + 0x26, 0xc7, 0x06, 0x48, 0x00, 0x00, 0x01, 0x58, 0xc3, 0x83, 0x8e, 0xe6, 0x02, 0x20, 0x83, 0x7e, + 0x06, 0x08, 0x75, 0x13, 0x8b, 0x8e, 0xce, 0x02, 0x41, 0x89, 0x8e, 0xce, 0x02, 0x80, 0xf9, 0x02, + 0x75, 0x05, 0x50, 0xe8, 0x3f, 0xd5, 0x58, 0xc3, 0x50, 0x53, 0x51, 0x8a, 0x4e, 0x06, 0x80, 0xf9, + 0x0e, 0x74, 0x1e, 0x80, 0xf9, 0x48, 0x74, 0x19, 0x80, 0xbe, 0x58, 0x02, 0x01, 0x74, 0x46, 0x80, + 0xf9, 0x08, 0x72, 0x41, 0x80, 0xf9, 0x0e, 0x77, 0x3c, 0xb8, 0x02, 0x00, 0xe8, 0xa0, 0xc8, 0xeb, + 0x34, 0xc7, 0x86, 0x2e, 0x02, 0x05, 0x00, 0xc6, 0x86, 0x65, 0x02, 0x01, 0x8a, 0x46, 0x08, 0x3c, + 0x06, 0x74, 0x26, 0x3c, 0x02, 0x74, 0x51, 0x3c, 0x08, 0x74, 0x1a, 0x3c, 0x04, 0x74, 0x16, 0xf6, + 0x86, 0xac, 0x02, 0x01, 0x75, 0x13, 0xf6, 0x86, 0xad, 0x02, 0x01, 0x75, 0x0c, 0xc6, 0x46, 0x09, + 0x04, 0xff, 0x86, 0x4e, 0x02, 0x59, 0x5b, 0x58, 0xc3, 0x8b, 0x86, 0x0a, 0x02, 0xf6, 0xc4, 0x80, + 0x75, 0x0c, 0x80, 0xcc, 0x80, 0x89, 0x86, 0x0a, 0x02, 0xc6, 0x86, 0x89, 0x02, 0x01, 0x81, 0xbe, + 0x0c, 0x03, 0x00, 0x02, 0x74, 0xdf, 0xc7, 0x86, 0x0c, 0x03, 0x00, 0x02, 0xf6, 0x86, 0xaa, 0x02, + 0x01, 0x74, 0xd2, 0xe8, 0xb4, 0xd3, 0xeb, 0xcd, 0xb8, 0x00, 0x01, 0xe8, 0x56, 0xd7, 0xf6, 0x86, + 0x62, 0x02, 0x01, 0x74, 0xc0, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0xba, 0xfa, 0xc7, 0x06, 0x30, 0x00, + 0xc0, 0x0e, 0x8c, 0x0e, 0x32, 0x00, 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8, 0xea, 0x09, 0xe7, 0x00, + 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, 0x7f, 0xe8, 0xc5, 0xb2, 0xc6, 0x06, 0x24, 0x5f, 0x80, 0xfb, + 0xc3, 0xf7, 0x86, 0x82, 0x01, 0x01, 0x00, 0x74, 0x1a, 0xc7, 0x86, 0x82, 0x01, 0x00, 0x00, 0xf6, + 0x86, 0x6e, 0x01, 0x01, 0x74, 0x0d, 0xc6, 0x86, 0x6e, 0x01, 0x00, 0xbe, 0x57, 0x4d, 0xe8, 0x81, + 0xb6, 0xeb, 0x00, 0xf7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0x74, 0x45, 0xc7, 0x86, 0x8a, 0x01, 0x00, + 0x00, 0xf6, 0x86, 0x6f, 0x01, 0x01, 0x74, 0x0d, 0xc6, 0x86, 0x6f, 0x01, 0x00, 0xbe, 0x57, 0x4d, + 0xe8, 0x5f, 0xb6, 0xeb, 0x2b, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, + 0x1f, 0xf6, 0x86, 0x61, 0x02, 0x01, 0x74, 0x18, 0xf6, 0x86, 0x60, 0x02, 0x01, 0x75, 0x11, 0xc6, + 0x86, 0x60, 0x02, 0x01, 0xc7, 0x86, 0x2e, 0x02, 0x0a, 0x00, 0xb8, 0x0c, 0x00, 0xe8, 0x8f, 0xc7, + 0xc3, 0xb9, 0x01, 0x00, 0x33, 0xdb, 0x8b, 0xaf, 0xea, 0x5d, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x16, + 0x54, 0x00, 0x83, 0xe2, 0x08, 0x26, 0xa1, 0x72, 0x00, 0xd1, 0xe8, 0xd0, 0xe8, 0x86, 0xe0, 0xf7, + 0xc2, 0x08, 0x00, 0x75, 0x02, 0xeb, 0x67, 0x83, 0xbe, 0x74, 0x01, 0x00, 0x75, 0x04, 0x88, 0xa6, + 0x78, 0x01, 0x81, 0xbe, 0x74, 0x01, 0xbc, 0x02, 0x72, 0x06, 0xc7, 0x86, 0x74, 0x01, 0xf4, 0x01, + 0x8a, 0xc4, 0x2a, 0xe4, 0x83, 0xf8, 0x7f, 0x75, 0x12, 0x8b, 0x86, 0x74, 0x01, 0xbe, 0xeb, 0x09, + 0xf7, 0xe6, 0xbe, 0x20, 0x00, 0xf7, 0xf6, 0x03, 0x86, 0x78, 0x01, 0x89, 0x86, 0x7c, 0x01, 0xff, + 0x86, 0x74, 0x01, 0x83, 0xbe, 0x7c, 0x01, 0x7d, 0x72, 0x21, 0x83, 0xbe, 0x88, 0x01, 0x01, 0x74, + 0x1a, 0xc7, 0x86, 0x88, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0xa1, 0xd4, 0x5d, + 0x89, 0x86, 0x8c, 0x01, 0xa1, 0xd6, 0x5d, 0x89, 0x86, 0x8e, 0x01, 0xe9, 0x94, 0x00, 0x83, 0xbe, + 0x76, 0x01, 0x00, 0x75, 0x04, 0x88, 0x86, 0x7a, 0x01, 0x81, 0xbe, 0x76, 0x01, 0xbc, 0x02, 0x72, + 0x06, 0xc7, 0x86, 0x76, 0x01, 0xf4, 0x01, 0x2a, 0xe4, 0x83, 0xf8, 0x7f, 0x75, 0x12, 0x8b, 0x86, + 0x76, 0x01, 0xbe, 0xeb, 0x09, 0xf7, 0xe6, 0xbe, 0x20, 0x00, 0xf7, 0xf6, 0x03, 0x86, 0x7a, 0x01, + 0x89, 0x86, 0x7e, 0x01, 0xff, 0x86, 0x76, 0x01, 0x83, 0xbe, 0x80, 0x01, 0x01, 0x74, 0x53, 0x83, + 0xf8, 0x1f, 0x72, 0x4e, 0x8d, 0xb6, 0x96, 0x01, 0x83, 0x3c, 0x12, 0x72, 0x45, 0x83, 0x3c, 0x23, + 0x77, 0x40, 0x83, 0x7c, 0x02, 0x1f, 0x72, 0x3a, 0x83, 0x7c, 0x02, 0x45, 0x77, 0x34, 0x83, 0x7c, + 0x04, 0x12, 0x72, 0x2e, 0x90, 0x83, 0x7c, 0x04, 0x23, 0x77, 0x27, 0x81, 0x7c, 0x06, 0x9c, 0x00, + 0x72, 0x20, 0xc7, 0x86, 0x80, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x82, 0x01, 0x01, 0x00, 0xc7, 0x86, + 0x88, 0x01, 0x00, 0x00, 0xa1, 0xd4, 0x5d, 0x89, 0x86, 0x84, 0x01, 0xa1, 0xd6, 0x5d, 0x89, 0x86, + 0x86, 0x01, 0x83, 0xc3, 0x02, 0x49, 0x74, 0x03, 0xe9, 0xdb, 0xfe, 0xc3, 0x50, 0x51, 0x52, 0x56, + 0x57, 0x8e, 0x46, 0x02, 0x83, 0x86, 0x90, 0x01, 0x01, 0x83, 0x96, 0x92, 0x01, 0x00, 0xc7, 0x86, + 0x80, 0x01, 0x00, 0x00, 0x26, 0xa1, 0x72, 0x00, 0xd1, 0xe8, 0xd0, 0xe8, 0x86, 0xe0, 0x8d, 0xb6, + 0x96, 0x01, 0x26, 0x8b, 0x0e, 0x54, 0x00, 0x83, 0xe1, 0x08, 0x89, 0x8e, 0x94, 0x01, 0xf7, 0xc1, + 0x08, 0x00, 0x74, 0x4f, 0x8b, 0x4c, 0x0a, 0x89, 0x4c, 0x0e, 0x8b, 0x4c, 0x06, 0x89, 0x4c, 0x0a, + 0x8b, 0x4c, 0x02, 0x89, 0x4c, 0x06, 0x2a, 0xe4, 0x8b, 0xc8, 0x83, 0xf8, 0x7f, 0x75, 0x19, 0xb0, + 0x0a, 0xe6, 0x10, 0xe5, 0x00, 0xb1, 0x05, 0xd3, 0xe8, 0x03, 0x86, 0x7e, 0x01, 0x8b, 0xc8, 0xe4, + 0x10, 0xa8, 0x10, 0x74, 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0xc1, 0x89, 0x44, 0x02, 0xc7, 0x86, 0x7e, + 0x01, 0x00, 0x00, 0xc7, 0x86, 0x76, 0x01, 0x00, 0x00, 0xeb, 0x7f, 0xc7, 0x86, 0x88, 0x01, 0x00, + 0x00, 0xeb, 0x77, 0x8b, 0x4c, 0x08, 0x89, 0x4c, 0x0c, 0x8b, 0x4c, 0x04, 0x89, 0x4c, 0x08, 0x8b, + 0x0c, 0x89, 0x4c, 0x04, 0x8a, 0xc4, 0x2a, 0xe4, 0x8b, 0xc8, 0x83, 0xf8, 0x7f, 0x75, 0x25, 0xb0, + 0x0a, 0xe6, 0x10, 0xe5, 0x00, 0xb1, 0x05, 0xd3, 0xe8, 0x03, 0x86, 0x7c, 0x01, 0x8b, 0xc8, 0xe4, + 0x10, 0xa8, 0x10, 0x74, 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0x96, 0x7c, 0x01, 0x83, 0xf9, 0x7f, 0x77, + 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0xc1, 0x89, 0x04, 0xc7, 0x86, 0x7c, 0x01, 0x00, 0x00, 0xc7, 0x86, + 0x74, 0x01, 0x00, 0x00, 0x83, 0xf8, 0x7d, 0x72, 0xa2, 0x83, 0xbe, 0x88, 0x01, 0x01, 0x74, 0x1a, + 0xc7, 0x86, 0x88, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0xa1, 0xd4, 0x5d, 0x89, + 0x86, 0x84, 0x01, 0xa1, 0xd6, 0x5d, 0x89, 0x86, 0x86, 0x01, 0x5f, 0x5e, 0x5a, 0x59, 0x58, 0xc3, + 0x50, 0x51, 0x57, 0x06, 0xfa, 0x8c, 0xd8, 0x8e, 0xc0, 0x2b, 0xc0, 0x8d, 0xbe, 0x72, 0x01, 0xb9, + 0x1a, 0x00, 0xf3, 0xab, 0xfb, 0x07, 0x5f, 0x59, 0x58, 0xc3, 0xfa, 0xf6, 0x06, 0x24, 0x5f, 0x80, + 0x74, 0x4e, 0xc6, 0x86, 0x6c, 0x01, 0x00, 0xc6, 0x86, 0x6e, 0x01, 0x01, 0xfe, 0x86, 0x70, 0x01, + 0x8a, 0x46, 0x00, 0xa2, 0x24, 0x5f, 0xc7, 0x06, 0x26, 0x5f, 0x02, 0x00, 0xc7, 0x06, 0x28, 0x5f, + 0x01, 0x00, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0x8b, 0xc8, 0xb8, 0xd6, 0x13, 0xe7, 0x02, + 0xb8, 0x4e, 0x03, 0xe7, 0x04, 0x83, 0xc9, 0x46, 0x8b, 0xc1, 0xe7, 0x06, 0x8e, 0x46, 0x02, 0x26, + 0x83, 0x0e, 0x42, 0x00, 0x01, 0xbe, 0x57, 0x4d, 0xe8, 0xe5, 0xb2, 0xc6, 0x86, 0x61, 0x02, 0x01, + 0xfb, 0xc3, 0xfa, 0xf6, 0x06, 0x24, 0x5f, 0x80, 0x74, 0x49, 0xc6, 0x86, 0x6d, 0x01, 0x00, 0xc6, + 0x86, 0x6f, 0x01, 0x01, 0xfe, 0x86, 0x71, 0x01, 0x8a, 0x46, 0x00, 0xa2, 0x24, 0x5f, 0xc7, 0x06, + 0x26, 0x5f, 0x0e, 0x00, 0xc7, 0x06, 0x28, 0x5f, 0x02, 0x00, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, + 0x06, 0x8b, 0xc8, 0xb8, 0xf7, 0x03, 0xe7, 0x02, 0xb8, 0xd6, 0x13, 0xe7, 0x04, 0x83, 0xc9, 0x46, + 0x8b, 0xc1, 0xe7, 0x06, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x01, 0xbe, 0x57, 0x4d, + 0xe8, 0x8d, 0xb2, 0xfb, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0x9d, + 0x06, 0xe7, 0x02, 0xc7, 0x06, 0x26, 0x5f, 0x04, 0x00, 0xc3, 0xc7, 0x06, 0x26, 0x5f, 0x06, 0x00, + 0xc3, 0x90, 0xc7, 0x06, 0x26, 0x5f, 0x08, 0x00, 0xc3, 0x90, 0x53, 0xc7, 0x06, 0x26, 0x5f, 0x0a, + 0x00, 0x33, 0xdb, 0x8a, 0x1e, 0x24, 0x5f, 0xd0, 0xe3, 0x8b, 0x9f, 0xea, 0x5d, 0x06, 0x8e, 0x47, + 0x02, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfe, 0x07, 0xb8, 0x9d, 0x06, 0xe7, 0x02, 0x5b, 0xc3, 0x90, + 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc7, 0x06, 0x26, 0x5f, 0x0c, 0x00, 0xc6, 0x06, 0x24, + 0x5f, 0x80, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0xf7, 0x03, 0xe7, + 0x02, 0xc7, 0x06, 0x26, 0x5f, 0x10, 0x00, 0xc3, 0x53, 0xc7, 0x06, 0x26, 0x5f, 0x12, 0x00, 0x33, + 0xdb, 0x8a, 0x1e, 0x24, 0x5f, 0xd0, 0xe3, 0x8b, 0x9f, 0xea, 0x5d, 0x06, 0x8e, 0x47, 0x02, 0x26, + 0x83, 0x26, 0x42, 0x00, 0xfe, 0x07, 0xb8, 0x9d, 0x06, 0xe7, 0x02, 0x5b, 0xc3, 0x90, 0xe5, 0x06, + 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc7, 0x06, 0x26, 0x5f, 0x14, 0x00, 0xc6, 0x06, 0x24, 0x5f, 0x80, + 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0x4e, 0x6f, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x54, 0x78, 0x74, 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x12, + 0x45, 0x23, 0x56, 0x34, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xab, 0xde, 0xbc, 0xef, 0xcd, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, + 0x00, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x30, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x31, 0x00, + 0x00, 0x54, 0x65, 0x73, 0x74, 0x31, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74, 0x32, 0x00, 0x00, 0x90, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x5e, 0x35, 0x56, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0xc0, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x24, 0x00, 0xe0, 0x02, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x04, 0x01, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x03, + 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x03, + 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, 0xe0, 0x04, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x12, 0x00, 0x04, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x05, 0xc0, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x05, 0x06, 0x0b, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, + 0xe0, 0x06, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, + 0x00, 0x06, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, + 0x02, 0x26, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xe0, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x40, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x1c, 0x26, 0x00, 0x00, 0x00, 0x00, + 0x3e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x30, 0x50, 0x20, 0x0c, 0x23, 0x30, 0x30, 0x30, 0x30, 0xf3, 0xf0, 0xf0, 0xf8, 0xf9, 0xf6, + 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, + 0x04, 0x21, 0x00, 0x00, 0x06, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x06, 0x2c, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x29, 0x20, 0x00, 0x08, 0x00, 0x01, 0x00, + 0x04, 0x06, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xe0, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x40, 0x25, + 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x26, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0xe0, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x27, + 0x08, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xe0, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x60, 0x28, + 0x04, 0x30, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x11, 0x04, 0x0c, 0x00, 0x01, 0x04, 0x0e, + 0x00, 0x02, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00, 0xc0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x12, 0x04, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x30, 0x13, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, + 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, + 0x03, 0x14, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x00, 0xc0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x15, 0x00, 0x00, + 0x00, 0x00, 0x12, 0x00, 0xe0, 0x08, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x07, 0xc0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x30, 0x17, 0x00, 0x00, + 0x00, 0x00, 0x30, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x22, 0x60, 0x29, 0x08, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x2e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x04, 0x2a, 0x00, 0x00, 0x02, 0x20, 0x80, 0x00, 0x00, 0x06, 0x09, 0x00, + 0x00, 0x00, 0x04, 0x03, 0x01, 0x80, 0x00, 0x00, 0x04, 0x02, 0x80, 0x00, 0x00, 0x08, 0x0b, 0x00, + 0x00, 0x00, 0x06, 0x02, 0x02, 0x80, 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x01, 0x26, + 0x80, 0x00, 0x00, 0xff, 0x06, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05, + 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, + 0x00, 0x00, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00, + 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, 0x04, 0x03, 0x0c, 0x80, 0x00, 0x00, 0x04, 0x0e, 0x80, + 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x0f, 0x80, 0x00, 0x00, 0x04, 0x01, 0x0d, + 0x80, 0x00, 0x00, 0x04, 0x04, 0x02, 0x80, 0x00, 0x00, 0x08, 0x22, 0x00, 0x00, 0x00, 0xff, 0x23, + 0x00, 0x00, 0x00, 0xff, 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, + 0xa5, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +#endif /* OLTR_NO_BULLSEYE_MAC */ diff --git a/sys/contrib/dev/oltr/trlldhm.c b/sys/contrib/dev/oltr/trlldhm.c new file mode 100644 index 0000000..450f160 --- /dev/null +++ b/sys/contrib/dev/oltr/trlldhm.c @@ -0,0 +1,1899 @@ +/* + * $FreeBSD$ + * + * Copyright (c) 1997 + * OLICOM A/S + * Denmark + * + * All Rights Reserved + * + * This source file is subject to the terms and conditions of the + * OLICOM Software License Agreement which restricts the manner + * in which it may be used. + * + *--------------------------------------------------------------------------- + * + * Description: Olicom Hawkeye adapter micro-code + * + *--------------------------------------------------------------------------- + */ + +#include "opt_oltr.h" + +#ifndef OLTR_NO_HAWKEYE_MAC + +unsigned char TRlldHawkeyeMac[] = { 0x52, 0x94, 0x03, 0x00, 0x02, 0x75, 0xea, 0x12, 0x4f, 0x43, 0x53, 0x4d, 0x41, 0x43, 0x2e, 0x48, + 0x41, 0x57, 0x4b, 0x45, 0x59, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xea, 0x55, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xb8, 0x00, 0x00, 0xbb, 0x00, + 0x00, 0xb9, 0x00, 0x00, 0xba, 0x00, 0x00, 0xbe, 0x00, 0x00, 0xbf, 0x00, 0x00, 0xbd, 0x00, 0x00, + 0x8c, 0xc8, 0x8e, 0xd8, 0x8e, 0xc0, 0x8e, 0xd0, 0xb8, 0x88, 0x56, 0x8b, 0xe0, 0x83, 0x3e, 0x4e, + 0x00, 0x00, 0x75, 0x1c, 0x2b, 0xdb, 0x8b, 0xf3, 0xad, 0x8b, 0xd8, 0x8b, 0xc8, 0xd1, 0xe9, 0x49, + 0x49, 0xad, 0x03, 0xd8, 0xe2, 0xfb, 0x0b, 0xdb, 0x74, 0x06, 0xc7, 0x06, 0x5a, 0x55, 0x01, 0x00, + 0xc7, 0x06, 0x0c, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x0e, 0x00, 0xc7, 0x06, 0x04, 0x00, 0xa8, 0x01, + 0x8c, 0x0e, 0x06, 0x00, 0xc7, 0x06, 0x14, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x14, 0x00, 0xc7, 0x06, + 0x08, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x08, 0x00, 0x90, 0x90, 0x90, 0xc7, 0x06, 0x20, 0x00, 0x6a, + 0x1f, 0x8c, 0x0e, 0x22, 0x00, 0x2b, 0xc0, 0xe7, 0x06, 0xc7, 0x06, 0x30, 0x00, 0x22, 0x0e, 0x8c, + 0x0e, 0x32, 0x00, 0xc7, 0x06, 0x34, 0x00, 0x34, 0x0f, 0x8c, 0x0e, 0x36, 0x00, 0xc7, 0x06, 0x38, + 0x00, 0x66, 0x0f, 0x8c, 0x0e, 0x3a, 0x00, 0xc7, 0x06, 0x3c, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x3e, + 0x00, 0xc7, 0x06, 0x08, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x0a, 0x00, 0xc7, 0x06, 0x14, 0x00, 0xa8, + 0x01, 0x8c, 0x0e, 0x16, 0x00, 0xbb, 0x40, 0x60, 0x8e, 0xc3, 0x26, 0xa1, 0x02, 0x00, 0x25, 0x00, + 0x50, 0x89, 0x86, 0x0f, 0x01, 0x26, 0x83, 0x0e, 0x72, 0x00, 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, + 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, 0x72, 0x00, 0xf7, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, + 0xc0, 0x26, 0x83, 0x0e, 0x72, 0x00, 0x08, 0x2a, 0xe4, 0xb0, 0x13, 0xe6, 0x10, 0x90, 0x90, 0x90, + 0xb0, 0x08, 0xe6, 0x12, 0x90, 0x90, 0x90, 0xb0, 0x09, 0xe6, 0x12, 0x90, 0x90, 0x90, 0xb0, 0xff, + 0xe6, 0x12, 0x90, 0x90, 0x90, 0x26, 0x83, 0x26, 0x72, 0x00, 0xf7, 0x8b, 0x86, 0x0f, 0x01, 0x26, + 0xa3, 0x02, 0x00, 0x90, 0x90, 0x90, 0x33, 0xc0, 0x26, 0xc7, 0x06, 0x04, 0x00, 0xff, 0xff, 0x26, + 0xc7, 0x06, 0x06, 0x00, 0xff, 0xff, 0x26, 0x09, 0x06, 0x08, 0x00, 0x26, 0x09, 0x06, 0x0a, 0x00, + 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8, 0x0f, 0x27, 0xe7, 0x00, 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, + 0x11, 0xe8, 0xb0, 0x0a, 0xe8, 0xed, 0x0a, 0xfb, 0xe9, 0x96, 0x0b, 0x90, 0x50, 0xb0, 0xa0, 0xe6, + 0x10, 0x58, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x13, 0xf0, 0xf0, 0xf0, 0xf0, 0xe7, 0xe7, 0xe7, 0x30, 0x32, + 0x30, 0x33, 0x39, 0x39, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x28, + 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x37, 0x20, 0x2d, 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x4f, + 0x6c, 0x69, 0x63, 0x6f, 0x6d, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x90, 0x26, 0x1d, 0x26, 0x1d, + 0x6f, 0x32, 0x55, 0x35, 0x51, 0x37, 0xa0, 0x38, 0xe2, 0x39, 0x2a, 0x3d, 0x26, 0x1d, 0x26, 0x1d, + 0x26, 0x1d, 0x93, 0x3b, 0xe9, 0x3b, 0x7a, 0x3c, 0xf7, 0x3c, 0xfc, 0x3c, 0x01, 0x3d, 0x26, 0x1d, + 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x34, 0x35, 0x26, 0x1d, 0x26, 0x1d, 0x04, 0x34, 0x5d, 0x34, + 0x5d, 0x34, 0xf1, 0x34, 0x5d, 0x34, 0x19, 0x35, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x93, 0x3b, + 0xe9, 0x3b, 0x7a, 0x3c, 0xf7, 0x3c, 0xfc, 0x3c, 0x01, 0x3d, 0x26, 0x1d, 0x70, 0x34, 0x26, 0x1d, + 0xb9, 0x34, 0x26, 0x1d, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, 0x88, 0x30, 0xb6, 0x31, + 0xbe, 0x2f, 0x9a, 0x30, 0x48, 0x31, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, + 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, + 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, + 0x08, 0x32, 0x08, 0x32, 0xf4, 0x30, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, + 0x27, 0x31, 0xbe, 0x2f, 0xbe, 0x2f, 0x39, 0x31, 0xbe, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x04, 0x05, 0xff, 0xff, 0xff, 0x00, 0x03, 0x00, 0x03, 0x03, + 0xb7, 0x05, 0xff, 0xff, 0xc2, 0x05, 0xd2, 0x05, 0xd2, 0x05, 0xd2, 0x05, 0xd2, 0x05, 0x00, 0x00, + 0xdd, 0x05, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xe3, 0x05, 0x02, 0x06, 0x48, 0x06, 0x48, 0x06, + 0x48, 0x06, 0x17, 0x06, 0x27, 0x06, 0x00, 0x00, 0x2d, 0x06, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x26, 0x1d, 0xb2, 0x3d, 0xfe, 0x14, 0x6e, 0x2f, 0x17, 0x23, 0xf6, 0x43, 0x26, 0x1d, + 0xec, 0x3d, 0x78, 0x41, 0xf5, 0x3f, 0x0e, 0x3e, 0x93, 0x3f, 0x39, 0x41, 0x5c, 0x3f, 0xf1, 0x40, + 0xff, 0x41, 0x67, 0x42, 0x36, 0x42, 0x18, 0x41, 0x74, 0x42, 0x99, 0x42, 0xc4, 0x42, 0x57, 0x42, + 0xe2, 0x42, 0x0a, 0x03, 0x30, 0x03, 0x50, 0x03, 0x7c, 0x03, 0xa2, 0x03, 0x00, 0x04, 0x66, 0x04, + 0xa0, 0x04, 0xea, 0x04, 0xac, 0x05, 0xe4, 0x01, 0x04, 0x03, 0x2a, 0x03, 0x58, 0x03, 0x76, 0x03, + 0x9c, 0x03, 0x60, 0x04, 0x9a, 0x04, 0xe4, 0x04, 0xa6, 0x05, 0xe0, 0x01, 0x08, 0x04, 0x6e, 0x04, + 0xf4, 0x02, 0x1e, 0x03, 0x44, 0x03, 0x6a, 0x03, 0x90, 0x03, 0xb6, 0x03, 0xb0, 0x03, 0xce, 0x03, + 0x72, 0x05, 0xe8, 0x03, 0x54, 0x04, 0x8e, 0x04, 0xb4, 0x04, 0xd4, 0x04, 0x8a, 0x05, 0xfe, 0x04, + 0x22, 0x05, 0x3e, 0x05, 0x56, 0x05, 0x2a, 0x54, 0x32, 0x54, 0x3e, 0x54, 0x46, 0x54, 0x4e, 0x54, + 0x74, 0x54, 0x88, 0x54, 0x90, 0x54, 0x9c, 0x54, 0xc2, 0x54, 0xd6, 0x54, 0xf0, 0xf1, 0xf2, 0xf3, + 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x1a, 0x1a, 0x7e, 0x1a, + 0xa2, 0x1a, 0x12, 0x1b, 0x34, 0x1b, 0xcc, 0x1b, 0x2a, 0x1c, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, + 0x26, 0x1d, 0x4e, 0x1c, 0x70, 0x1c, 0xc6, 0x1c, 0xea, 0x1c, 0x1e, 0x1d, 0x26, 0x1d, 0x26, 0x1d, + 0x9c, 0x14, 0xc0, 0x15, 0x54, 0x16, 0x56, 0x16, 0x72, 0x16, 0x98, 0x16, 0xb4, 0x16, 0x3e, 0x17, + 0xba, 0x17, 0x6c, 0x18, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0xe4, 0x1d, 0x26, 0x1d, + 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, + 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, + 0xa8, 0x18, 0xe6, 0x18, 0x5c, 0x19, 0xa2, 0x19, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, + 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0xaa, 0x55, 0x00, 0xff, + 0xf6, 0x46, 0x01, 0x01, 0x75, 0x6a, 0xc6, 0x86, 0x0e, 0x01, 0x05, 0xe8, 0x90, 0x01, 0xe8, 0x50, + 0x06, 0xe8, 0xfc, 0x02, 0xe8, 0x56, 0x03, 0x73, 0x3a, 0xfe, 0x8e, 0x0e, 0x01, 0x74, 0x2e, 0x26, + 0x83, 0x0e, 0x72, 0x00, 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, 0x72, 0x00, 0xf7, 0x2b, + 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x0e, 0x72, 0x00, 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, + 0x72, 0x00, 0xf7, 0x8b, 0x86, 0x0f, 0x01, 0x26, 0xa3, 0x02, 0x00, 0xeb, 0xbe, 0xc7, 0x06, 0x5a, + 0x55, 0x02, 0x00, 0x32, 0xe4, 0x8a, 0x46, 0x00, 0xe8, 0xf6, 0x03, 0x83, 0x3e, 0x4e, 0x00, 0x02, + 0x72, 0x03, 0xe8, 0x3a, 0x03, 0xa1, 0x5a, 0x55, 0xe8, 0x7e, 0x3c, 0xc6, 0x46, 0x01, 0x01, 0x90, + 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, 0x27, 0xf6, 0x86, 0x6c, 0x01, 0x01, 0x74, 0x03, 0xe8, 0x01, + 0x4d, 0xf6, 0x86, 0x6d, 0x01, 0x01, 0x74, 0x03, 0xe8, 0x4f, 0x4d, 0xf7, 0x86, 0x82, 0x01, 0x01, + 0x00, 0x75, 0x08, 0xf7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0x74, 0x03, 0xe8, 0x2b, 0x4a, 0xe8, 0x7b, + 0x05, 0xe8, 0x47, 0x05, 0xe8, 0xbf, 0x04, 0xe8, 0x64, 0x04, 0xf6, 0x86, 0x90, 0x02, 0x01, 0x74, + 0x03, 0xe8, 0x1c, 0x18, 0x33, 0xdb, 0xf6, 0x86, 0xa9, 0x02, 0x01, 0x74, 0x16, 0x8a, 0x5e, 0x09, + 0x8a, 0x7e, 0x08, 0x38, 0xfb, 0x75, 0x30, 0x80, 0xfb, 0x00, 0x74, 0x07, 0x80, 0xfb, 0x1e, 0x74, + 0x02, 0xeb, 0x22, 0x80, 0x7e, 0x06, 0x1e, 0x74, 0x1e, 0x33, 0xdb, 0x8a, 0x5e, 0x07, 0x3a, 0x5e, + 0x06, 0x74, 0x14, 0xfa, 0x50, 0x8b, 0x46, 0x06, 0x89, 0x46, 0x0c, 0x58, 0x88, 0x5e, 0x06, 0x32, + 0xff, 0xff, 0x97, 0x9a, 0x05, 0xeb, 0x2d, 0x8a, 0x5e, 0x09, 0x3a, 0x5e, 0x08, 0x74, 0x25, 0x50, + 0x8b, 0x46, 0x08, 0x89, 0x46, 0x0e, 0x58, 0x80, 0xfb, 0x1e, 0x74, 0x0d, 0x80, 0xfb, 0x00, 0x74, + 0x08, 0x80, 0xfb, 0x16, 0x74, 0x03, 0xe8, 0x28, 0x27, 0x88, 0x5e, 0x08, 0x32, 0xff, 0xfa, 0xff, + 0x97, 0x78, 0x05, 0xfb, 0xfa, 0xf7, 0x86, 0xf0, 0x00, 0xff, 0xff, 0x74, 0x0f, 0x8b, 0xb6, 0xf0, + 0x00, 0x8b, 0x4c, 0x04, 0xe8, 0x0b, 0x0a, 0xfb, 0xff, 0xd1, 0xeb, 0x5c, 0xfb, 0xf7, 0x46, 0x16, + 0xff, 0xff, 0x74, 0x27, 0x8d, 0x7e, 0x16, 0xe8, 0x88, 0x06, 0x56, 0x8b, 0x5c, 0x02, 0xd1, 0xe3, + 0xff, 0x97, 0xce, 0x04, 0x5e, 0xe8, 0x8c, 0x06, 0xf7, 0x86, 0xc8, 0x01, 0x01, 0x00, 0x74, 0x09, + 0xe8, 0x60, 0x21, 0xc7, 0x86, 0xc8, 0x01, 0x00, 0x00, 0xeb, 0x2d, 0xfa, 0xf7, 0x86, 0x0a, 0x01, + 0x01, 0x00, 0x75, 0x13, 0xf6, 0x86, 0x6c, 0x15, 0x80, 0x75, 0x0c, 0xc7, 0x86, 0x0a, 0x01, 0x01, + 0x00, 0xfb, 0xe8, 0x31, 0x36, 0xeb, 0x11, 0xfa, 0x8b, 0x86, 0x63, 0x02, 0x38, 0xc4, 0x74, 0x07, + 0x88, 0x86, 0x64, 0x02, 0xe8, 0x58, 0x16, 0xfb, 0xe8, 0xf1, 0x05, 0xe9, 0xd2, 0xfe, 0x8e, 0x46, + 0x02, 0x26, 0xc7, 0x06, 0x04, 0x00, 0xff, 0xcb, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x08, 0x00, + 0xff, 0xfb, 0xe8, 0x53, 0x02, 0x33, 0xc0, 0x88, 0x86, 0xb8, 0x01, 0x88, 0x86, 0xb9, 0x01, 0x8e, + 0x46, 0x02, 0x26, 0xa2, 0x1a, 0x00, 0x89, 0x86, 0x14, 0x02, 0x89, 0x86, 0x06, 0x02, 0x89, 0x86, + 0x36, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x0c, 0x00, 0x30, 0x01, 0x8d, 0x86, 0x52, 0x08, + 0x89, 0x86, 0xbc, 0x01, 0x89, 0x86, 0xbe, 0x01, 0xc7, 0x86, 0xc0, 0x01, 0x01, 0x00, 0x8c, 0xd8, + 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0x54, 0x02, 0xb9, 0x51, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0xd1, + 0xd1, 0xf3, 0xaa, 0x8d, 0xbe, 0x96, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe, 0x9e, 0x05, 0xab, 0xab, + 0xaa, 0x8d, 0xbe, 0xae, 0x02, 0xb9, 0x0b, 0x00, 0xf3, 0xab, 0xc7, 0x86, 0xc4, 0x01, 0x14, 0x00, + 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0xbb, 0xfe, 0x04, 0xb9, 0x0b, 0x00, 0x8b, 0x3f, 0x03, 0xfd, + 0xab, 0xab, 0xab, 0x43, 0x43, 0xe2, 0xf5, 0xbb, 0x14, 0x05, 0xb9, 0x0a, 0x00, 0x8b, 0x3f, 0x03, + 0xfd, 0xab, 0xab, 0x43, 0x43, 0xe2, 0xf6, 0xb8, 0x02, 0x00, 0x03, 0x06, 0x34, 0x55, 0xe8, 0x3d, + 0x05, 0x39, 0x06, 0x34, 0x55, 0x75, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x02, + 0xc7, 0x86, 0x08, 0x02, 0xc8, 0x00, 0xc7, 0x86, 0xf8, 0x01, 0xff, 0xff, 0xc7, 0x86, 0xf6, 0x01, + 0x07, 0x00, 0xc6, 0x86, 0x87, 0x02, 0x00, 0xe8, 0x01, 0x00, 0xc3, 0x8e, 0x46, 0x02, 0x33, 0xc0, + 0x89, 0x86, 0xb6, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x10, 0x00, 0x8b, 0x86, 0x52, 0x15, 0x26, + 0xa3, 0x30, 0x00, 0x89, 0x86, 0xb2, 0x01, 0xc1, 0xe8, 0x08, 0x26, 0xa3, 0x34, 0x00, 0x8b, 0x86, + 0x54, 0x15, 0x26, 0xa3, 0x38, 0x00, 0xc1, 0xe8, 0x08, 0x26, 0xa3, 0x36, 0x00, 0x33, 0xc0, 0xc6, + 0x86, 0x83, 0x02, 0x01, 0x8d, 0xb6, 0x52, 0x09, 0xc7, 0x86, 0xa6, 0x01, 0x5a, 0x09, 0x01, 0xae, + 0xa6, 0x01, 0x89, 0xb6, 0xa8, 0x01, 0x89, 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30, 0x80, 0xc7, 0x44, + 0x04, 0x00, 0x00, 0xc6, 0x86, 0x86, 0x02, 0x01, 0xe8, 0x01, 0x09, 0xb8, 0x00, 0x40, 0xf7, 0x86, + 0xf6, 0x00, 0x00, 0x01, 0x74, 0x13, 0x25, 0xff, 0x1f, 0x0d, 0x00, 0xa0, 0x83, 0xe0, 0xfd, 0x8e, + 0x46, 0x02, 0x26, 0x81, 0x0e, 0x0c, 0x00, 0x80, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x00, 0x00, + 0xa1, 0x34, 0x55, 0x83, 0xc0, 0x02, 0xe8, 0x85, 0x04, 0x39, 0x06, 0x34, 0x55, 0x75, 0xf7, 0xc3, + 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x00, 0x00, 0x08, 0xbe, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, + 0x02, 0x00, 0xc8, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x0c, 0x00, 0xa0, 0x00, 0x8e, 0x46, 0x02, + 0x26, 0xc7, 0x06, 0x10, 0x00, 0x04, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x00, 0x00, 0x7f, + 0xff, 0x90, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00, 0x80, 0x00, 0x90, 0x90, 0x8e, + 0x46, 0x02, 0x26, 0x81, 0x26, 0x00, 0x00, 0x7f, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x28, + 0x00, 0x18, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01, 0xc3, 0xc6, 0x86, 0x0c, + 0x01, 0x01, 0xc6, 0x86, 0x0d, 0x01, 0x00, 0xe8, 0x06, 0x23, 0xa1, 0x34, 0x55, 0x83, 0xc0, 0x02, + 0x0b, 0xc0, 0x0b, 0xc0, 0x0b, 0xc0, 0x0b, 0xc0, 0x39, 0x06, 0x34, 0x55, 0x72, 0xf2, 0x80, 0xbe, + 0x0d, 0x01, 0x01, 0x74, 0x03, 0xf9, 0xeb, 0x01, 0xf8, 0xc6, 0x86, 0x0c, 0x01, 0x00, 0xc3, 0xb8, + 0x00, 0x00, 0x88, 0x86, 0x06, 0x01, 0x88, 0x86, 0x07, 0x01, 0x88, 0x86, 0x08, 0x01, 0x88, 0x86, + 0x09, 0x01, 0x89, 0x86, 0x0a, 0x01, 0x88, 0x86, 0xb8, 0x01, 0x88, 0x86, 0xb9, 0x01, 0x88, 0x86, + 0xcd, 0x01, 0xa2, 0x8a, 0x56, 0xc3, 0x50, 0x53, 0x52, 0xc6, 0x46, 0x01, 0x00, 0x32, 0xe4, 0x8a, + 0x46, 0x00, 0xbb, 0x00, 0xfd, 0xbb, 0x00, 0xee, 0x83, 0x3e, 0x58, 0x55, 0x20, 0x75, 0x03, 0xbb, + 0x00, 0x7d, 0x81, 0xeb, 0x00, 0x75, 0x81, 0xe3, 0x00, 0xff, 0x89, 0x9e, 0x56, 0x15, 0x81, 0xc3, + 0x00, 0x01, 0xf7, 0xe3, 0x05, 0x00, 0x75, 0x89, 0x86, 0x52, 0x15, 0x03, 0x86, 0x56, 0x15, 0x48, + 0x89, 0x86, 0x54, 0x15, 0x5a, 0x5b, 0x58, 0xc3, 0x51, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, + 0x00, 0xfc, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x14, 0x00, 0x80, 0x00, 0x75, 0x1e, 0xb9, 0xf4, + 0x01, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x0c, 0x00, 0x00, 0x08, 0x8e, 0x46, 0x02, 0x26, 0xf7, + 0x06, 0x14, 0x00, 0x80, 0x00, 0x75, 0x05, 0xe8, 0x54, 0x03, 0xe2, 0xe5, 0x8e, 0x46, 0x02, 0x26, + 0x81, 0x26, 0x0c, 0x00, 0xff, 0xf7, 0x59, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x02, + 0xc3, 0x50, 0x53, 0xc1, 0xe0, 0x05, 0x05, 0x00, 0x03, 0x8b, 0xd8, 0x8d, 0x86, 0x00, 0x01, 0x89, + 0x07, 0x8d, 0x86, 0xd0, 0x01, 0x89, 0x47, 0x02, 0x8d, 0x86, 0xe0, 0x01, 0x89, 0x47, 0x04, 0x8d, + 0x86, 0x58, 0x15, 0x89, 0x47, 0x08, 0x8d, 0x86, 0x6c, 0x15, 0x89, 0x47, 0x06, 0x8d, 0x86, 0xbc, + 0x01, 0x89, 0x47, 0x0a, 0xc7, 0x47, 0x0c, 0x9c, 0x56, 0x8d, 0x86, 0x3c, 0x02, 0x89, 0x47, 0x0e, + 0x8d, 0x06, 0x34, 0x55, 0x89, 0x47, 0x10, 0xc7, 0x47, 0x14, 0x00, 0x00, 0xc7, 0x47, 0x16, 0x00, + 0x00, 0x8d, 0x86, 0xec, 0x15, 0x89, 0x47, 0x18, 0x5b, 0x58, 0xc3, 0x8e, 0x46, 0x02, 0x80, 0xbe, + 0x2d, 0x01, 0x01, 0x75, 0x40, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfb, 0x26, 0xa1, + 0x38, 0x00, 0x2d, 0x00, 0x02, 0x3b, 0x86, 0x52, 0x15, 0x73, 0x0c, 0x8b, 0xd8, 0x2b, 0x9e, 0x52, + 0x15, 0x8b, 0x86, 0x54, 0x15, 0x2b, 0xc3, 0x26, 0xa3, 0x6c, 0x00, 0x26, 0xa1, 0x12, 0x00, 0x89, + 0x86, 0x32, 0x01, 0x26, 0xc7, 0x06, 0x12, 0x00, 0x00, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, + 0x10, 0x00, 0x05, 0xeb, 0x18, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfe, 0x8b, 0x86, + 0x32, 0x01, 0x26, 0xa3, 0x12, 0x00, 0xb8, 0xff, 0xff, 0x26, 0xa3, 0x6c, 0x00, 0xc3, 0x50, 0xf7, + 0x86, 0xf6, 0x00, 0x02, 0x00, 0x75, 0x02, 0xeb, 0x4b, 0xf6, 0x86, 0x60, 0x02, 0x01, 0x75, 0x07, + 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x74, 0x3d, 0xf6, 0x86, 0x85, 0x02, 0x01, 0x74, 0x36, 0xc6, 0x86, + 0x85, 0x02, 0x00, 0x8b, 0x86, 0x06, 0x02, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x40, 0x74, 0x03, 0x25, + 0xff, 0xaf, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x20, 0x74, 0x03, 0x25, 0xff, 0xdf, 0x89, 0x86, 0x06, + 0x02, 0x3b, 0x86, 0x36, 0x02, 0x74, 0x0d, 0x89, 0x86, 0x36, 0x02, 0x81, 0xa6, 0x36, 0x02, 0x7f, + 0xdf, 0xe8, 0x8a, 0x38, 0x58, 0xc3, 0x57, 0x56, 0x50, 0x8b, 0x86, 0xda, 0x02, 0xa9, 0xff, 0xff, + 0x74, 0x40, 0x8d, 0xbe, 0xd0, 0x02, 0x8d, 0xb6, 0x96, 0x05, 0xb9, 0x0a, 0x00, 0x83, 0xf9, 0x05, + 0x75, 0x04, 0x8d, 0xb6, 0x9e, 0x05, 0xa9, 0x01, 0x00, 0x74, 0x1e, 0x80, 0x3d, 0xff, 0x74, 0x12, + 0xfe, 0x05, 0x80, 0x3d, 0xff, 0x75, 0x0b, 0x81, 0x8e, 0x06, 0x02, 0x80, 0x00, 0xc6, 0x86, 0x85, + 0x02, 0x01, 0x80, 0x3c, 0xff, 0x74, 0x02, 0xfe, 0x04, 0xd1, 0xe8, 0x47, 0x46, 0xe2, 0xce, 0xe8, + 0x0a, 0x00, 0xc7, 0x86, 0xda, 0x02, 0x00, 0x00, 0x58, 0x5e, 0x5f, 0xc3, 0xf6, 0x86, 0x56, 0x02, + 0x01, 0x75, 0x27, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0x60, 0x02, 0x01, 0x74, + 0x19, 0xc6, 0x86, 0x56, 0x02, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x75, 0x0c, 0xbe, 0xa5, + 0x45, 0xe8, 0xb8, 0x03, 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0xc3, 0xf7, 0x86, 0x58, 0x15, 0x00, + 0x80, 0x75, 0x02, 0xeb, 0x26, 0x8b, 0xb6, 0x60, 0x01, 0x3b, 0xb6, 0x5e, 0x01, 0x74, 0x1c, 0x46, + 0x83, 0xe6, 0x07, 0x89, 0xb6, 0x60, 0x01, 0x8b, 0xce, 0xd1, 0xe1, 0xd1, 0xe1, 0x8d, 0xb6, 0x3e, + 0x01, 0x03, 0xf1, 0x8b, 0x04, 0x8b, 0x54, 0x02, 0xe9, 0x7a, 0x38, 0xc3, 0xbb, 0x00, 0x03, 0x83, + 0x7f, 0x12, 0x00, 0x74, 0x08, 0xe8, 0xf5, 0x37, 0xc7, 0x47, 0x12, 0x00, 0x00, 0xc3, 0x53, 0x50, + 0x33, 0xc0, 0x88, 0x86, 0xcb, 0x01, 0xa3, 0x9a, 0x56, 0xbb, 0x9c, 0x56, 0x89, 0x1e, 0x92, 0x56, + 0x89, 0x07, 0x89, 0x47, 0x02, 0x89, 0x47, 0x04, 0xa3, 0x94, 0x56, 0xa3, 0x96, 0x56, 0xa3, 0x98, + 0x56, 0x58, 0x5b, 0xc3, 0x50, 0x8a, 0xe0, 0xe4, 0x12, 0xf6, 0xd4, 0x22, 0xc4, 0xe6, 0x12, 0x58, + 0xc3, 0xc6, 0x46, 0x06, 0x00, 0xc6, 0x46, 0x07, 0x00, 0xc6, 0x46, 0x08, 0x00, 0xc6, 0x46, 0x09, + 0x00, 0xc6, 0x86, 0x6c, 0x15, 0x80, 0x8d, 0xbe, 0x0a, 0x03, 0x8c, 0xd8, 0x8e, 0xc0, 0xab, 0xab, + 0xab, 0xc3, 0x51, 0x53, 0xb9, 0x10, 0x00, 0xd1, 0xe0, 0xd1, 0xdb, 0xe2, 0xfa, 0x8b, 0xc3, 0x86, + 0xc4, 0x5b, 0x59, 0xc3, 0x50, 0x53, 0x51, 0x52, 0x57, 0x56, 0x8d, 0x1e, 0x68, 0x05, 0xb8, 0x40, + 0x60, 0x8e, 0xc0, 0xff, 0x06, 0x4e, 0x00, 0xc7, 0x06, 0x50, 0x55, 0x00, 0x00, 0xc6, 0x06, 0x54, + 0x55, 0x00, 0xc7, 0x06, 0x58, 0x55, 0x20, 0x00, 0xbb, 0x00, 0x0d, 0x8b, 0x07, 0x81, 0xc3, 0x00, + 0x80, 0x3b, 0x07, 0x74, 0x06, 0xc7, 0x06, 0x58, 0x55, 0x40, 0x00, 0x8d, 0x3e, 0x52, 0x55, 0xb8, + 0xac, 0x5d, 0x89, 0x05, 0x06, 0x33, 0xc0, 0x8e, 0xc0, 0xa3, 0x34, 0x55, 0xa3, 0x36, 0x55, 0xa3, + 0x38, 0x55, 0x8d, 0x3e, 0x48, 0x55, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x8d, 0x3e, 0x4c, + 0x55, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x07, 0x8b, 0xd4, 0xb9, 0x01, 0x00, 0xbb, 0x00, + 0x00, 0xbd, 0xac, 0x5d, 0x88, 0x5e, 0x00, 0x8b, 0xc3, 0xd1, 0xe0, 0xd1, 0xe0, 0x05, 0x40, 0x60, + 0x89, 0x46, 0x02, 0xe8, 0xb0, 0xfc, 0xe8, 0xe2, 0x00, 0x8b, 0xc5, 0x05, 0x4e, 0x08, 0x89, 0x86, + 0x50, 0x08, 0x83, 0xc0, 0x02, 0x8b, 0xe0, 0x68, 0xfc, 0x05, 0x81, 0xc5, 0xec, 0x16, 0x43, 0xe2, + 0xd3, 0x8b, 0xe2, 0x33, 0xed, 0x5e, 0x5f, 0x5a, 0x59, 0x5b, 0x58, 0xc3, 0x3e, 0x89, 0xa6, 0x50, + 0x08, 0x33, 0xed, 0xbc, 0x88, 0x56, 0xfa, 0x83, 0x0e, 0x4c, 0x55, 0x00, 0x74, 0x0d, 0x8b, 0x36, + 0x4c, 0x55, 0x8b, 0x4c, 0x04, 0xe8, 0xea, 0x03, 0xfb, 0xff, 0xd1, 0xfb, 0x32, 0xff, 0x8a, 0x1e, + 0x50, 0x55, 0x80, 0x8f, 0x56, 0x55, 0x00, 0x75, 0x21, 0xd1, 0xe3, 0x8b, 0xaf, 0x52, 0x55, 0x81, + 0xbe, 0x4e, 0x06, 0xa5, 0xa5, 0x74, 0x0c, 0xd1, 0xeb, 0xc6, 0x87, 0x56, 0x55, 0x01, 0xe8, 0x2c, + 0x06, 0xeb, 0x07, 0x8b, 0x86, 0x50, 0x08, 0x8b, 0xe0, 0xc3, 0xeb, 0xb5, 0xeb, 0xae, 0x60, 0x9c, + 0xe8, 0xa9, 0xff, 0x0e, 0xe8, 0x02, 0x00, 0xeb, 0x01, 0xcf, 0x61, 0xc3, 0x50, 0xfa, 0x8b, 0x76, + 0x1a, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0x10, 0x8b, 0x04, 0x89, 0x46, 0x1a, 0x0b, 0xc0, 0x75, 0x03, + 0x89, 0x46, 0x1c, 0xc7, 0x04, 0x00, 0x00, 0xfb, 0x58, 0xc3, 0x53, 0xfa, 0xc7, 0x04, 0x00, 0x00, + 0x8b, 0x5d, 0x02, 0x89, 0x37, 0x89, 0x75, 0x02, 0x83, 0x3d, 0x00, 0x75, 0x02, 0x89, 0x35, 0xfb, + 0x5b, 0xc3, 0x50, 0xfa, 0x8b, 0x35, 0x8b, 0x04, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x03, 0x89, 0x45, + 0x02, 0xfb, 0x58, 0xc3, 0x50, 0xfa, 0x8b, 0x46, 0x1a, 0x89, 0x04, 0x89, 0x76, 0x1a, 0xf7, 0x46, + 0x1a, 0xff, 0xff, 0x75, 0x03, 0x89, 0x76, 0x1a, 0xfb, 0x58, 0xc3, 0x50, 0x53, 0x51, 0x8b, 0xc5, + 0x83, 0xc0, 0x1e, 0x89, 0x46, 0x1a, 0x83, 0xc0, 0x48, 0x89, 0x46, 0x1c, 0xb9, 0x09, 0x00, 0x8b, + 0xdd, 0x8b, 0xc5, 0x83, 0xc0, 0x26, 0x89, 0x47, 0x1e, 0x83, 0xc3, 0x08, 0x83, 0xc0, 0x08, 0xe2, + 0xf5, 0x59, 0x5b, 0x58, 0xc3, 0x90, 0x60, 0x06, 0x1e, 0xfa, 0x33, 0xdb, 0x8e, 0xdb, 0x83, 0x06, + 0x34, 0x55, 0x01, 0x73, 0x04, 0x11, 0x1e, 0x36, 0x55, 0xb9, 0x01, 0x00, 0x8b, 0xaf, 0x52, 0x55, + 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x03, 0xe8, 0xda, 0x3e, 0xf7, 0x06, 0x34, 0x55, 0x07, 0x00, + 0x74, 0x10, 0x80, 0xbe, 0x2d, 0x01, 0x01, 0x75, 0x09, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, + 0x00, 0x01, 0xf7, 0x86, 0xa3, 0x02, 0x01, 0x00, 0x74, 0x30, 0xfe, 0x86, 0x6b, 0x01, 0x80, 0xbe, + 0x6b, 0x01, 0x02, 0x73, 0x02, 0xeb, 0x23, 0xc6, 0x86, 0x6b, 0x01, 0x00, 0xf7, 0x86, 0x1c, 0x01, + 0x01, 0x00, 0x75, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04, 0x00, 0x32, 0xfe, 0x81, 0xa6, + 0x18, 0x01, 0x32, 0xfe, 0xc7, 0x86, 0xa3, 0x02, 0x00, 0x00, 0xc6, 0x86, 0x6a, 0x01, 0x00, 0x8e, + 0x46, 0x02, 0x26, 0xa1, 0x08, 0x00, 0x25, 0x00, 0x02, 0x74, 0x03, 0xe8, 0x1d, 0x12, 0xf6, 0x86, + 0x54, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x90, 0x3e, 0x8b, 0x86, 0xf6, 0x00, 0x25, 0xd0, 0xe5, 0x89, + 0x86, 0x2c, 0x02, 0x8a, 0x46, 0x08, 0x3c, 0x06, 0x74, 0x08, 0x3c, 0x0a, 0x74, 0x04, 0x3c, 0x18, + 0x75, 0x04, 0xff, 0x86, 0x46, 0x02, 0x83, 0xc3, 0x02, 0x49, 0x74, 0x03, 0xe9, 0x5d, 0xff, 0xf7, + 0x06, 0x48, 0x55, 0xff, 0xff, 0x74, 0x1f, 0xff, 0x0e, 0x38, 0x55, 0x75, 0x19, 0xe8, 0x14, 0x02, + 0x8b, 0x1e, 0x48, 0x55, 0x0b, 0xdb, 0x74, 0x0e, 0x8b, 0x47, 0x08, 0xa3, 0x38, 0x55, 0xf7, 0x06, + 0x38, 0x55, 0xff, 0xff, 0x74, 0xe7, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0x1f, 0x07, 0x61, 0xcf, + 0x60, 0x06, 0x1e, 0xfa, 0x8d, 0x36, 0x3c, 0x55, 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0xe8, + 0x17, 0x42, 0xa0, 0x3a, 0x55, 0xfe, 0xc0, 0x3c, 0x04, 0x72, 0x08, 0xc6, 0x06, 0x3a, 0x55, 0x00, + 0xe9, 0xf7, 0xfe, 0xa2, 0x3a, 0x55, 0xeb, 0xce, 0x50, 0x57, 0x56, 0xfa, 0x8d, 0x36, 0x40, 0x55, + 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0x80, 0x3e, 0x8a, 0x56, 0x01, 0x75, 0x0d, 0x8b, 0x36, + 0x8c, 0x56, 0x83, 0xfe, 0x14, 0x77, 0x0e, 0xff, 0x94, 0x52, 0x05, 0x50, 0xb0, 0xa0, 0xe6, 0x10, + 0x58, 0x5e, 0x5f, 0x58, 0xcf, 0xe8, 0xc6, 0x44, 0xeb, 0xf1, 0x57, 0x56, 0x50, 0xfa, 0x8d, 0x36, + 0x44, 0x55, 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0x80, 0x3e, 0x8a, 0x56, 0x01, 0x75, 0x0d, + 0x8b, 0x36, 0x8c, 0x56, 0x83, 0xfe, 0x14, 0x77, 0x0e, 0xff, 0x94, 0x52, 0x05, 0x50, 0xb0, 0xa0, + 0xe6, 0x10, 0x58, 0x58, 0x5e, 0x5f, 0xcf, 0xe8, 0x94, 0x44, 0xeb, 0xf1, 0x50, 0x53, 0x51, 0x57, + 0xe8, 0xab, 0x00, 0xfa, 0x8b, 0x3c, 0x03, 0xfd, 0x89, 0x6d, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x45, + 0x04, 0x8b, 0x44, 0x04, 0x89, 0x45, 0x06, 0x0b, 0xc0, 0x75, 0x0e, 0x8b, 0x86, 0x08, 0x02, 0x0b, + 0xc0, 0x75, 0x03, 0xb8, 0xc8, 0x00, 0x89, 0x45, 0x06, 0xf7, 0x06, 0x48, 0x55, 0xff, 0xff, 0x75, + 0x14, 0x89, 0x3e, 0x48, 0x55, 0x89, 0x3e, 0x4a, 0x55, 0xc7, 0x05, 0x00, 0x00, 0x89, 0x45, 0x08, + 0xa3, 0x38, 0x55, 0xeb, 0x63, 0x8b, 0x3e, 0x48, 0x55, 0x8b, 0x0e, 0x38, 0x55, 0x33, 0xdb, 0x3b, + 0xc8, 0x72, 0x35, 0x0b, 0xdb, 0x75, 0x17, 0x2b, 0xc8, 0x89, 0x4d, 0x08, 0x8b, 0x34, 0x03, 0xf5, + 0x89, 0x44, 0x08, 0x89, 0x3c, 0x89, 0x36, 0x48, 0x55, 0xa3, 0x38, 0x55, 0xeb, 0x3a, 0x2b, 0x4d, + 0x08, 0x2b, 0xc1, 0x8b, 0x34, 0x03, 0xf5, 0x89, 0x44, 0x08, 0x8b, 0x4d, 0x08, 0x2b, 0xc8, 0x89, + 0x4d, 0x08, 0x89, 0x37, 0x89, 0x3c, 0xeb, 0x20, 0x8b, 0xdf, 0x8b, 0x3d, 0x0b, 0xff, 0x74, 0x05, + 0x03, 0x4d, 0x08, 0xeb, 0xba, 0x2b, 0xc1, 0x8b, 0x34, 0x03, 0xf5, 0x89, 0x44, 0x08, 0x89, 0x37, + 0xc7, 0x04, 0x00, 0x00, 0x89, 0x36, 0x4a, 0x55, 0xfb, 0x5f, 0x59, 0x5b, 0x58, 0xc3, 0x57, 0x53, + 0x50, 0x56, 0xfa, 0x8b, 0x1e, 0x48, 0x55, 0x33, 0xff, 0x8b, 0x34, 0x03, 0xf5, 0x83, 0x7c, 0x02, + 0xff, 0x74, 0x4b, 0x3b, 0xde, 0x75, 0x49, 0x0b, 0xff, 0x74, 0x18, 0x8b, 0x07, 0x89, 0x05, 0x0b, + 0xc0, 0x75, 0x06, 0x89, 0x3e, 0x4a, 0x55, 0xeb, 0x2c, 0x8b, 0x4f, 0x08, 0x8b, 0xf8, 0x01, 0x4d, + 0x08, 0xeb, 0x22, 0x8b, 0x3f, 0x89, 0x3e, 0x48, 0x55, 0x0b, 0xff, 0x75, 0x0c, 0x89, 0x3e, 0x4a, + 0x55, 0xc7, 0x06, 0x38, 0x55, 0xff, 0xff, 0xeb, 0x0c, 0xa1, 0x38, 0x55, 0x01, 0x45, 0x08, 0x8b, + 0x45, 0x08, 0xa3, 0x38, 0x55, 0xc7, 0x47, 0x02, 0xff, 0xff, 0xc7, 0x07, 0x00, 0x00, 0xeb, 0x4e, + 0x83, 0xcb, 0x00, 0x74, 0x06, 0x8b, 0xfb, 0x8b, 0x1f, 0xeb, 0xa8, 0x83, 0xfd, 0x00, 0x75, 0x05, + 0xbb, 0x4c, 0x55, 0xeb, 0x04, 0x8d, 0x9e, 0xf0, 0x00, 0x8b, 0x1f, 0x83, 0xfb, 0x00, 0x74, 0x2e, + 0x3b, 0xde, 0x75, 0x05, 0xe8, 0x6b, 0x00, 0xeb, 0x25, 0x8b, 0xfb, 0x8b, 0x1f, 0x83, 0xcb, 0x00, + 0x74, 0x1c, 0x3b, 0xde, 0x75, 0xf3, 0x8b, 0x07, 0x89, 0x05, 0x83, 0xc8, 0x00, 0x75, 0x04, 0x89, + 0xbe, 0xf2, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff, 0xeb, 0x00, 0xfb, 0x5e, + 0x58, 0x5b, 0x5f, 0xc3, 0x50, 0x53, 0x56, 0x55, 0x8b, 0x1e, 0x48, 0x55, 0x8b, 0x6f, 0x02, 0x0b, + 0xed, 0x74, 0x06, 0x81, 0xc5, 0xf0, 0x00, 0xeb, 0x03, 0xbd, 0x4c, 0x55, 0x8b, 0x76, 0x02, 0x8b, + 0x07, 0xa3, 0x48, 0x55, 0x0b, 0xc0, 0x75, 0x03, 0xa3, 0x4a, 0x55, 0x89, 0x5e, 0x02, 0x89, 0x1c, + 0xc7, 0x07, 0x00, 0x00, 0x83, 0x4e, 0x00, 0x00, 0x75, 0x03, 0x89, 0x5e, 0x00, 0x5d, 0x5e, 0x5b, + 0x58, 0xc3, 0x55, 0x53, 0x50, 0x0b, 0xed, 0x74, 0x06, 0x81, 0xc5, 0xf0, 0x00, 0xeb, 0x03, 0xbd, + 0x4c, 0x55, 0x8b, 0x5e, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff, 0x8b, 0x07, 0xc7, 0x07, 0x00, 0x00, + 0x8b, 0xd8, 0x89, 0x5e, 0x00, 0x0b, 0xdb, 0x75, 0x03, 0x89, 0x5e, 0x02, 0x58, 0x5b, 0x5d, 0xc3, + 0x50, 0x53, 0x51, 0x57, 0x56, 0xfa, 0x8b, 0x1e, 0x48, 0x55, 0x33, 0xff, 0x83, 0xcb, 0x00, 0x74, + 0x54, 0x8b, 0xc3, 0x39, 0x6f, 0x02, 0x75, 0x47, 0x0b, 0xff, 0x74, 0x18, 0x8b, 0x37, 0x89, 0x35, + 0x8b, 0xc7, 0x0b, 0xf6, 0x75, 0x06, 0x89, 0x3e, 0x4a, 0x55, 0xeb, 0x2c, 0x8b, 0x4f, 0x08, 0x01, + 0x4c, 0x08, 0xeb, 0x24, 0x8b, 0x37, 0x89, 0x36, 0x48, 0x55, 0x0b, 0xf6, 0x75, 0x0c, 0x89, 0x36, + 0x4a, 0x55, 0xc7, 0x06, 0x38, 0x55, 0xff, 0xff, 0xeb, 0x0e, 0xa1, 0x38, 0x55, 0x01, 0x44, 0x08, + 0x8b, 0x44, 0x08, 0xa3, 0x38, 0x55, 0x33, 0xc0, 0xc7, 0x47, 0x02, 0xff, 0xff, 0xeb, 0x00, 0x8b, + 0xf8, 0x8b, 0x1f, 0xeb, 0xa7, 0xfb, 0x5e, 0x5f, 0x59, 0x5b, 0x58, 0xc3, 0x50, 0x53, 0x51, 0x52, + 0x8a, 0x8e, 0xa8, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x00, 0x00, 0x8b, 0xd8, 0xf7, 0x86, 0xf6, + 0x00, 0x00, 0x01, 0x74, 0x10, 0x83, 0xe0, 0xfd, 0xc6, 0x86, 0x79, 0x02, 0x01, 0x25, 0xff, 0x1f, + 0x0d, 0x00, 0x80, 0xeb, 0x0e, 0x25, 0xff, 0x1f, 0x0d, 0x00, 0x20, 0x83, 0xc8, 0x02, 0xc6, 0x86, + 0x79, 0x02, 0x00, 0xe8, 0x67, 0x02, 0x0d, 0x00, 0x08, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x03, + 0x25, 0xff, 0xf7, 0x33, 0xd8, 0x74, 0x0f, 0x26, 0xa3, 0x00, 0x00, 0xf7, 0xc3, 0x02, 0x00, 0x74, + 0x05, 0xc6, 0x06, 0x0a, 0x13, 0x01, 0x26, 0xa1, 0x0c, 0x00, 0x8b, 0xd8, 0xf7, 0x86, 0x12, 0x01, + 0x10, 0x00, 0x74, 0x05, 0x0d, 0x00, 0x10, 0xeb, 0x03, 0x25, 0xff, 0xef, 0x8a, 0xae, 0x69, 0x02, + 0x80, 0xf9, 0x01, 0x75, 0x04, 0x8a, 0xae, 0x6a, 0x02, 0xf6, 0xc5, 0x01, 0x74, 0x05, 0x83, 0xc8, + 0x10, 0xeb, 0x03, 0x83, 0xe0, 0xef, 0xf6, 0x86, 0x6b, 0x02, 0x01, 0x74, 0x0a, 0x83, 0xc8, 0x20, + 0xc6, 0x86, 0x7a, 0x02, 0x00, 0xeb, 0x08, 0x83, 0xe0, 0xdf, 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xf6, + 0x86, 0x54, 0x02, 0x01, 0x74, 0x0a, 0xc6, 0x86, 0x7a, 0x02, 0x00, 0x83, 0xc8, 0x40, 0xeb, 0x03, + 0x83, 0xe0, 0xbf, 0xf6, 0x86, 0x79, 0x02, 0x01, 0x74, 0x05, 0x0d, 0x80, 0x00, 0xeb, 0x03, 0x25, + 0x7f, 0xff, 0xf6, 0x86, 0x78, 0x02, 0x01, 0x74, 0x05, 0x0d, 0x00, 0x01, 0xeb, 0x03, 0x25, 0xff, + 0xfe, 0xf6, 0x86, 0x7a, 0x02, 0x01, 0x74, 0x05, 0x0d, 0x00, 0x20, 0xeb, 0x03, 0x25, 0xff, 0xdf, + 0x33, 0xd8, 0x74, 0x12, 0xf7, 0xc3, 0x20, 0x00, 0x74, 0x05, 0xc6, 0x06, 0x0a, 0x13, 0x01, 0x25, + 0xff, 0xf7, 0x26, 0xa3, 0x0c, 0x00, 0x26, 0xa1, 0x10, 0x00, 0x8b, 0xd8, 0x33, 0xd8, 0x74, 0x04, + 0x26, 0xa3, 0x10, 0x00, 0xf6, 0x06, 0x0a, 0x13, 0x01, 0x74, 0x1e, 0xc6, 0x06, 0x0a, 0x13, 0x00, + 0x26, 0x81, 0x26, 0x00, 0x00, 0x7f, 0xff, 0x90, 0x90, 0x26, 0x81, 0x0e, 0x00, 0x00, 0x80, 0x00, + 0x90, 0x90, 0x26, 0x81, 0x26, 0x00, 0x00, 0x7f, 0xff, 0x5a, 0x59, 0x5b, 0x58, 0xc3, 0x00, 0x8e, + 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x04, 0x00, 0x74, 0x0b, 0xc6, 0x06, 0x8a, 0x56, 0x01, 0x26, + 0x83, 0x0e, 0x02, 0x00, 0x02, 0xc6, 0x86, 0xab, 0x02, 0x00, 0xc6, 0x86, 0xac, 0x02, 0x00, 0x81, + 0xa6, 0xf6, 0x00, 0xff, 0xfb, 0xa8, 0x01, 0x74, 0x19, 0x81, 0x8e, 0xf6, 0x00, 0x00, 0x04, 0x26, + 0x83, 0x0e, 0x02, 0x00, 0x20, 0x26, 0x83, 0x26, 0x02, 0x00, 0xef, 0xc6, 0x86, 0xac, 0x02, 0x01, + 0xeb, 0x4d, 0xa8, 0x02, 0x74, 0x1f, 0x26, 0x83, 0x26, 0x02, 0x00, 0xcf, 0xf7, 0x86, 0xf4, 0x00, + 0x04, 0x00, 0x75, 0x0d, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x75, 0x05, 0xc6, 0x86, 0xab, 0x02, + 0x01, 0xb0, 0x02, 0xeb, 0x2a, 0xa8, 0x04, 0x74, 0x0e, 0x26, 0x83, 0x0e, 0x02, 0x00, 0x20, 0x26, + 0x83, 0x26, 0x02, 0x00, 0xef, 0xeb, 0x18, 0xa8, 0x08, 0x74, 0x08, 0x26, 0x83, 0x0e, 0x02, 0x00, + 0x30, 0xeb, 0x0c, 0xa8, 0x10, 0x74, 0x08, 0x26, 0x83, 0x0e, 0x02, 0x00, 0x30, 0xeb, 0x00, 0xf6, + 0x06, 0x8a, 0x56, 0x01, 0x74, 0x06, 0x26, 0x83, 0x26, 0x02, 0x00, 0xcf, 0xc3, 0xc3, 0x8e, 0x46, + 0x02, 0x26, 0x81, 0x0e, 0x0c, 0x00, 0x00, 0x01, 0x90, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, + 0x0c, 0x00, 0xff, 0xfe, 0xc3, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x0f, 0x80, + 0xbe, 0xab, 0x02, 0x01, 0x75, 0x10, 0x26, 0x83, 0x0e, 0x02, 0x00, 0x02, 0xeb, 0x08, 0xc6, 0x86, + 0x6c, 0x01, 0x01, 0xe8, 0x9c, 0x3f, 0xc3, 0x8e, 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, + 0x74, 0x09, 0x26, 0x81, 0x26, 0x02, 0x00, 0xff, 0xef, 0xeb, 0x07, 0x26, 0x81, 0x0e, 0x02, 0x00, + 0x00, 0x10, 0xc3, 0x8e, 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81, + 0x0e, 0x02, 0x00, 0x00, 0x10, 0xeb, 0x07, 0x26, 0x81, 0x26, 0x02, 0x00, 0xff, 0xef, 0xc3, 0x8e, + 0x46, 0x02, 0x26, 0x81, 0x0e, 0x02, 0x00, 0x00, 0x80, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, + 0x02, 0x00, 0xff, 0x7f, 0xc3, 0xf7, 0x86, 0xf4, 0x00, 0x08, 0x00, 0x74, 0x13, 0xe8, 0xdf, 0xff, + 0xeb, 0x3a, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x1e, 0x80, 0x7e, 0x06, 0x48, 0x74, 0x24, 0xeb, 0x2c, + 0xe8, 0xd7, 0xff, 0x8e, 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x10, 0x00, 0x75, 0xe4, 0xf7, 0x86, + 0xf6, 0x00, 0x00, 0x01, 0x75, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x02, 0x00, 0x00, 0x40, + 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x02, 0x00, 0xff, 0xbf, 0xc3, 0x83, 0xe0, 0xf7, + 0xf7, 0x86, 0x12, 0x01, 0x00, 0x04, 0x74, 0x03, 0x83, 0xc8, 0x08, 0xc3, 0x53, 0x40, 0x03, 0x06, + 0x34, 0x55, 0x8b, 0xd8, 0xe8, 0xf7, 0xf8, 0xa1, 0x34, 0x55, 0x3b, 0xc3, 0x75, 0xf6, 0x5b, 0xc3, + 0xe8, 0xfb, 0xf2, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0x8e, 0x46, 0x02, + 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc6, 0x86, 0x78, 0x02, 0x00, 0xe8, 0x1e, 0xfd, 0x8e, 0x46, + 0x02, 0x26, 0xc7, 0x06, 0x10, 0x00, 0x04, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00, + 0x04, 0x33, 0xc0, 0x88, 0x86, 0x88, 0x02, 0x88, 0x86, 0x89, 0x02, 0xc6, 0x86, 0x63, 0x01, 0x01, + 0xc7, 0x86, 0x64, 0x01, 0xf8, 0x05, 0xc6, 0x86, 0x69, 0x01, 0x02, 0xbe, 0x0b, 0x46, 0xe8, 0xab, + 0xfa, 0xbe, 0x05, 0x46, 0xe8, 0xa5, 0xfa, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04, 0x00, 0x32, + 0xfe, 0xc3, 0xc6, 0x86, 0x63, 0x01, 0x00, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x0d, 0xe8, 0x8d, + 0xf2, 0xe8, 0x7d, 0x2c, 0xc6, 0x46, 0x07, 0x00, 0xe9, 0xa7, 0x00, 0xbe, 0xb7, 0x45, 0xe8, 0x2d, + 0xfb, 0xbe, 0x05, 0x46, 0xe8, 0x27, 0xfb, 0xc6, 0x86, 0x88, 0x02, 0x01, 0x80, 0x7e, 0x06, 0x02, + 0x74, 0x08, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x09, 0xeb, 0x0d, 0xc6, 0x46, 0x07, 0x04, 0xe9, 0x81, + 0x00, 0xc6, 0x46, 0x07, 0x46, 0xeb, 0x7b, 0x80, 0x7e, 0x08, 0x08, 0x75, 0xf8, 0xc6, 0x86, 0x81, + 0x02, 0x01, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xc6, 0x86, 0x5c, 0x02, + 0x00, 0xc6, 0x86, 0x5f, 0x02, 0x01, 0xc6, 0x86, 0x68, 0x02, 0x01, 0xc6, 0x86, 0x6c, 0x02, 0x01, + 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x17, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x2c, 0xc6, 0x46, + 0x09, 0x0a, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x01, 0xeb, 0x1c, 0xf6, 0x86, + 0x59, 0x02, 0x01, 0x74, 0x15, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x0e, 0xc6, 0x46, 0x09, 0x06, + 0xc6, 0x86, 0x58, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8, 0x18, 0xfe, 0xe8, 0x2c, 0xfc, + 0xbe, 0xed, 0x45, 0xe8, 0xe6, 0xf9, 0xbe, 0xab, 0x45, 0xe8, 0xe0, 0xf9, 0xbe, 0xf3, 0x45, 0xe8, + 0xda, 0xf9, 0xc3, 0x90, 0xc6, 0x46, 0x09, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04, 0x00, + 0x32, 0xfe, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x02, 0x75, 0x05, 0xc6, 0x86, 0x92, 0x02, 0x01, 0xe8, + 0x30, 0x08, 0xc7, 0x86, 0xc4, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, 0xbe, 0xf9, + 0x45, 0xe8, 0xa8, 0xf9, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xc6, 0x86, + 0x68, 0x02, 0x01, 0xc6, 0x86, 0x6c, 0x02, 0x01, 0xe8, 0xd1, 0xfb, 0xb8, 0x01, 0x00, 0xe8, 0x7b, + 0xfe, 0xe8, 0xb1, 0xfd, 0xbe, 0xb1, 0x45, 0xe8, 0x82, 0xf9, 0xbe, 0xed, 0x45, 0xe8, 0x7c, 0xf9, + 0x33, 0xc0, 0x89, 0x86, 0xee, 0x01, 0x89, 0x86, 0xf0, 0x01, 0x89, 0x86, 0xf2, 0x01, 0xf6, 0x06, + 0x8a, 0x56, 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04, 0x00, 0xff, 0xf7, 0xf7, + 0x86, 0xf6, 0x00, 0x00, 0x20, 0x74, 0x10, 0xbe, 0xf3, 0x45, 0xe8, 0x4f, 0xf9, 0xc6, 0x86, 0x5d, + 0x02, 0x00, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xc3, 0xc3, 0x90, 0xc6, 0x86, 0x57, 0x02, 0x01, 0xc7, + 0x86, 0xc4, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc6, 0x02, 0x00, 0x00, 0xbe, 0xb1, 0x45, 0xe8, 0x2b, + 0xf9, 0xe8, 0xbf, 0x12, 0xc3, 0x90, 0xc6, 0x86, 0x5b, 0x02, 0x01, 0xf6, 0x86, 0x84, 0x02, 0x01, + 0x74, 0x08, 0xe8, 0xb0, 0x14, 0xc6, 0x86, 0x84, 0x02, 0x00, 0xbe, 0xb1, 0x45, 0xe8, 0x0c, 0xf9, + 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x07, 0x0c, 0xc3, 0xbe, 0xb1, 0x45, 0xe8, + 0xfa, 0xf8, 0xbe, 0xcf, 0x45, 0xe8, 0xf4, 0xf8, 0xc7, 0x86, 0xb8, 0x02, 0x01, 0x00, 0xc7, 0x86, + 0xba, 0x02, 0x01, 0x00, 0xe8, 0xf6, 0x12, 0xc3, 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, 0xc7, 0x86, + 0xc4, 0x01, 0x14, 0x00, 0xc6, 0x86, 0x08, 0x01, 0x00, 0x81, 0xa6, 0x06, 0x02, 0xdf, 0xbf, 0xc6, + 0x86, 0x60, 0x02, 0x01, 0xc7, 0x86, 0x26, 0x02, 0xff, 0xff, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x20, + 0x75, 0x18, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x75, 0x10, 0xbe, 0xf3, 0x45, 0xe8, 0xac, 0xf8, + 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xbe, 0xb1, 0x45, 0xe8, 0x4e, 0xf9, + 0xb8, 0x00, 0x80, 0xe8, 0xec, 0x2b, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01, 0xe8, + 0x23, 0xfd, 0xe8, 0xd2, 0xfc, 0xc6, 0x86, 0x5e, 0x02, 0x01, 0xc6, 0x86, 0xca, 0x01, 0x00, 0xf7, + 0x86, 0xf6, 0x00, 0x04, 0x00, 0x74, 0x05, 0xc6, 0x86, 0xca, 0x01, 0x01, 0xe8, 0x7c, 0xf3, 0xf6, + 0x86, 0x54, 0x02, 0x01, 0x75, 0x06, 0xbe, 0xbd, 0x45, 0xe8, 0x60, 0xf8, 0xff, 0x86, 0xfc, 0x00, + 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfb, 0xc6, 0x86, 0x08, 0x01, 0x00, + 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x46, 0x0b, 0x00, 0xc6, 0x86, 0x54, 0x02, 0x00, 0xc6, 0x86, 0x68, + 0x02, 0x00, 0xc6, 0x86, 0x5e, 0x02, 0x00, 0xc6, 0x86, 0x60, 0x02, 0x00, 0xc6, 0x86, 0x5b, 0x02, + 0x00, 0xc6, 0x86, 0x63, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xc6, 0x86, 0x69, 0x02, 0x00, + 0xc6, 0x86, 0x6a, 0x02, 0x00, 0xe8, 0x54, 0xfa, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x00, 0x00, + 0x20, 0xf6, 0x86, 0x6c, 0x02, 0x01, 0x74, 0x02, 0xeb, 0x23, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, + 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, + 0x01, 0xe8, 0x26, 0x3c, 0xe8, 0xb9, 0xf9, 0xbe, 0xc9, 0x45, 0xe8, 0xdf, 0xf7, 0xc3, 0xc7, 0x86, + 0x2e, 0x02, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfb, 0x8e, 0x46, 0x02, + 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, + 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xf3, 0x3b, 0xc6, 0x86, 0x08, 0x01, 0x00, 0xc7, 0x86, 0x22, 0x01, + 0x00, 0x00, 0xe8, 0x0e, 0xfc, 0xe8, 0x32, 0xfc, 0xf7, 0x86, 0xf4, 0x00, 0x10, 0x00, 0x74, 0x14, + 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x02, 0x00, + 0x00, 0x40, 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x02, 0x00, 0xff, 0xbf, 0xe8, 0x7d, + 0xef, 0xe8, 0x6c, 0x2b, 0xc6, 0x86, 0xad, 0x02, 0x00, 0x8d, 0xbe, 0x0a, 0x03, 0x8c, 0xd8, 0x8e, + 0xc0, 0xab, 0xab, 0xab, 0xf6, 0x86, 0xa6, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09, 0x1e, 0x8e, + 0x46, 0x02, 0x26, 0xc7, 0x06, 0x04, 0x00, 0xff, 0xfb, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x02, 0x74, + 0x10, 0xf7, 0x86, 0x20, 0x01, 0x80, 0x00, 0x75, 0x08, 0xbe, 0x59, 0x46, 0xe8, 0x3d, 0xf7, 0xeb, + 0x0d, 0x8e, 0x46, 0x02, 0x33, 0xc0, 0x26, 0xa3, 0x24, 0x00, 0x26, 0xa3, 0x26, 0x00, 0xc3, 0x90, + 0x33, 0xc0, 0x88, 0x86, 0x5b, 0x02, 0x88, 0x86, 0x5e, 0x02, 0x88, 0x86, 0x60, 0x02, 0x88, 0x86, + 0x63, 0x02, 0x88, 0x86, 0x68, 0x02, 0xbe, 0xff, 0x45, 0xe8, 0x10, 0xf7, 0xc6, 0x86, 0xad, 0x02, + 0x01, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, + 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0x2f, 0x3b, 0xc3, 0xc7, 0x86, 0x2e, 0x02, + 0x03, 0x00, 0xe8, 0xe9, 0xee, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8, + 0x1a, 0xf9, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00, 0x00, 0x1e, 0x8e, 0x46, 0x02, 0x26, + 0x83, 0x0e, 0x10, 0x00, 0x04, 0xbe, 0x17, 0x46, 0xe8, 0xc1, 0xf6, 0x8e, 0x46, 0x02, 0x26, 0x81, + 0x26, 0x04, 0x00, 0x32, 0xfe, 0xe8, 0x2a, 0x05, 0xc3, 0x90, 0xc7, 0x86, 0x2e, 0x02, 0x04, 0x00, + 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xc6, 0x86, + 0x69, 0x02, 0x00, 0xc6, 0x86, 0x78, 0x02, 0x00, 0xe8, 0xd1, 0xf8, 0x8e, 0x46, 0x02, 0x26, 0xc7, + 0x06, 0x10, 0x00, 0x04, 0x00, 0x32, 0xc0, 0xe8, 0x42, 0x15, 0x33, 0xc0, 0x88, 0x86, 0x88, 0x02, + 0x88, 0x86, 0x89, 0x02, 0xc6, 0x86, 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64, 0x01, 0xf8, 0x05, 0xc6, + 0x86, 0x69, 0x01, 0x02, 0xc6, 0x86, 0x68, 0x01, 0x02, 0xc7, 0x86, 0x66, 0x01, 0x20, 0x03, 0x8e, + 0x46, 0x02, 0x26, 0xc7, 0x06, 0x1c, 0x00, 0x00, 0x00, 0xbe, 0xb7, 0x45, 0xe8, 0x4d, 0xf6, 0xbe, + 0x11, 0x46, 0xe8, 0x47, 0xf6, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xe8, 0xed, 0x0f, 0xc3, + 0xc7, 0x86, 0x2e, 0x02, 0x05, 0x00, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xe8, 0x6e, 0xf8, 0xf6, 0x86, + 0x6e, 0x02, 0x01, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x16, 0xc6, 0x86, 0x72, 0x02, 0x01, 0xbe, 0x35, + 0x46, 0xe8, 0x18, 0xf6, 0xbe, 0x3b, 0x46, 0xe8, 0x12, 0xf6, 0xbe, 0x23, 0x46, 0xe8, 0x0c, 0xf6, + 0xbe, 0x4d, 0x46, 0xe8, 0x06, 0xf6, 0xc7, 0x86, 0xcc, 0x02, 0x01, 0x00, 0xc6, 0x86, 0x76, 0x02, + 0x01, 0xe8, 0x7e, 0x12, 0xc3, 0x90, 0xc7, 0x86, 0x2e, 0x02, 0x07, 0x00, 0xc6, 0x86, 0x68, 0x02, + 0x01, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xbe, 0xf3, 0x45, 0xe8, 0xdb, + 0xf5, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x75, 0x0d, 0xc6, 0x86, 0x6e, 0x02, 0x01, 0xb8, 0x00, 0x80, + 0xe8, 0x1f, 0x29, 0xeb, 0x0a, 0x83, 0xa6, 0x06, 0x02, 0xdf, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6, + 0x86, 0x08, 0x01, 0x00, 0xe8, 0x4e, 0xfa, 0xe8, 0xfd, 0xf9, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, + 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04, 0x00, 0xff, 0xf7, 0xe8, 0xc7, 0xf9, 0x8e, 0x46, + 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01, 0xe8, 0xa1, 0xf0, 0xc7, 0x86, 0xc4, 0x01, 0x14, 0x00, + 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, 0xbe, 0xf9, 0x45, 0xe8, 0x80, 0xf5, 0xc3, 0x90, 0xc7, 0x86, + 0x32, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xc2, 0x01, 0xff, 0xff, 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, + 0xc7, 0x86, 0xc4, 0x01, 0x14, 0x00, 0x80, 0x7e, 0x07, 0x10, 0x74, 0x44, 0x32, 0xc0, 0xe8, 0x1b, + 0x14, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x02, 0xeb, 0x37, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, + 0x00, 0x01, 0x83, 0xa6, 0x06, 0x02, 0xdf, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0x5b, 0x02, + 0x01, 0x74, 0x1d, 0xf6, 0x86, 0x66, 0x02, 0x01, 0x74, 0x16, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x75, + 0x0f, 0xc6, 0x86, 0x63, 0x02, 0x01, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75, 0x03, 0xe8, 0x88, 0x0e, + 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc7, 0x86, 0x32, 0x02, 0x02, + 0x00, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xe8, 0x43, 0xf7, 0xe8, 0x12, 0xf9, 0xbe, 0xd5, 0x45, 0xe8, + 0xfa, 0xf4, 0xe8, 0x1e, 0x0e, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc7, + 0x86, 0x32, 0x02, 0x03, 0x00, 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc4, 0x01, 0x0a, + 0x00, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x0f, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, + 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f, 0xc6, 0x86, 0x5a, 0x02, 0x00, 0xc6, 0x86, 0x69, 0x02, + 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8, 0xf3, 0xf6, 0x81, 0xa6, 0x06, 0x02, 0xff, 0x2f, 0x83, + 0x8e, 0x06, 0x02, 0x20, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xbe, 0x9f, 0x45, 0xe8, 0x9d, 0xf4, 0xbe, + 0xc3, 0x45, 0xe8, 0x97, 0xf4, 0xc7, 0x86, 0xb2, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xb4, 0x02, 0x01, + 0x00, 0xe8, 0x5e, 0x0d, 0xc3, 0x90, 0xff, 0x86, 0x44, 0x02, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, + 0x0c, 0x00, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00, 0x04, 0xf6, 0x86, 0x5f, 0x02, + 0x01, 0x75, 0x03, 0xe8, 0x04, 0x0d, 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, + 0xfe, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x75, 0x26, 0xc6, 0x86, 0x68, 0x02, 0x00, 0xc6, 0x86, 0x69, + 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x82, 0xf6, 0xe8, 0x13, 0xf6, 0xbe, 0xc9, 0x45, + 0xe8, 0x39, 0xf4, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfb, 0xeb, 0x60, 0xc6, 0x86, + 0x6d, 0x02, 0x01, 0xf6, 0x86, 0x6c, 0x02, 0x01, 0x75, 0x54, 0xe8, 0xf3, 0xf5, 0xe8, 0xfb, 0xec, + 0xc6, 0x86, 0x68, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xbe, 0xc9, 0x45, 0xe8, 0x0c, 0xf4, + 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, + 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0x30, 0x38, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, + 0x10, 0x00, 0x04, 0x00, 0x33, 0xc0, 0x88, 0x86, 0x88, 0x02, 0x88, 0x86, 0x89, 0x02, 0xc6, 0x86, + 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64, 0x01, 0xf8, 0x05, 0xc6, 0x86, 0x69, 0x01, 0x02, 0xc3, 0x90, + 0xff, 0x86, 0x44, 0x02, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0x8e, 0x46, 0x02, + 0x26, 0x83, 0x0e, 0x10, 0x00, 0x04, 0xc7, 0x86, 0xae, 0x02, 0x02, 0x00, 0xc7, 0x86, 0xb0, 0x02, + 0x08, 0x00, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, + 0x7f, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0xce, 0xf5, 0xf6, 0x86, + 0x81, 0x02, 0x01, 0x75, 0x06, 0xbe, 0x93, 0x45, 0xe8, 0x81, 0xf3, 0x81, 0xa6, 0x06, 0x02, 0xff, + 0x6f, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc3, 0x90, 0x8e, 0x46, + 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0x83, 0xbe, 0xc6, 0x01, 0x00, 0x74, 0x0d, 0x8b, 0x86, + 0xc6, 0x01, 0xc7, 0x86, 0xc6, 0x01, 0x00, 0x00, 0xe8, 0x45, 0x0f, 0xbe, 0x9f, 0x45, 0xe8, 0x4b, + 0xf3, 0xc3, 0xc7, 0x86, 0x32, 0x02, 0x01, 0x00, 0xc7, 0x86, 0x30, 0x02, 0x02, 0x00, 0x32, 0xc0, + 0xe8, 0xf9, 0x11, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x09, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, + 0x00, 0x01, 0xc3, 0x90, 0xc7, 0x86, 0x30, 0x02, 0x03, 0x00, 0xff, 0x86, 0x44, 0x02, 0x8e, 0x46, + 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc6, 0x86, 0x68, 0x02, 0x00, 0xc6, 0x86, 0x72, 0x02, + 0x00, 0xbe, 0x1d, 0x46, 0xe8, 0x05, 0xf3, 0xbe, 0x29, 0x46, 0xe8, 0xff, 0xf2, 0xbe, 0x41, 0x46, + 0xe8, 0xf9, 0xf2, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8, 0x31, 0xf5, 0x81, 0x8e, 0x06, 0x02, 0x04, + 0x50, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0x61, 0x02, 0x01, 0x74, 0x06, 0x81, 0x8e, 0x06, + 0x02, 0x00, 0x80, 0xe8, 0x80, 0x2d, 0xe8, 0x71, 0x0b, 0xc3, 0xc7, 0x86, 0x30, 0x02, 0x04, 0x00, + 0xbe, 0x1d, 0x46, 0xe8, 0xc6, 0xf2, 0xbe, 0x29, 0x46, 0xe8, 0xc0, 0xf2, 0x81, 0xa6, 0x06, 0x02, + 0xfb, 0x6f, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc3, 0xc7, 0x86, + 0x30, 0x02, 0x05, 0x00, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, + 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xcc, 0x36, 0x81, 0xa6, + 0x06, 0x02, 0xfb, 0x2f, 0x83, 0x8e, 0x06, 0x02, 0x20, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xe8, 0xef, + 0x00, 0xc3, 0xc7, 0x86, 0x30, 0x02, 0x01, 0x00, 0xc3, 0x90, 0xc3, 0x53, 0x50, 0x89, 0x86, 0x22, + 0x01, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x0f, 0x50, 0xe8, 0x62, 0xea, 0xe8, 0x5f, 0x24, 0xc6, + 0x46, 0x07, 0x00, 0x58, 0xe9, 0x9d, 0x00, 0xf6, 0x86, 0x08, 0x01, 0x01, 0x74, 0x05, 0xe8, 0xa1, + 0x25, 0xeb, 0x57, 0x83, 0xf8, 0x10, 0x75, 0x08, 0x81, 0x8e, 0x1e, 0x01, 0x00, 0x80, 0xeb, 0x4a, + 0x83, 0x8e, 0x1e, 0x01, 0x02, 0x8b, 0x9e, 0x06, 0x02, 0x83, 0xf8, 0x01, 0x75, 0x04, 0x81, 0xcb, + 0x00, 0x04, 0x83, 0xf8, 0x0c, 0x75, 0x04, 0x81, 0xcb, 0x00, 0x08, 0x83, 0xf8, 0x0b, 0x75, 0x03, + 0x83, 0xcb, 0x02, 0x83, 0xf8, 0x09, 0x75, 0x03, 0x83, 0xcb, 0x04, 0x83, 0xf8, 0x0a, 0x75, 0x04, + 0x81, 0xcb, 0x00, 0x01, 0x83, 0xf8, 0x06, 0x75, 0x03, 0x83, 0xcb, 0x01, 0x83, 0xf8, 0x0f, 0x74, + 0x09, 0x89, 0x9e, 0x06, 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6, 0x46, 0x07, 0x12, 0xc6, 0x46, + 0x09, 0x1e, 0xf6, 0x86, 0xa7, 0x02, 0x01, 0x74, 0x1a, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, + 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, + 0xe8, 0x07, 0x36, 0xf6, 0x86, 0xa5, 0x02, 0x01, 0x75, 0x02, 0xeb, 0x08, 0xc6, 0x46, 0x07, 0x10, + 0xc6, 0x46, 0x09, 0x00, 0x58, 0x5b, 0xc3, 0x90, 0xc7, 0x86, 0x2e, 0x02, 0x01, 0x00, 0xc3, 0xb9, + 0x01, 0x01, 0x38, 0xc8, 0x75, 0x19, 0x8b, 0xb6, 0xf6, 0x00, 0x81, 0xe6, 0x00, 0xc0, 0x81, 0xfe, + 0x00, 0x80, 0x75, 0x0b, 0xc6, 0x86, 0x56, 0x02, 0x01, 0xbe, 0xa5, 0x45, 0xe8, 0x8d, 0xf1, 0xc3, + 0xc3, 0x90, 0x50, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x02, 0x74, 0x06, 0x81, 0x8e, 0xf6, 0x00, 0x00, + 0x01, 0xc6, 0x86, 0x90, 0x02, 0x01, 0xe8, 0xb3, 0xf3, 0xe8, 0x02, 0x00, 0x58, 0xc3, 0xc7, 0x86, + 0x93, 0x02, 0x00, 0x00, 0xc7, 0x86, 0x95, 0x02, 0x05, 0x00, 0xb8, 0x05, 0x00, 0xe8, 0x1a, 0x00, + 0xc7, 0x86, 0x9d, 0x02, 0x05, 0x00, 0xc3, 0x90, 0xc6, 0x86, 0x90, 0x02, 0x00, 0x06, 0x8e, 0x46, + 0x02, 0x26, 0x83, 0x26, 0x00, 0x00, 0xdf, 0x07, 0xc3, 0x90, 0x52, 0x53, 0x51, 0xb9, 0x10, 0x27, + 0x83, 0xe0, 0x3f, 0x8b, 0xd0, 0xe5, 0x00, 0x50, 0x8b, 0x1e, 0x34, 0x55, 0x53, 0xb8, 0xe7, 0x03, + 0xf7, 0xe2, 0xf7, 0xf1, 0x5b, 0x03, 0xd8, 0x58, 0x03, 0xc2, 0x3b, 0xc1, 0x72, 0x03, 0x2b, 0xc1, + 0x43, 0x8b, 0xcb, 0x41, 0x89, 0x9e, 0x97, 0x02, 0x89, 0x8e, 0x99, 0x02, 0x89, 0x86, 0x9b, 0x02, + 0x59, 0x5b, 0x5a, 0xc3, 0xa1, 0x34, 0x55, 0x3b, 0x86, 0x99, 0x02, 0x74, 0x0e, 0x3b, 0x86, 0x97, + 0x02, 0x75, 0x0d, 0xe5, 0x00, 0x3b, 0x86, 0x9b, 0x02, 0x72, 0x05, 0xb8, 0x01, 0x00, 0xeb, 0x02, + 0x2b, 0xc0, 0x85, 0xc0, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x04, 0x74, 0x0a, 0xf7, 0x86, 0xf6, 0x00, + 0x00, 0x02, 0x75, 0x02, 0xeb, 0x05, 0xb8, 0x01, 0x00, 0xeb, 0x02, 0x2b, 0xc0, 0x85, 0xc0, 0xc3, + 0xe8, 0xc1, 0xff, 0x74, 0x1e, 0xb8, 0x02, 0x00, 0xe8, 0x7f, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa1, + 0x14, 0x00, 0x25, 0x24, 0x01, 0x8b, 0xd8, 0x33, 0x86, 0x93, 0x02, 0x75, 0x0a, 0xff, 0x8e, 0x9d, + 0x02, 0x74, 0x02, 0xeb, 0x77, 0xeb, 0x23, 0xc7, 0x86, 0x9d, 0x02, 0x05, 0x00, 0x89, 0x9e, 0x93, + 0x02, 0xa9, 0x04, 0x00, 0x74, 0x12, 0xf7, 0xc3, 0x04, 0x00, 0x74, 0x07, 0xc6, 0x86, 0x91, 0x02, + 0x01, 0xeb, 0x05, 0xc6, 0x86, 0x91, 0x02, 0x00, 0xeb, 0x52, 0x8b, 0x86, 0x93, 0x02, 0x8e, 0x46, + 0x02, 0x26, 0xf7, 0x06, 0x00, 0x00, 0x02, 0x00, 0x74, 0x24, 0x25, 0x04, 0x01, 0x3d, 0x04, 0x01, + 0x75, 0x3a, 0xe8, 0x81, 0xff, 0x74, 0x2c, 0x81, 0x8e, 0xf6, 0x00, 0x00, 0x01, 0xe8, 0x9c, 0xf2, + 0xc7, 0x86, 0x93, 0x02, 0x00, 0x00, 0xb8, 0x05, 0x00, 0xe8, 0x0e, 0xff, 0xeb, 0x1e, 0x25, 0x24, + 0x01, 0x3d, 0x24, 0x01, 0x75, 0x16, 0xe8, 0x5d, 0xff, 0x74, 0x08, 0x81, 0xa6, 0xf6, 0x00, 0xff, + 0xfe, 0xeb, 0xda, 0xe8, 0xe2, 0xfe, 0xb8, 0x0e, 0x00, 0xe8, 0xbf, 0xfd, 0xc3, 0x90, 0x55, 0x1e, + 0x06, 0x33, 0xed, 0x8e, 0xdd, 0x8b, 0x2e, 0x52, 0x55, 0x8e, 0x46, 0x02, 0xeb, 0x00, 0x60, 0xfa, + 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x04, 0x00, 0x89, 0x86, 0x18, 0x01, 0xc7, 0x86, 0x1c, 0x01, 0x01, + 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x06, 0x00, 0x89, 0x86, 0x1a, 0x01, 0xb8, 0x07, 0x00, 0x8e, + 0x46, 0x02, 0x26, 0xa3, 0x06, 0x00, 0xb8, 0xff, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x04, 0x00, + 0xfb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x08, 0x00, 0x8b, 0xd8, 0x81, 0xe3, 0xff, 0xfc, 0x8e, 0x46, + 0x02, 0x26, 0x89, 0x1e, 0x08, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x0a, 0x00, 0x8e, 0x46, + 0x02, 0x26, 0x89, 0x1e, 0x0a, 0x00, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0xa9, 0x00, 0x08, 0x74, + 0x0f, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, 0x05, 0xe8, 0x79, 0x32, 0xeb, 0x03, 0xe8, 0xb4, 0x2d, + 0xa9, 0x00, 0x01, 0x75, 0x20, 0xf7, 0x86, 0xa3, 0x02, 0x01, 0x00, 0x75, 0x1f, 0xa9, 0xcd, 0x01, + 0x74, 0x1a, 0x80, 0xbe, 0x6a, 0x01, 0x0a, 0x72, 0x0c, 0xc7, 0x86, 0xa3, 0x02, 0x01, 0x00, 0x81, + 0x8e, 0x18, 0x01, 0xcd, 0x00, 0xfe, 0x86, 0x6a, 0x01, 0xe8, 0xfc, 0x2e, 0xa9, 0x00, 0x04, 0x74, + 0x29, 0xf7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0x75, 0x21, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x04, + 0x00, 0x00, 0x04, 0xe8, 0x66, 0xed, 0xc7, 0x44, 0x02, 0x01, 0x00, 0x89, 0x44, 0x04, 0xc7, 0x86, + 0x0a, 0x01, 0x01, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x70, 0xed, 0xa9, 0x00, 0x10, 0x74, 0x27, 0x80, + 0xbe, 0x0c, 0x01, 0x01, 0x74, 0x20, 0xf6, 0x86, 0xb8, 0x01, 0x01, 0x75, 0x19, 0xe8, 0x3c, 0xed, + 0xf7, 0xc6, 0xff, 0xff, 0x74, 0x10, 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6, 0x86, 0xb8, 0x01, 0x01, + 0x8d, 0x7e, 0x16, 0xe8, 0x44, 0xed, 0xa9, 0x00, 0x20, 0x74, 0x2e, 0x80, 0xbe, 0x0c, 0x01, 0x01, + 0x75, 0x07, 0xc6, 0x86, 0x0d, 0x01, 0x01, 0xeb, 0x20, 0xf6, 0x86, 0xb9, 0x01, 0x01, 0x75, 0x19, + 0xe8, 0x09, 0xed, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0x10, 0xc7, 0x44, 0x02, 0x04, 0x00, 0xc6, 0x86, + 0xb9, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x11, 0xed, 0xfa, 0x8b, 0x86, 0x18, 0x01, 0x8e, 0x46, + 0x02, 0x26, 0xa3, 0x04, 0x00, 0xc7, 0x86, 0x1c, 0x01, 0x00, 0x00, 0x8b, 0x86, 0x1a, 0x01, 0x8e, + 0x46, 0x02, 0x26, 0xa3, 0x06, 0x00, 0x61, 0x07, 0x1f, 0x5d, 0xcf, 0x50, 0x25, 0x00, 0x02, 0x8e, + 0x46, 0x02, 0x26, 0xa3, 0x08, 0x00, 0x8b, 0x86, 0xc2, 0x02, 0x40, 0x89, 0x86, 0xc2, 0x02, 0x83, + 0xf8, 0x01, 0x75, 0x08, 0x56, 0xbe, 0xf9, 0x45, 0xe8, 0xb1, 0xee, 0x5e, 0x3b, 0x86, 0xc4, 0x01, + 0x76, 0x0a, 0x80, 0xbe, 0x61, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x04, 0x2f, 0x58, 0xc3, 0x8d, 0x71, + 0x18, 0x8b, 0x49, 0x14, 0x86, 0xcd, 0x83, 0xe9, 0x04, 0x7e, 0x1b, 0x33, 0xc0, 0x03, 0xf0, 0x8a, + 0x04, 0x0a, 0xc0, 0x74, 0x11, 0x3a, 0x54, 0x01, 0x74, 0x17, 0x32, 0xe4, 0x3c, 0xff, 0x74, 0x0a, + 0x2b, 0xc8, 0x72, 0x02, 0x77, 0xe7, 0x33, 0xc0, 0xf9, 0xc3, 0x8b, 0x44, 0x02, 0x86, 0xc4, 0xeb, + 0xef, 0x0a, 0xe4, 0x75, 0xf1, 0x38, 0xf0, 0x75, 0xed, 0x8d, 0x74, 0x02, 0xf8, 0xc3, 0x8c, 0xd8, + 0x8e, 0xc0, 0x8b, 0xb6, 0x52, 0x15, 0x8b, 0xbe, 0x54, 0x15, 0x47, 0xa5, 0xa5, 0xa5, 0x8b, 0x4f, + 0x04, 0x83, 0xc1, 0x07, 0x80, 0xe1, 0xfe, 0x8b, 0xc7, 0x2b, 0xc3, 0x2b, 0xc8, 0x76, 0x0a, 0x81, + 0xf9, 0x00, 0x01, 0x73, 0x09, 0xd1, 0xe9, 0xf3, 0xa5, 0x8b, 0x07, 0xe9, 0xc9, 0x01, 0xb9, 0x19, + 0x00, 0xf3, 0xa5, 0x33, 0xff, 0xf6, 0x47, 0x0e, 0x80, 0x74, 0x0e, 0x8b, 0x47, 0x14, 0x83, 0xe0, + 0x1f, 0x74, 0x0f, 0xa8, 0x01, 0x75, 0x0b, 0x8b, 0xf8, 0xba, 0x80, 0x09, 0x68, 0x5d, 0x24, 0xe9, + 0xde, 0x05, 0xe9, 0xcc, 0x02, 0xc3, 0x80, 0x7f, 0x17, 0x02, 0x75, 0xf9, 0x50, 0x56, 0x8b, 0xb6, + 0xc4, 0x05, 0x8b, 0x04, 0x5e, 0x3b, 0x86, 0xc2, 0x01, 0x74, 0x07, 0x89, 0x86, 0xc2, 0x01, 0x58, + 0xeb, 0x3d, 0x58, 0xeb, 0x12, 0x8a, 0x4f, 0x07, 0x80, 0xe1, 0x3f, 0x74, 0xd8, 0x8a, 0xe9, 0x86, + 0x8e, 0xfa, 0x01, 0x38, 0xcd, 0x75, 0x18, 0x57, 0x51, 0x8d, 0xbe, 0xfc, 0x01, 0x8d, 0x77, 0x0e, + 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x06, 0x59, 0x5f, 0xeb, 0xb6, 0x57, + 0x51, 0x8d, 0xbe, 0xfc, 0x01, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x59, 0x5f, 0xeb, + 0x0d, 0x8b, 0x7e, 0x04, 0x58, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00, 0x74, 0xf7, 0x80, 0x7e, + 0x06, 0x0e, 0x74, 0x08, 0x80, 0x7e, 0x06, 0x48, 0x74, 0x02, 0xeb, 0xe9, 0x50, 0x8c, 0xd8, 0x8e, + 0xc0, 0x8b, 0x07, 0xa9, 0x00, 0x40, 0x75, 0xdc, 0x0d, 0x00, 0x40, 0x89, 0x07, 0xe8, 0x8a, 0x00, + 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x03, 0x80, 0xe1, 0xfe, 0x89, 0x7e, 0x04, 0x8b, 0xbe, 0xbe, 0x01, + 0x3b, 0xfe, 0x72, 0x11, 0x8d, 0x86, 0x52, 0x08, 0x05, 0xff, 0x00, 0x2b, 0xc7, 0x3b, 0xc1, 0x7d, + 0x0a, 0x8d, 0xbe, 0x52, 0x08, 0x2b, 0xf7, 0x3b, 0xf1, 0x7c, 0xa6, 0x8b, 0xd7, 0x8c, 0xd8, 0x8e, + 0xc0, 0x33, 0xc0, 0x8b, 0xf3, 0xd1, 0xe9, 0x83, 0xc7, 0x02, 0x49, 0xad, 0xf3, 0xa5, 0x8b, 0xcf, + 0xc7, 0x05, 0x00, 0x00, 0x8b, 0xfa, 0x89, 0x4d, 0x02, 0x51, 0x8b, 0x4d, 0x04, 0x83, 0xe9, 0x04, + 0x89, 0x4d, 0x04, 0x59, 0x89, 0x05, 0x8d, 0x86, 0x52, 0x08, 0x3b, 0xf8, 0x75, 0x0e, 0x8b, 0x86, + 0xbc, 0x01, 0x3b, 0x86, 0xbe, 0x01, 0x75, 0x1c, 0x89, 0xbe, 0xbc, 0x01, 0x89, 0x8e, 0xbe, 0x01, + 0x8b, 0x7e, 0x04, 0xc7, 0x86, 0xc0, 0x01, 0x00, 0x00, 0xb9, 0x40, 0x60, 0x8e, 0xc1, 0xe8, 0x77, + 0x21, 0xe9, 0x4d, 0xff, 0x97, 0x89, 0x45, 0x02, 0xeb, 0xe2, 0x8b, 0xb6, 0xbc, 0x01, 0xf7, 0x86, + 0xc0, 0x01, 0x01, 0x00, 0x75, 0x0f, 0x81, 0x3c, 0x00, 0x80, 0x75, 0x05, 0x8b, 0x74, 0x02, 0xeb, + 0xf5, 0x89, 0xb6, 0xbc, 0x01, 0xc3, 0xf7, 0x07, 0x01, 0x09, 0x74, 0x03, 0xe9, 0x92, 0x01, 0xf7, + 0x07, 0x00, 0x10, 0x75, 0x33, 0x68, 0x3e, 0x23, 0xe9, 0xeb, 0x24, 0xa8, 0x02, 0x74, 0x21, 0x80, + 0x7e, 0x08, 0x00, 0x75, 0x1b, 0x80, 0xbe, 0x5e, 0x02, 0x00, 0x74, 0x14, 0x24, 0x28, 0x3c, 0x28, + 0x75, 0x0e, 0xf6, 0x47, 0x0e, 0x80, 0x75, 0x67, 0x81, 0x8e, 0xda, 0x02, 0x80, 0x00, 0xeb, 0x5f, + 0xeb, 0x5d, 0xe9, 0x39, 0xfe, 0x90, 0xeb, 0xd3, 0xeb, 0x38, 0x8b, 0x47, 0x14, 0x83, 0xe0, 0x1f, + 0x74, 0x06, 0xa8, 0x01, 0x8b, 0xf8, 0x74, 0x4f, 0xe9, 0x46, 0x01, 0x50, 0x8b, 0x9e, 0xb2, 0x01, + 0x8b, 0x07, 0xa9, 0x00, 0x20, 0x74, 0x0b, 0xff, 0x86, 0x3c, 0x02, 0x8b, 0x4f, 0x04, 0x01, 0x8e, + 0x3e, 0x02, 0xe8, 0xb4, 0x03, 0x75, 0xcb, 0xf6, 0x47, 0x07, 0x40, 0x74, 0x05, 0xe8, 0xd1, 0x03, + 0xeb, 0x78, 0xf7, 0x86, 0xb6, 0x01, 0x00, 0x02, 0x75, 0x11, 0xa9, 0x01, 0x09, 0x75, 0x6b, 0x80, + 0x7e, 0x07, 0x10, 0x74, 0x65, 0x80, 0x7e, 0x07, 0x12, 0x74, 0x5f, 0xa8, 0x28, 0x75, 0xa7, 0x33, + 0xff, 0xf6, 0x47, 0x0e, 0x80, 0x75, 0xa3, 0x8b, 0x47, 0x04, 0x83, 0xf8, 0x12, 0x77, 0x05, 0x33, + 0xc0, 0xe9, 0xb0, 0x01, 0x83, 0xe8, 0x12, 0x2b, 0xc7, 0x83, 0xf8, 0x04, 0x7c, 0x40, 0x8b, 0x49, + 0x16, 0x88, 0xae, 0x04, 0x02, 0x51, 0x80, 0xe1, 0xf0, 0x80, 0xf9, 0x00, 0x74, 0x09, 0x80, 0xf9, + 0x30, 0x74, 0x04, 0x59, 0xe9, 0xca, 0x00, 0x59, 0x0b, 0xff, 0x74, 0x0f, 0xf6, 0xc1, 0x0f, 0x74, + 0x19, 0x80, 0xf9, 0x33, 0x74, 0x14, 0x80, 0xf9, 0x03, 0x74, 0x0f, 0x86, 0xc4, 0x39, 0x41, 0x14, + 0x86, 0xc4, 0x75, 0x02, 0xeb, 0x0c, 0xe9, 0x66, 0x01, 0x90, 0xe9, 0xa4, 0x00, 0x90, 0xe9, 0x63, + 0x01, 0x90, 0xf6, 0x86, 0x90, 0x02, 0x01, 0x74, 0x11, 0xe8, 0x7c, 0xfa, 0x80, 0x7e, 0x06, 0x04, + 0x75, 0x08, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x02, 0xee, 0xf6, 0x86, 0x92, 0x02, 0x01, 0x74, + 0x20, 0xc6, 0x86, 0x92, 0x02, 0x00, 0x50, 0x8b, 0x86, 0xf8, 0x00, 0x33, 0x86, 0xf6, 0x00, 0xa9, + 0x00, 0x01, 0x58, 0x74, 0x0c, 0xb8, 0x0e, 0x00, 0xe8, 0x30, 0xf9, 0xeb, 0x64, 0x90, 0xe9, 0x2f, + 0x01, 0x80, 0xfd, 0x15, 0x77, 0x11, 0x80, 0xfd, 0x01, 0x74, 0xf3, 0x80, 0xfd, 0x09, 0x74, 0xee, + 0x80, 0xfd, 0x0a, 0x74, 0xe9, 0xeb, 0x11, 0x80, 0xfd, 0x20, 0x72, 0xe2, 0x80, 0xfd, 0x29, 0x77, + 0xdd, 0x80, 0xfd, 0x21, 0x74, 0xd8, 0xeb, 0x92, 0x80, 0xfd, 0x10, 0x76, 0x02, 0xeb, 0x0a, 0x80, + 0xfd, 0x0e, 0x73, 0x28, 0x80, 0xfd, 0x15, 0x77, 0x23, 0x53, 0x8b, 0xd9, 0xc1, 0xeb, 0x08, 0x80, + 0xe1, 0x0f, 0x3a, 0x8f, 0x76, 0x04, 0x74, 0x13, 0x83, 0xfb, 0x0b, 0x74, 0x09, 0x83, 0xfb, 0x0c, + 0x74, 0x04, 0x5b, 0xe9, 0xd3, 0x00, 0x80, 0xf9, 0x08, 0x75, 0xf7, 0x5b, 0xe9, 0x81, 0x01, 0x5b, + 0x5f, 0x8b, 0x9e, 0xb2, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00, 0x74, 0x28, 0x80, 0x7e, 0x06, + 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x1c, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x08, 0x74, + 0x06, 0x68, 0x91, 0x24, 0xe9, 0x2e, 0xfd, 0xf7, 0x86, 0x12, 0x01, 0x80, 0x00, 0x74, 0x06, 0x68, + 0x91, 0x24, 0xe9, 0x01, 0xfd, 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xb2, 0x01, 0x8b, 0xc3, 0x83, 0xe8, + 0x02, 0x3b, 0x86, 0x52, 0x15, 0x77, 0x04, 0x8b, 0x86, 0x54, 0x15, 0x8e, 0x46, 0x02, 0x26, 0xa3, + 0x38, 0x00, 0x80, 0xbe, 0x2d, 0x01, 0x01, 0x75, 0x1b, 0x2d, 0x00, 0x02, 0x3b, 0x86, 0x52, 0x15, + 0x73, 0x0e, 0x53, 0x8b, 0xd8, 0x2b, 0x9e, 0x52, 0x15, 0x8b, 0x86, 0x54, 0x15, 0x2b, 0xc3, 0x5b, + 0x26, 0xa3, 0x6c, 0x00, 0xfa, 0x8b, 0x07, 0xa9, 0x00, 0x80, 0x74, 0x17, 0xfb, 0xff, 0x86, 0x3c, + 0x01, 0x83, 0xbe, 0x3c, 0x01, 0x05, 0x77, 0x1c, 0x8a, 0x4e, 0x09, 0x3a, 0x4e, 0x08, 0x75, 0x14, + 0xe9, 0x2f, 0xfe, 0xc6, 0x86, 0xb9, 0x01, 0x00, 0xfb, 0xc7, 0x86, 0x3c, 0x01, 0x00, 0x00, 0x58, + 0xc3, 0xe9, 0x5d, 0xff, 0xe8, 0x95, 0xe8, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0xe6, 0xc7, 0x44, 0x02, + 0x04, 0x00, 0xc6, 0x86, 0xb9, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x9d, 0xe8, 0xeb, 0xda, 0xba, + 0x80, 0x02, 0xeb, 0x1d, 0xba, 0x80, 0x01, 0xeb, 0x18, 0xba, 0x80, 0x04, 0xeb, 0x13, 0x5f, 0x5b, + 0xf7, 0x86, 0x12, 0x01, 0x00, 0x10, 0x74, 0x06, 0x68, 0x91, 0x24, 0xe9, 0xb8, 0xfc, 0xba, 0x80, + 0x03, 0x33, 0xc0, 0x8e, 0xc0, 0x68, 0x5d, 0x24, 0xe9, 0x25, 0x02, 0x33, 0xd2, 0x32, 0xed, 0x8a, + 0x4d, 0xff, 0x89, 0x55, 0x02, 0x83, 0xc7, 0x05, 0xe2, 0xf8, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x74, + 0x38, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x0b, 0xc6, 0x46, 0x09, 0x04, 0xc6, 0x86, 0x5f, 0x02, 0x00, + 0xeb, 0x24, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x21, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xc6, 0x86, 0x69, + 0x02, 0x01, 0xe8, 0x57, 0xec, 0xbe, 0xc3, 0x45, 0xe8, 0x11, 0xea, 0x50, 0x53, 0x33, 0xc0, 0x8e, + 0xc0, 0xe8, 0xa6, 0x02, 0x5b, 0x58, 0xbb, 0x00, 0x00, 0x8b, 0xf8, 0x8b, 0xf3, 0x5b, 0x57, 0x53, + 0x68, 0x5b, 0x24, 0xff, 0x66, 0x12, 0xeb, 0x87, 0x8b, 0xc7, 0x8b, 0xbf, 0x8c, 0x04, 0x0b, 0xff, + 0x78, 0xf4, 0x74, 0xa6, 0x03, 0xfd, 0xf6, 0x45, 0x01, 0x80, 0x75, 0x02, 0xeb, 0x8d, 0xe9, 0x21, + 0x01, 0xe9, 0x03, 0x01, 0x5f, 0x5b, 0xba, 0x80, 0x08, 0xe9, 0x75, 0xff, 0x8b, 0x54, 0x02, 0x86, + 0xd6, 0x83, 0xc6, 0x02, 0xb0, 0x04, 0xeb, 0x51, 0x5f, 0x5b, 0xba, 0x80, 0x05, 0xe9, 0x61, 0xff, + 0x53, 0x8d, 0x71, 0x18, 0x32, 0xff, 0x8a, 0xdd, 0xd1, 0xe3, 0x83, 0xe8, 0x04, 0x0b, 0xc0, 0x74, + 0xb7, 0x89, 0x46, 0x04, 0x57, 0x8b, 0xbf, 0x8c, 0x04, 0x0b, 0xff, 0x74, 0xc4, 0x79, 0x03, 0xe9, + 0x2c, 0xff, 0x03, 0xfd, 0x8e, 0xc7, 0x33, 0xc0, 0x32, 0xed, 0x8a, 0x4d, 0xff, 0x89, 0x45, 0x02, + 0x83, 0xc7, 0x05, 0xe2, 0xf8, 0x33, 0xd2, 0x03, 0xf2, 0x8a, 0x4c, 0x01, 0x8a, 0x14, 0x0a, 0xd2, + 0x74, 0xb6, 0x80, 0xfa, 0xff, 0x74, 0xa5, 0xb0, 0x02, 0x29, 0x56, 0x04, 0x72, 0xaa, 0x0a, 0xc9, + 0x78, 0x92, 0x8a, 0xe1, 0x80, 0xe1, 0x3f, 0x8c, 0xc7, 0x8a, 0x6d, 0xff, 0xeb, 0x12, 0x80, 0x7d, + 0x04, 0xff, 0x74, 0x15, 0xeb, 0x92, 0xe9, 0x7b, 0xff, 0xfe, 0xcd, 0x74, 0xf9, 0x83, 0xc7, 0x05, + 0x3a, 0x0d, 0x75, 0xf5, 0x3a, 0x55, 0x04, 0x75, 0xe5, 0x8d, 0x44, 0x02, 0x87, 0x45, 0x02, 0x0b, + 0xc0, 0x74, 0x09, 0xf6, 0x45, 0x01, 0x80, 0x75, 0xdd, 0x89, 0x45, 0x02, 0x83, 0x7e, 0x04, 0x00, + 0x75, 0xa5, 0x33, 0xc0, 0x8c, 0xc6, 0xf6, 0x44, 0x01, 0x80, 0x74, 0x0e, 0x39, 0x44, 0x02, 0x74, + 0x60, 0x83, 0xc6, 0x05, 0xf6, 0x44, 0x01, 0x80, 0x75, 0xf2, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x74, + 0x36, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x0b, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xc6, 0x46, 0x09, 0x04, + 0xeb, 0x22, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x1f, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xc6, 0x86, 0x69, + 0x02, 0x01, 0xe8, 0x27, 0xeb, 0xbe, 0xc3, 0x45, 0xe8, 0xe1, 0xe8, 0x33, 0xc0, 0x8e, 0xc0, 0x53, + 0xe8, 0x77, 0x01, 0x5b, 0xbb, 0x00, 0x00, 0x89, 0x5e, 0x04, 0x8b, 0xf3, 0x5f, 0x5b, 0x33, 0xc0, + 0x8e, 0xc0, 0x3b, 0xb6, 0xba, 0x01, 0x73, 0x06, 0x68, 0x5d, 0x24, 0xff, 0x66, 0x12, 0xe9, 0x80, + 0xfd, 0x5f, 0x5b, 0xba, 0x80, 0x07, 0xe9, 0x58, 0xfe, 0x56, 0x57, 0x50, 0x33, 0xc0, 0x8e, 0xc0, + 0x8b, 0xb6, 0x52, 0x15, 0x8b, 0xbe, 0x54, 0x15, 0x83, 0xc7, 0x01, 0xa5, 0xa5, 0xa5, 0x8b, 0xc3, + 0x03, 0x47, 0x04, 0x8b, 0xbe, 0x54, 0x15, 0x3b, 0xc7, 0x7f, 0x02, 0x32, 0xc0, 0x58, 0x5f, 0x5e, + 0xc3, 0x80, 0xbe, 0x2d, 0x01, 0x01, 0x75, 0x57, 0x53, 0x33, 0xff, 0xf6, 0x47, 0x0e, 0x80, 0x74, + 0x0e, 0x8b, 0x47, 0x14, 0x83, 0xe0, 0x1f, 0x74, 0x45, 0xa8, 0x01, 0x75, 0x41, 0x8b, 0xf8, 0x83, + 0xc3, 0x06, 0x8d, 0xb6, 0xec, 0x15, 0x33, 0xc0, 0x33, 0xc9, 0x8a, 0x0c, 0x80, 0xf9, 0x00, 0x74, + 0x2d, 0x53, 0x46, 0x8a, 0x04, 0x03, 0xd8, 0x80, 0x3c, 0x0e, 0x72, 0x02, 0x03, 0xdf, 0x46, 0x8a, + 0x04, 0x3a, 0x07, 0x75, 0x07, 0x5b, 0xfe, 0xc9, 0x74, 0x0a, 0xeb, 0xe5, 0x5b, 0x03, 0xf1, 0x03, + 0xf1, 0x4e, 0xeb, 0xd6, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x72, 0x00, 0x00, 0x01, 0x5b, 0xc3, + 0x8c, 0xd8, 0x8e, 0xc0, 0xf6, 0x41, 0x16, 0x0f, 0x74, 0x60, 0x89, 0x96, 0xe2, 0x02, 0x81, 0xfa, + 0x80, 0x02, 0x74, 0x13, 0xba, 0x09, 0x04, 0xe8, 0x74, 0xf9, 0x72, 0x0b, 0xad, 0x86, 0xe0, 0x89, + 0x86, 0x14, 0x02, 0x86, 0xe0, 0xeb, 0x06, 0x8b, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xde, + 0x02, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x4d, 0x22, 0x57, 0x53, 0xe8, 0x9f, 0x05, 0x5a, 0x5f, 0x72, + 0x29, 0x57, 0xe8, 0x26, 0x00, 0xb8, 0x00, 0x0e, 0xab, 0x47, 0xb0, 0x00, 0xaa, 0x8d, 0xb6, 0xdc, + 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0xe0, 0x02, 0xa5, 0xa5, 0x55, 0x8b, 0xea, 0x8a, 0x47, 0x16, 0x8a, + 0x66, 0x17, 0xab, 0x5d, 0xe8, 0x13, 0x06, 0x8b, 0xda, 0x5f, 0xc3, 0x55, 0x8b, 0xea, 0x8a, 0x43, + 0x16, 0xc0, 0xe0, 0x04, 0x88, 0x41, 0x16, 0xc7, 0x47, 0x06, 0xe0, 0x00, 0x83, 0xe9, 0x06, 0x89, + 0x4f, 0x04, 0x0b, 0xff, 0x75, 0x18, 0x8d, 0x76, 0x0e, 0x8d, 0x7f, 0x08, 0x8c, 0xd8, 0x8e, 0xc0, + 0xa5, 0xa5, 0xa5, 0x8b, 0xd5, 0x5d, 0x8d, 0xb6, 0xf4, 0x02, 0xa5, 0xa5, 0xa5, 0xc3, 0x8b, 0xcf, + 0xd1, 0xe9, 0x8d, 0x76, 0x0e, 0x8d, 0x7f, 0x08, 0x8c, 0xd8, 0x8e, 0xc0, 0xad, 0x24, 0x7f, 0xab, + 0xa5, 0xa5, 0x8b, 0xd5, 0x5d, 0x56, 0x8d, 0xb6, 0xf4, 0x02, 0xad, 0x0c, 0x80, 0xab, 0xa5, 0xa5, + 0x5e, 0xad, 0x80, 0xcc, 0x80, 0xab, 0x49, 0xf3, 0xa5, 0xc3, 0x8b, 0x86, 0x00, 0x03, 0x86, 0xe0, + 0x89, 0x86, 0x10, 0x02, 0x89, 0x86, 0x02, 0x02, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0xfc, 0x01, + 0x8d, 0xb6, 0xf4, 0x02, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0xb9, 0x2a, 0x00, 0xe8, 0xd3, 0x04, 0x72, + 0xd8, 0x8d, 0xb6, 0xe6, 0x02, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, + 0x7f, 0x05, 0xb9, 0x26, 0x00, 0xe8, 0xba, 0x04, 0x72, 0x62, 0x8d, 0xb6, 0x10, 0x03, 0x8b, 0xfb, + 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x66, 0x05, 0x8d, 0x7f, 0x08, 0x8b, 0x4f, + 0x04, 0x83, 0xc1, 0x03, 0x80, 0xe1, 0xfe, 0x57, 0xe8, 0x97, 0x04, 0x5f, 0x8b, 0xd7, 0x72, 0x22, + 0x83, 0xe9, 0x08, 0x8d, 0x7f, 0x04, 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0xc1, 0xab, 0x8b, 0x86, 0x16, + 0x03, 0xab, 0x8b, 0xf2, 0xd1, 0xe9, 0x49, 0xf3, 0xa5, 0xbe, 0x9f, 0x45, 0xe8, 0xdd, 0xe6, 0xe9, + 0x2f, 0x05, 0xc3, 0xb9, 0x26, 0x00, 0xe8, 0x69, 0x04, 0x72, 0x11, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, + 0xb6, 0x36, 0x03, 0x8b, 0xfb, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x15, 0x05, 0xc3, 0xb9, 0x26, 0x00, + 0xe8, 0x69, 0x04, 0x72, 0xf7, 0x8d, 0xb6, 0x5c, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, + 0xe9, 0xf3, 0xa5, 0xc6, 0x86, 0x63, 0x02, 0x01, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, + 0xe8, 0x04, 0x68, 0x9d, 0x2c, 0xe9, 0xe2, 0x04, 0xb9, 0x26, 0x00, 0xe8, 0x3e, 0x04, 0x72, 0xcc, + 0x8d, 0xb6, 0x82, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xc6, 0x86, + 0x63, 0x02, 0x01, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, 0xbd, 0x04, 0x68, 0x9d, 0x2c, + 0xe9, 0xb7, 0x04, 0xb9, 0x18, 0x00, 0xe8, 0x13, 0x04, 0x72, 0xa1, 0x8d, 0xb6, 0xa8, 0x03, 0x8b, + 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x9e, 0x04, 0x83, 0xc1, 0x1c, 0x56, + 0x57, 0x52, 0xe8, 0xf7, 0x03, 0x5a, 0x5f, 0x5e, 0x72, 0x6c, 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x83, + 0xe9, 0x08, 0x8b, 0xc1, 0x8d, 0x7f, 0x04, 0xab, 0xba, 0xe0, 0x00, 0x8b, 0xc2, 0xab, 0x8d, 0xb6, + 0xc8, 0x03, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0xf4, 0x02, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x04, + 0x8d, 0xb6, 0x00, 0x01, 0xa5, 0xa5, 0xa5, 0x83, 0xe9, 0x0e, 0x80, 0xbe, 0x63, 0x01, 0x02, 0x75, + 0x03, 0x83, 0xe9, 0x04, 0x8b, 0xc1, 0x86, 0xe0, 0xab, 0xb8, 0x00, 0x08, 0xab, 0xb8, 0xff, 0x26, + 0xab, 0x83, 0xe9, 0x04, 0x8b, 0xc1, 0x86, 0xe0, 0xab, 0x5e, 0xe9, 0x3d, 0x04, 0xb9, 0x44, 0x00, + 0xe8, 0x99, 0x03, 0x72, 0x11, 0x8d, 0xb6, 0xda, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, + 0xe9, 0xf3, 0xa5, 0xe8, 0x24, 0x04, 0xc3, 0xb9, 0x36, 0x00, 0xe8, 0x7f, 0x03, 0x72, 0xf7, 0xff, + 0x86, 0x52, 0x02, 0x8d, 0xb6, 0x7c, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, + 0xa5, 0x33, 0xc0, 0x8d, 0xbe, 0x96, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe, 0x9e, 0x05, 0xab, 0xab, + 0xaa, 0xe9, 0xf6, 0x03, 0x8d, 0x4d, 0x3a, 0x57, 0x53, 0xe8, 0x50, 0x03, 0x5a, 0x5f, 0x72, 0x5b, + 0x57, 0xe8, 0xd7, 0xfd, 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x26, 0xab, 0x47, 0xb0, 0x22, 0xaa, + 0x8d, 0xb6, 0xdc, 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0x02, 0x03, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x08, + 0x03, 0xa5, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x1e, 0x04, 0xa5, 0xa5, 0x8d, 0xb6, 0x22, 0x04, 0xa5, + 0xa5, 0xa5, 0x8d, 0xb6, 0x28, 0x04, 0xa5, 0x53, 0x8c, 0xdb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x26, + 0x00, 0xe8, 0x3e, 0xe2, 0x8e, 0xc3, 0xab, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x24, 0x00, 0xe8, 0x31, + 0xe2, 0x8e, 0xc3, 0xab, 0x5b, 0xe8, 0x92, 0x03, 0x8b, 0xda, 0x5f, 0xc3, 0x8d, 0x4d, 0x38, 0x57, + 0x53, 0xe8, 0xe8, 0x02, 0x5a, 0x5f, 0x72, 0xf3, 0x57, 0xe8, 0x6f, 0xfd, 0x8c, 0xd8, 0x8e, 0xc0, + 0xb8, 0x00, 0x24, 0xab, 0x47, 0xb0, 0x23, 0xaa, 0x8d, 0xb6, 0xdc, 0x02, 0xa5, 0xa5, 0x8d, 0xb6, + 0xf2, 0x03, 0xb9, 0x06, 0x00, 0xf3, 0xa5, 0x8d, 0xb6, 0x36, 0x04, 0xa5, 0xa5, 0xa5, 0xa5, 0x8d, + 0xb6, 0x2e, 0x04, 0xa5, 0xa5, 0xa5, 0xa5, 0xe8, 0x50, 0x03, 0x8b, 0xda, 0x5f, 0xc3, 0x8d, 0x4d, + 0x3e, 0x57, 0x53, 0xe8, 0xa6, 0x02, 0x5a, 0x5f, 0x72, 0x64, 0x57, 0xe8, 0x2d, 0xfd, 0x8c, 0xd8, + 0x8e, 0xc0, 0xb8, 0x00, 0x2a, 0xab, 0x47, 0xb0, 0x24, 0xaa, 0x8d, 0xb6, 0xdc, 0x02, 0xa5, 0xa5, + 0x8d, 0xb6, 0x06, 0x04, 0xb9, 0x0a, 0x00, 0xf3, 0xa5, 0x8d, 0xb6, 0x28, 0x04, 0xa5, 0x53, 0x8c, + 0xdb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x26, 0x00, 0xe8, 0xa7, 0xe1, 0x8e, 0xc3, 0xab, 0x8e, 0x46, + 0x02, 0x26, 0xa1, 0x24, 0x00, 0xe8, 0x9a, 0xe1, 0x8e, 0xc3, 0xab, 0x5b, 0x8c, 0xd8, 0x8e, 0xc0, + 0x8d, 0xb6, 0x3e, 0x04, 0xa5, 0x8b, 0x86, 0xf8, 0x01, 0x86, 0xc4, 0xab, 0x8d, 0xb6, 0x42, 0x04, + 0xa5, 0x8b, 0x86, 0xf6, 0x01, 0x86, 0xc4, 0xab, 0xe8, 0xdf, 0x02, 0x8b, 0xda, 0x5f, 0xc3, 0xb9, + 0x3a, 0x00, 0xe8, 0x37, 0x02, 0x72, 0xf7, 0x8d, 0xb6, 0x46, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, + 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, 0xbb, 0x02, 0x68, + 0x9d, 0x2c, 0xe9, 0xb5, 0x02, 0xb9, 0x26, 0x00, 0xe8, 0x11, 0x02, 0x72, 0xd1, 0xff, 0x86, 0x4e, + 0x02, 0x8d, 0xb6, 0x80, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, + 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x91, 0x02, 0x68, 0x9d, 0x2c, 0xe9, 0x8b, 0x02, 0xb9, + 0x20, 0x00, 0xe8, 0xe7, 0x01, 0x72, 0xa7, 0x8d, 0xb6, 0xee, 0x01, 0x8d, 0xbe, 0xc0, 0x04, 0x8c, + 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0xa6, 0x04, 0x8b, 0xfb, 0xd1, 0xe9, 0xf3, 0xa5, + 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x60, 0x02, 0x68, 0x9d, 0x2c, 0xe9, 0x5a, 0x02, + 0x89, 0x86, 0xe0, 0x04, 0x86, 0xc4, 0x89, 0x86, 0x0e, 0x02, 0xb9, 0x2a, 0x00, 0xe8, 0xac, 0x01, + 0x72, 0x18, 0x8d, 0xb6, 0xc6, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, + 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x07, 0xe9, 0x30, 0x02, 0xe9, 0x22, 0x01, 0x90, 0x68, 0x9d, + 0x2c, 0xe9, 0x26, 0x02, 0xb9, 0x18, 0x00, 0xe8, 0x82, 0x01, 0x73, 0x03, 0xe9, 0x3f, 0xff, 0x8d, + 0xb6, 0x64, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x0a, 0x02, + 0xb9, 0x24, 0x00, 0xe8, 0x66, 0x01, 0x73, 0x03, 0xe9, 0x23, 0xff, 0x8b, 0x86, 0x0e, 0x05, 0x86, + 0xc4, 0x89, 0x86, 0x26, 0x02, 0x8d, 0xb6, 0xf0, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, + 0xe9, 0xf3, 0xa5, 0xe9, 0xe4, 0x01, 0xb9, 0x1c, 0x00, 0xe8, 0x40, 0x01, 0x73, 0x03, 0xe9, 0xfd, + 0xfe, 0x8d, 0xb6, 0x14, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, + 0xc8, 0x01, 0xb9, 0x18, 0x00, 0xe8, 0x24, 0x01, 0x73, 0x03, 0xe9, 0xe1, 0xfe, 0x8d, 0xb6, 0x30, + 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xac, 0x01, 0xb9, 0x1c, + 0x00, 0x50, 0xe8, 0x07, 0x01, 0x58, 0x73, 0x03, 0xe9, 0xc3, 0xfe, 0x8d, 0xb6, 0x48, 0x05, 0x8b, + 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x8e, 0x01, 0x8b, 0x4f, 0x04, 0x53, + 0xe8, 0xe9, 0x00, 0x5e, 0x72, 0x17, 0x89, 0x9e, 0x38, 0x02, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, + 0xd1, 0xe9, 0xf3, 0xa5, 0xc7, 0x86, 0x3a, 0x02, 0x01, 0x00, 0xe9, 0x6d, 0x01, 0xe9, 0x70, 0x11, + 0xb9, 0x18, 0x00, 0xe8, 0xc6, 0x00, 0x8d, 0xb6, 0xa8, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, + 0xd1, 0xe9, 0xf3, 0xa5, 0x33, 0xc0, 0x8d, 0x7f, 0x08, 0xb9, 0x06, 0x00, 0xf3, 0xab, 0xe9, 0x49, + 0x01, 0x53, 0x8b, 0x9e, 0xb0, 0x01, 0x8b, 0xb6, 0xae, 0x01, 0x3b, 0xde, 0x74, 0x15, 0x8a, 0x47, + 0x17, 0xf6, 0x44, 0x0e, 0x80, 0x75, 0x0e, 0x38, 0x44, 0x17, 0x75, 0x09, 0x8b, 0x74, 0x02, 0x89, + 0xb6, 0xae, 0x01, 0xeb, 0x1a, 0x8b, 0xfe, 0x8b, 0x74, 0x02, 0x3b, 0xde, 0x74, 0x11, 0xf6, 0x44, + 0x0e, 0x80, 0x75, 0xf1, 0x38, 0x44, 0x17, 0x75, 0xec, 0x8b, 0x44, 0x02, 0x89, 0x45, 0x02, 0x5b, + 0xc3, 0xe8, 0x24, 0xdd, 0xc6, 0x86, 0x83, 0x02, 0x00, 0x8d, 0xb6, 0xa6, 0x01, 0x8d, 0xbe, 0xac, + 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00, + 0x00, 0x16, 0x8d, 0x9e, 0x52, 0x12, 0x89, 0x9e, 0xa8, 0x01, 0x89, 0x9e, 0xaa, 0x01, 0xc7, 0x07, + 0x30, 0x80, 0xc7, 0x47, 0x04, 0x00, 0x00, 0x83, 0xc3, 0x08, 0x89, 0x9e, 0xa6, 0x01, 0xc6, 0x86, + 0x86, 0x02, 0x01, 0x83, 0xc1, 0x02, 0xeb, 0x4a, 0x8b, 0x9e, 0xac, 0x01, 0x8b, 0xb6, 0xae, 0x01, + 0xeb, 0x29, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x74, 0xa8, 0x8d, 0x96, 0x52, 0x15, 0x8d, 0xbe, 0x52, + 0x12, 0x8b, 0x9e, 0xa6, 0x01, 0x8b, 0xb6, 0xa8, 0x01, 0xeb, 0x18, 0x90, 0x8b, 0x9e, 0xa6, 0x01, + 0x8b, 0xb6, 0xa8, 0x01, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0xcd, 0x8d, 0x96, 0x52, 0x12, 0x8d, + 0xbe, 0x52, 0x09, 0x83, 0xc1, 0x02, 0x3b, 0xde, 0x73, 0x17, 0x8b, 0xc6, 0x2b, 0xc3, 0x3b, 0xc1, + 0x72, 0x25, 0xc7, 0x07, 0x00, 0x00, 0x83, 0xc3, 0x02, 0xc7, 0x07, 0x00, 0x00, 0x83, 0xe9, 0x02, + 0xc3, 0x8b, 0xc2, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xe7, 0x8b, 0xdf, 0x8b, 0xc6, 0x2b, + 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xdb, 0x3b, 0xb6, 0xae, 0x01, 0x74, 0x11, 0x80, 0xbe, 0x5e, + 0x02, 0x01, 0x75, 0x05, 0x83, 0x8e, 0xda, 0x02, 0x02, 0xe8, 0x68, 0x01, 0xf9, 0xc3, 0x8b, 0x74, + 0x02, 0x89, 0xb6, 0xae, 0x01, 0x3b, 0xdd, 0x74, 0x04, 0x3b, 0xde, 0x77, 0xc4, 0x8b, 0xc6, 0x2b, + 0xc3, 0x3b, 0xc1, 0x72, 0xe9, 0x89, 0xb6, 0xae, 0x01, 0xeb, 0xa7, 0x8b, 0xb6, 0xb0, 0x01, 0x89, + 0x5c, 0x02, 0x80, 0x4c, 0x05, 0x80, 0x89, 0x9e, 0xb0, 0x01, 0x03, 0x5f, 0x04, 0x83, 0xc3, 0x06, + 0x89, 0x9e, 0xac, 0x01, 0xc6, 0x86, 0x87, 0x02, 0x01, 0xc3, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, + 0xda, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x0c, 0x00, 0x0c, 0x02, 0x80, 0xbe, 0x86, 0x02, 0x01, 0x74, + 0x27, 0x8b, 0xb6, 0xaa, 0x01, 0x89, 0x5c, 0x02, 0x80, 0x4c, 0x05, 0x80, 0x83, 0xc8, 0x04, 0x25, + 0xff, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x0c, 0x00, 0x89, 0x9e, 0xaa, 0x01, 0x03, 0x5f, 0x04, + 0x83, 0xc3, 0x06, 0x89, 0x9e, 0xa6, 0x01, 0xc3, 0x8e, 0x46, 0x02, 0x89, 0x9e, 0xa8, 0x01, 0x26, + 0x89, 0x1e, 0x2c, 0x00, 0x83, 0xc8, 0x08, 0x25, 0xff, 0xf7, 0xc6, 0x86, 0x86, 0x02, 0x00, 0xeb, + 0xd1, 0x53, 0xf6, 0x86, 0x83, 0x02, 0x01, 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, + 0x00, 0xfe, 0xe8, 0x8c, 0xfe, 0x5b, 0xc3, 0x90, 0xe9, 0xb8, 0x00, 0x90, 0x80, 0xbe, 0x83, 0x02, + 0x00, 0x75, 0xf5, 0x50, 0xfa, 0x8d, 0xb6, 0xac, 0x01, 0x8d, 0xbe, 0xa6, 0x01, 0x8c, 0xd8, 0x8e, + 0xc0, 0xa5, 0xa5, 0xa5, 0x80, 0xbe, 0x63, 0x01, 0x01, 0x75, 0x16, 0x8e, 0x46, 0x02, 0x26, 0x81, + 0x0e, 0x00, 0x00, 0x00, 0x02, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x00, 0x00, 0xff, 0xe3, 0xeb, + 0x27, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00, 0x00, 0x02, 0xf6, 0x86, 0xaa, 0x02, 0x01, + 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0xeb, 0x0a, 0x8e, 0x46, + 0x02, 0x26, 0x81, 0x26, 0x00, 0x00, 0xff, 0xe3, 0x33, 0xc0, 0x89, 0x86, 0xae, 0x01, 0x40, 0x88, + 0x86, 0x83, 0x02, 0x58, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x0a, 0xe8, 0xe0, 0xe4, 0x8e, 0x46, + 0x02, 0x26, 0xa2, 0x1c, 0x00, 0x8b, 0x9e, 0xa8, 0x01, 0x83, 0x3f, 0x00, 0x74, 0x0f, 0xf7, 0x07, + 0x20, 0x00, 0x75, 0x06, 0xc7, 0x07, 0x00, 0x00, 0xeb, 0x03, 0xe8, 0x89, 0x00, 0xf6, 0x86, 0x87, + 0x02, 0x01, 0x74, 0x19, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x2c, 0x00, 0xc6, 0x86, 0x87, 0x02, + 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x08, 0xfb, 0xeb, 0x06, 0xc6, 0x86, 0x86, + 0x02, 0x01, 0xfb, 0xc3, 0x56, 0x8d, 0xb6, 0x52, 0x09, 0xc7, 0x86, 0xa6, 0x01, 0x5a, 0x09, 0x01, + 0xae, 0xa6, 0x01, 0x89, 0xb6, 0xa8, 0x01, 0x89, 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30, 0x80, 0xc7, + 0x44, 0x04, 0x00, 0x00, 0xc6, 0x86, 0x86, 0x02, 0x01, 0x5e, 0xc3, 0xff, 0xa4, 0x20, 0x04, 0x80, + 0x7e, 0x06, 0x46, 0x75, 0x1c, 0xf6, 0x86, 0x76, 0x02, 0x01, 0x74, 0x15, 0xff, 0x8e, 0xcc, 0x02, + 0x75, 0x0f, 0xc6, 0x86, 0x76, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x7d, 0xe2, 0xeb, + 0x10, 0x83, 0xfe, 0x10, 0x74, 0x07, 0x83, 0xfe, 0x0e, 0x74, 0x02, 0xeb, 0x04, 0xff, 0xa4, 0x20, + 0x04, 0xc3, 0x8b, 0x9e, 0xa8, 0x01, 0x8b, 0x07, 0xfb, 0xa9, 0x10, 0x00, 0x74, 0x6c, 0xa9, 0x00, + 0x80, 0x75, 0x46, 0x8b, 0x77, 0x17, 0x81, 0xe6, 0xff, 0x00, 0xf7, 0x86, 0x3a, 0x02, 0x01, 0x00, + 0x74, 0x1b, 0x3b, 0x9e, 0x38, 0x02, 0x75, 0x15, 0x89, 0x86, 0x74, 0x15, 0x50, 0x53, 0x56, 0xe8, + 0x4e, 0x0e, 0x5e, 0x5b, 0x58, 0xc7, 0x86, 0x3a, 0x02, 0x00, 0x00, 0xeb, 0x18, 0xf7, 0x46, 0x14, + 0xff, 0xff, 0x74, 0x11, 0x83, 0xfe, 0x2a, 0x77, 0x0c, 0xd1, 0xe6, 0x68, 0xc1, 0x2f, 0xff, 0x66, + 0x14, 0x5b, 0x83, 0xc4, 0x02, 0x81, 0x0f, 0x00, 0x80, 0xfa, 0xf6, 0x47, 0x05, 0x80, 0x74, 0x1a, + 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xa8, 0x01, 0xf7, 0x07, 0x10, 0x00, 0x74, 0x0d, 0xff, 0x86, 0x3a, + 0x01, 0x83, 0xbe, 0x3a, 0x01, 0x06, 0x77, 0x0f, 0xeb, 0x8c, 0xc6, 0x86, 0xb8, 0x01, 0x00, 0xc7, + 0x86, 0x3a, 0x01, 0x00, 0x00, 0xfb, 0xc3, 0xe8, 0xa2, 0xdd, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0xea, + 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6, 0x86, 0xb8, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0xaa, 0xdd, + 0xeb, 0xdd, 0xa9, 0x20, 0x00, 0x75, 0x74, 0xf7, 0x47, 0x04, 0x00, 0x80, 0x74, 0x05, 0xe8, 0x08, + 0x00, 0x72, 0x9f, 0x53, 0x68, 0xbd, 0x2f, 0xff, 0xe6, 0x8a, 0x47, 0x17, 0x8b, 0xfb, 0x8b, 0x7d, + 0x02, 0x38, 0x45, 0x17, 0x74, 0x09, 0xf7, 0x45, 0x04, 0x00, 0x80, 0x75, 0xf1, 0xf8, 0xc3, 0xf9, + 0xc3, 0xa9, 0x20, 0x00, 0x75, 0x05, 0xa9, 0x00, 0x10, 0x75, 0x0c, 0x33, 0xc9, 0xa9, 0x05, 0x00, + 0x75, 0x0a, 0xa9, 0x0a, 0x04, 0x74, 0x05, 0x8b, 0x0d, 0xe3, 0x01, 0x49, 0x89, 0x0d, 0xc3, 0x53, + 0x8b, 0x4f, 0x04, 0x80, 0xe5, 0x7f, 0x89, 0x4f, 0x04, 0x83, 0xc1, 0x06, 0xe8, 0xdd, 0xfc, 0x72, + 0x19, 0x5e, 0x56, 0x8b, 0xfb, 0xd1, 0xe9, 0x83, 0xe9, 0x02, 0x83, 0xc6, 0x04, 0x83, 0xc7, 0x04, + 0x8c, 0xd8, 0x8e, 0xc0, 0xf3, 0xa5, 0xe8, 0x61, 0xfd, 0xf8, 0x5b, 0xc3, 0x80, 0x7e, 0x08, 0x02, + 0x75, 0x0b, 0xa9, 0x20, 0x00, 0x75, 0x06, 0xc7, 0x86, 0xc8, 0x01, 0x01, 0x00, 0xc3, 0x8a, 0x56, + 0x06, 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80, 0xfa, 0x44, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x08, 0x75, + 0x18, 0x80, 0xfa, 0x0c, 0x74, 0x07, 0x80, 0xfa, 0x0e, 0x74, 0x02, 0xeb, 0x0b, 0xa9, 0x20, 0x00, + 0x75, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0x63, 0xec, 0xc3, 0xb9, 0x06, 0x00, 0xa9, 0x20, 0x00, 0x74, + 0x09, 0xb9, 0x08, 0x00, 0xa9, 0x0f, 0x00, 0x75, 0x01, 0xc3, 0xff, 0x86, 0xc4, 0x02, 0x83, 0xbe, + 0xc4, 0x02, 0x02, 0x72, 0x06, 0x8b, 0xc1, 0xe8, 0x41, 0xec, 0xc3, 0x53, 0xe8, 0x44, 0xf8, 0x5b, + 0xc3, 0x53, 0x68, 0xbd, 0x2f, 0xe9, 0xb5, 0xf8, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x1d, 0xa9, 0x00, + 0x10, 0x75, 0xee, 0xa9, 0x20, 0x00, 0x74, 0xe9, 0xa8, 0x0a, 0x75, 0x10, 0xff, 0x86, 0xba, 0x02, + 0x83, 0xbe, 0xba, 0x02, 0x04, 0x72, 0xda, 0xc6, 0x46, 0x07, 0x0e, 0xc3, 0x83, 0xbe, 0xb8, 0x02, + 0x04, 0x73, 0xf8, 0xbe, 0xcf, 0x45, 0xe8, 0x73, 0xde, 0xeb, 0xf0, 0x8d, 0xbe, 0xbe, 0x02, 0xe8, + 0x0f, 0xff, 0x0b, 0xc9, 0x74, 0xe5, 0x53, 0x68, 0xbd, 0x2f, 0xe9, 0x70, 0xf8, 0x8d, 0xbe, 0xb6, + 0x02, 0xe8, 0xfd, 0xfe, 0x0b, 0xc9, 0x74, 0x03, 0xe9, 0x14, 0xff, 0xc3, 0x53, 0x8a, 0x56, 0x06, + 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80, 0xfa, 0x44, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x2d, + 0x80, 0xfa, 0x0c, 0x74, 0x07, 0x80, 0xfa, 0x0e, 0x74, 0x02, 0xeb, 0x21, 0xa9, 0x20, 0x00, 0x74, + 0x1e, 0x8b, 0x96, 0x66, 0x01, 0x4a, 0x89, 0x96, 0x66, 0x01, 0x83, 0xfa, 0x01, 0x77, 0x23, 0xbe, + 0xb7, 0x45, 0xe8, 0x17, 0xde, 0xc6, 0x86, 0x86, 0x02, 0x01, 0xe8, 0xa6, 0xf7, 0x5b, 0xc3, 0xfe, + 0x8e, 0x68, 0x01, 0x80, 0x8e, 0x68, 0x01, 0x00, 0x75, 0x08, 0xb8, 0x01, 0x00, 0xe8, 0x8b, 0xeb, + 0xeb, 0xeb, 0xbe, 0xb7, 0x45, 0xe8, 0xf4, 0xdd, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6, + 0x86, 0x86, 0x02, 0x01, 0xfa, 0xe8, 0x94, 0xf7, 0xeb, 0xd3, 0xa9, 0x20, 0x00, 0x74, 0x41, 0xa9, + 0x0f, 0x00, 0x75, 0x25, 0xc6, 0x86, 0x65, 0x02, 0x01, 0xc6, 0x86, 0x66, 0x02, 0x01, 0x8c, 0xd8, + 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab, 0x8b, 0x86, + 0x06, 0x02, 0x83, 0x8e, 0x06, 0x02, 0x40, 0xeb, 0x17, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, + 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8b, 0x86, 0x06, 0x02, 0x83, 0xa6, 0x06, 0x02, 0xbf, + 0x33, 0x86, 0x06, 0x02, 0x74, 0x05, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc3, 0xfb, 0xc3, 0xff, 0xa4, + 0xc8, 0x03, 0x53, 0x56, 0xf7, 0x07, 0x00, 0x10, 0x74, 0x0a, 0x8b, 0xc7, 0x80, 0x7e, 0x06, 0x44, + 0x74, 0x49, 0xeb, 0x44, 0x8b, 0xc7, 0x8b, 0x49, 0x16, 0x80, 0xf9, 0x00, 0x74, 0x05, 0x80, 0xf9, + 0x03, 0x75, 0x38, 0x8d, 0xbe, 0x0a, 0x03, 0x83, 0x3d, 0x00, 0x75, 0x0c, 0x83, 0x7d, 0x02, 0x00, + 0x75, 0x06, 0x83, 0x7d, 0x04, 0x00, 0x74, 0x23, 0x8b, 0xf8, 0x8d, 0x71, 0x0e, 0x8d, 0xbe, 0x0a, + 0x03, 0x8c, 0xd8, 0x8e, 0xc0, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, 0x0f, 0xc7, 0x86, 0x2a, 0x02, + 0x0e, 0x00, 0xb8, 0x0b, 0x00, 0xe8, 0xc3, 0xea, 0x5e, 0x5b, 0xc3, 0x8b, 0xf8, 0x5e, 0x5b, 0xff, + 0xa4, 0xf4, 0x03, 0xff, 0x86, 0x48, 0x02, 0xc7, 0x86, 0x2a, 0x02, 0x06, 0x00, 0x8c, 0xd8, 0x8e, + 0xc0, 0x8d, 0xbe, 0xfc, 0x01, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x8b, 0xb6, 0xc4, + 0x05, 0x8b, 0x04, 0x86, 0xe0, 0x89, 0x86, 0x02, 0x02, 0x89, 0x86, 0x12, 0x02, 0x8b, 0xb6, 0xc9, + 0x05, 0x8b, 0x04, 0x89, 0x86, 0x16, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x86, 0x18, 0x02, 0x8b, 0x44, + 0x04, 0x89, 0x86, 0x1a, 0x02, 0x8b, 0xb6, 0xce, 0x05, 0x8b, 0x04, 0x89, 0x86, 0x20, 0x02, 0x8b, + 0x44, 0x02, 0x89, 0x86, 0x22, 0x02, 0x8b, 0xb6, 0xc4, 0x05, 0x8b, 0x04, 0x80, 0x7e, 0x08, 0x06, + 0x75, 0x56, 0xf7, 0x07, 0x00, 0x10, 0x74, 0x14, 0xf6, 0x47, 0x06, 0x08, 0x75, 0x0b, 0x80, 0xbe, + 0x5f, 0x02, 0x00, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x04, 0xe9, 0x1b, 0x01, 0x3b, 0x86, 0x00, 0x03, + 0x77, 0xf7, 0x80, 0xbe, 0x5e, 0x02, 0x01, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0xea, 0xc6, + 0x46, 0x07, 0x10, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0xe0, 0x80, 0xbe, 0x5f, 0x02, 0x00, 0x75, 0xd9, + 0xc6, 0x46, 0x09, 0x0a, 0xf6, 0x86, 0x07, 0x02, 0x10, 0x74, 0xce, 0x80, 0xa6, 0x07, 0x02, 0x6f, + 0xc6, 0x86, 0x85, 0x02, 0x01, 0xe9, 0xdf, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x5b, 0xc6, 0x86, + 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xbf, 0xbe, 0x93, 0x45, 0xe8, + 0x5a, 0xdc, 0x8b, 0xb6, 0xc9, 0x05, 0x8d, 0xbe, 0xf4, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, + 0x00, 0xf3, 0xa7, 0x75, 0x21, 0x83, 0xf8, 0x01, 0x74, 0x1c, 0xff, 0x8e, 0xb0, 0x02, 0x75, 0x13, + 0xf6, 0x86, 0x58, 0x02, 0x01, 0x75, 0x0c, 0xc6, 0x86, 0x58, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x08, + 0xe9, 0x94, 0x00, 0xe9, 0x91, 0x00, 0xc7, 0x86, 0xb0, 0x02, 0x08, 0x00, 0x83, 0xf8, 0x01, 0x75, + 0x0a, 0xc7, 0x86, 0xae, 0x02, 0x02, 0x00, 0xeb, 0x7e, 0xeb, 0x2e, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, + 0x0a, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0xe4, 0xff, 0x8e, 0xae, + 0x02, 0x75, 0x14, 0xc7, 0x86, 0xae, 0x02, 0x02, 0x00, 0xc6, 0x86, 0x54, 0x02, 0x01, 0x8e, 0x46, + 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x40, 0xeb, 0x4e, 0x80, 0xbe, 0x5e, 0x02, 0x00, 0x74, 0x0c, + 0x80, 0x7e, 0x08, 0x08, 0x74, 0x41, 0xc6, 0x46, 0x09, 0x0a, 0xeb, 0x3b, 0xb7, 0x10, 0x8a, 0x5e, + 0x06, 0x80, 0xfb, 0x06, 0x74, 0x1f, 0x80, 0xfb, 0x08, 0x74, 0x1a, 0x80, 0xfb, 0x04, 0x74, 0x15, + 0x80, 0xfb, 0x0c, 0x74, 0x10, 0x80, 0xfb, 0x0a, 0x75, 0x07, 0xc6, 0x86, 0x5b, 0x02, 0x00, 0xeb, + 0x04, 0xb7, 0x12, 0xeb, 0x12, 0x88, 0x7e, 0x07, 0x80, 0xff, 0x12, 0x75, 0x04, 0xc6, 0x46, 0x09, + 0x1e, 0xb8, 0x07, 0x00, 0xe8, 0x24, 0xe9, 0xc3, 0xff, 0x86, 0x48, 0x02, 0xc7, 0x86, 0x2a, 0x02, + 0x06, 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0xfc, 0x01, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, + 0xf3, 0xa5, 0x80, 0x7e, 0x06, 0x48, 0x74, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0xfd, 0xe8, 0xeb, 0x30, + 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x74, 0x1f, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x19, 0xc6, 0x46, 0x09, + 0x1a, 0xc6, 0x86, 0x72, 0x02, 0x00, 0xc6, 0x86, 0x68, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, + 0x26, 0x0c, 0x00, 0xfe, 0xeb, 0x0a, 0x80, 0x7e, 0x08, 0x18, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x1a, + 0xc3, 0x8a, 0x4e, 0x06, 0x80, 0xbe, 0xa7, 0x02, 0x01, 0x74, 0x02, 0xeb, 0x06, 0xb8, 0x06, 0x00, + 0xe8, 0xb8, 0xe8, 0xc3, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x42, 0x8b, 0x47, 0x1a, 0x83, 0xf8, 0x00, + 0x75, 0x27, 0xf6, 0x86, 0x7e, 0x02, 0x01, 0x75, 0x18, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x10, 0x74, + 0x10, 0xb8, 0x02, 0x00, 0xe8, 0x7c, 0x10, 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x07, 0x02, 0xeb, + 0x1b, 0xb8, 0x06, 0x00, 0xe8, 0x84, 0xe8, 0xeb, 0x13, 0x3d, 0x00, 0x02, 0x75, 0x0e, 0xc6, 0x86, + 0x77, 0x02, 0x01, 0xe8, 0x74, 0x06, 0xbe, 0x2f, 0x46, 0xe8, 0xe0, 0xda, 0xc3, 0xc7, 0x86, 0x2a, + 0x02, 0x02, 0x00, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x2b, 0x8b, 0x47, 0x1a, 0x83, 0xf8, 0x00, 0x75, + 0x10, 0xc6, 0x46, 0x07, 0x48, 0x80, 0x7e, 0x08, 0x1c, 0x75, 0x19, 0xc6, 0x46, 0x09, 0x16, 0xeb, + 0x13, 0x86, 0xc4, 0x3d, 0x20, 0x80, 0x75, 0x0c, 0xc7, 0x86, 0x2a, 0x02, 0x11, 0x00, 0xb8, 0x08, + 0x00, 0xe8, 0x37, 0xe8, 0xc3, 0xc7, 0x86, 0x2a, 0x02, 0x0f, 0x00, 0x80, 0x7e, 0x06, 0x44, 0x74, + 0x06, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0x1e, 0xe8, 0xeb, 0x0d, 0xf6, + 0x86, 0x72, 0x02, 0x01, 0x74, 0x06, 0xbe, 0x3b, 0x46, 0xe8, 0x80, 0xda, 0xc3, 0x80, 0x7e, 0x06, + 0x44, 0x75, 0x14, 0xe8, 0x76, 0xd8, 0xc7, 0x44, 0x02, 0x02, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x89, + 0xd8, 0xbe, 0xb7, 0x45, 0xe8, 0x17, 0xdb, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x40, 0x00, 0x74, 0x18, + 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x20, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x08, 0x72, 0x0a, 0x80, 0x7e, + 0x06, 0x0e, 0x77, 0x04, 0xc6, 0x46, 0x07, 0x14, 0xc3, 0xff, 0x86, 0x4c, 0x02, 0xc7, 0x86, 0x2a, + 0x02, 0x0b, 0x00, 0x8a, 0x86, 0x54, 0x02, 0x88, 0x86, 0x80, 0x02, 0xc7, 0x86, 0xc2, 0x02, 0x00, + 0x00, 0xc6, 0x86, 0x61, 0x02, 0x00, 0x83, 0x8e, 0x06, 0x02, 0x20, 0x81, 0xa6, 0x06, 0x02, 0xff, + 0x2f, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x38, 0xc6, 0x86, 0x80, + 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a, 0x00, + 0x75, 0x0a, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0x8a, 0xa6, 0x80, 0x02, + 0x88, 0xa6, 0x54, 0x02, 0xe8, 0x25, 0xdc, 0x88, 0x86, 0x54, 0x02, 0xc6, 0x46, 0x09, 0x0c, 0xc7, + 0x86, 0xc6, 0x01, 0x00, 0x01, 0x80, 0x7e, 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x06, 0x80, + 0x7e, 0x08, 0x02, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x0c, 0x80, 0x7e, 0x08, 0x06, 0x74, 0x05, 0xc6, + 0x86, 0x5a, 0x02, 0x01, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xf4, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, + 0x06, 0x00, 0xf3, 0xa6, 0x74, 0x08, 0x77, 0x03, 0xe9, 0x95, 0x00, 0xe9, 0xfe, 0x00, 0xf6, 0x47, + 0x06, 0x08, 0x75, 0x59, 0x80, 0x7e, 0x08, 0x04, 0x75, 0x53, 0x8b, 0xb6, 0xd4, 0x05, 0x8d, 0xbe, + 0x0a, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xb8, 0x01, 0x00, 0xf3, 0xa7, 0x74, 0x02, + 0xeb, 0x3e, 0xff, 0x86, 0xb4, 0x02, 0x83, 0xbe, 0xb4, 0x02, 0x03, 0x72, 0x30, 0x83, 0xbe, 0xb2, + 0x02, 0x03, 0x72, 0x29, 0xc6, 0x46, 0x09, 0x02, 0xc6, 0x86, 0x80, 0x02, 0x01, 0x8e, 0x46, 0x02, + 0x26, 0x81, 0x0e, 0x24, 0x00, 0x00, 0x80, 0x8a, 0x86, 0x54, 0x02, 0x8a, 0xa6, 0x80, 0x02, 0x88, + 0xa6, 0x54, 0x02, 0xe8, 0x86, 0xdb, 0x88, 0x86, 0x54, 0x02, 0xe8, 0xb2, 0xf4, 0xe9, 0xec, 0x00, + 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x1d, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, + 0x8a, 0x86, 0x54, 0x02, 0x8a, 0xa6, 0x80, 0x02, 0x88, 0xa6, 0x54, 0x02, 0xe8, 0x5d, 0xdb, 0x88, + 0x86, 0x54, 0x02, 0xc6, 0x46, 0x09, 0x0c, 0xb8, 0x00, 0x03, 0xe8, 0x03, 0xf5, 0xe9, 0xbc, 0x00, + 0x80, 0x7e, 0x08, 0x00, 0x75, 0x3d, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75, 0x16, 0xf6, 0x86, 0x68, + 0x02, 0x01, 0x74, 0x16, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x08, 0xf7, 0x86, 0x12, 0x01, 0x00, + 0x01, 0x75, 0x16, 0xc6, 0x46, 0x09, 0x0c, 0xe9, 0x92, 0x00, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, + 0x9c, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x74, 0x94, 0xc6, 0x46, 0x09, 0x04, 0xff, 0x86, 0x4a, + 0x02, 0xeb, 0x79, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x73, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x75, 0x0e, + 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x0c, 0xeb, 0x5e, 0xf7, 0x86, + 0x12, 0x01, 0x00, 0x01, 0x74, 0x56, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x50, 0x80, 0x7e, 0x08, 0x04, + 0x75, 0x2c, 0xc6, 0x46, 0x09, 0x0c, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x1d, 0xc6, 0x86, 0x69, 0x02, + 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0x8a, 0x86, 0x54, 0x02, 0x8a, 0xa6, 0x80, 0x02, 0x88, 0xa6, + 0x54, 0x02, 0xe8, 0xb7, 0xda, 0x88, 0x86, 0x54, 0x02, 0xe8, 0x5f, 0xf1, 0xeb, 0x1e, 0x80, 0x7e, + 0x08, 0x00, 0x75, 0x09, 0xf6, 0x86, 0x68, 0x02, 0x01, 0x74, 0x02, 0xeb, 0xab, 0x80, 0x7e, 0x08, + 0x0a, 0x75, 0x09, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x75, 0x02, 0xeb, 0x9c, 0x8a, 0x86, 0x80, 0x02, + 0x88, 0x86, 0x54, 0x02, 0xc3, 0xc7, 0x86, 0xbc, 0x02, 0x02, 0x00, 0xff, 0x86, 0x42, 0x02, 0xc7, + 0x86, 0x2a, 0x02, 0x0c, 0x00, 0x80, 0x7e, 0x06, 0x04, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x06, 0x75, + 0x04, 0xc6, 0x46, 0x07, 0x08, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x56, 0xf6, 0x86, 0x54, 0x02, 0x01, + 0x74, 0x3b, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, + 0x7f, 0xb8, 0x00, 0x02, 0xe8, 0xf9, 0xf3, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x0c, 0xbe, 0xbd, + 0x45, 0xe8, 0xf8, 0xd7, 0xbe, 0xdb, 0x45, 0xe8, 0xf2, 0xd7, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0d, + 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x1f, 0xda, 0xf6, 0x86, 0x5e, + 0x02, 0x01, 0x74, 0x34, 0xc6, 0x86, 0x58, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00, 0xe9, 0xc9, + 0x00, 0x80, 0x7e, 0x08, 0x0c, 0x75, 0x24, 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x5e, 0x02, 0x01, + 0x74, 0x16, 0xbe, 0xbd, 0x45, 0xe8, 0xb4, 0xd7, 0xbe, 0xdb, 0x45, 0xe8, 0xae, 0xd7, 0xc6, 0x86, + 0x58, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00, 0xe9, 0x9f, 0x00, 0x80, 0x7e, 0x08, 0x02, 0x75, + 0xf7, 0xc7, 0x86, 0xc8, 0x01, 0x00, 0x00, 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x5e, 0x02, 0x01, + 0x74, 0x0a, 0xc6, 0x86, 0x58, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00, 0x8d, 0x77, 0x0e, 0x8d, + 0xbe, 0xf4, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x06, 0x00, 0xf3, 0xa6, 0x74, 0x2e, 0xc6, 0x86, + 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a, + 0x00, 0x75, 0x0a, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x8c, 0xd9, + 0xb8, 0x00, 0x02, 0xe8, 0x3a, 0xf3, 0xc6, 0x46, 0x09, 0x00, 0xeb, 0x3e, 0x8e, 0x46, 0x02, 0x26, + 0xa0, 0x1c, 0x00, 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x55, 0x02, + 0x00, 0xc6, 0x86, 0x65, 0x02, 0x00, 0xe8, 0x63, 0xd9, 0x24, 0x07, 0xe8, 0xde, 0xf5, 0xbe, 0x8d, + 0x45, 0xe8, 0x18, 0xd7, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, + 0xab, 0xe8, 0x49, 0xf0, 0xbe, 0xdb, 0x45, 0xe8, 0x02, 0xd7, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x03, + 0xe8, 0x90, 0xf0, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0xff, 0x86, 0x50, 0x02, 0xc7, 0x86, 0x2a, 0x02, + 0x0f, 0x00, 0xf6, 0x86, 0xca, 0x01, 0x01, 0x74, 0x3b, 0xb8, 0x9c, 0x56, 0xa3, 0x92, 0x56, 0x8d, + 0x77, 0x0e, 0x8b, 0xf8, 0xa5, 0xa5, 0xa5, 0xc7, 0x06, 0x9a, 0x56, 0x01, 0x00, 0xc6, 0x86, 0xcb, + 0x01, 0x00, 0x33, 0xff, 0xba, 0x02, 0x08, 0xe8, 0x24, 0xe8, 0xbf, 0x94, 0x56, 0xb9, 0x03, 0x00, + 0xf3, 0xa5, 0x8d, 0x77, 0x0e, 0xbf, 0x94, 0x56, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x05, 0xe8, + 0x8b, 0x04, 0xeb, 0x00, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5, 0xa5, 0x80, 0x7e, + 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0x8b, 0x8e, 0xbc, 0x02, 0xe3, 0x05, 0x49, 0x89, + 0x8e, 0xbc, 0x02, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x0a, 0xf6, 0x86, 0x68, 0x02, 0x01, 0x74, 0x03, + 0xe8, 0x07, 0x02, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x93, 0x00, 0xbe, 0xdb, 0x45, + 0xe8, 0x69, 0xd6, 0xf7, 0x07, 0x00, 0x10, 0x75, 0x37, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e, 0x46, + 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f, 0xb8, 0x00, 0x02, 0xe8, 0x42, 0xf2, 0xf6, 0x86, + 0x5e, 0x02, 0x01, 0x74, 0x06, 0xbe, 0xbd, 0x45, 0xe8, 0x41, 0xd6, 0x80, 0x7e, 0x0a, 0x00, 0x75, + 0x38, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x6e, 0xd8, 0xeb, 0x29, + 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x33, 0xc6, 0x86, 0x65, 0x02, 0x01, 0xc6, 0x86, 0x66, 0x02, 0x01, + 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab, + 0x8b, 0x86, 0x06, 0x02, 0xa9, 0x40, 0x00, 0x74, 0x02, 0xeb, 0x48, 0x83, 0xc8, 0x40, 0x89, 0x86, + 0x06, 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xeb, 0x3a, 0x83, 0xa6, 0x06, 0x02, 0xbf, 0x8c, 0xd8, + 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5, 0xa5, 0xeb, 0x23, + 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x06, 0xbe, 0xdb, 0x45, 0xe8, 0xcf, 0xd5, 0xc6, 0x86, 0x67, + 0x02, 0x00, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x0b, 0xc6, 0x86, 0x67, 0x02, 0x01, 0xbe, 0xc3, 0x45, + 0xe8, 0xb9, 0xd5, 0xc3, 0xeb, 0x61, 0x8c, 0xd8, 0x8e, 0xc0, 0xc7, 0x86, 0x2a, 0x02, 0x0d, 0x00, + 0xf6, 0x86, 0xca, 0x01, 0x01, 0x74, 0x50, 0x33, 0xff, 0xba, 0x02, 0x08, 0xe8, 0xff, 0xe6, 0x8b, + 0x3e, 0x92, 0x56, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x3d, 0x81, 0xff, 0xaa, 0x5d, 0x73, 0x6f, + 0x89, 0x3e, 0x92, 0x56, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, 0x05, 0xc6, 0x86, + 0xcc, 0x01, 0x01, 0x81, 0xff, 0xaa, 0x5d, 0x73, 0x56, 0x89, 0x3e, 0x92, 0x56, 0x8d, 0x77, 0x0e, + 0xa5, 0xa5, 0xa5, 0xff, 0x06, 0x9a, 0x56, 0x8d, 0x77, 0x0e, 0xbf, 0x94, 0x56, 0xb9, 0x03, 0x00, + 0xf3, 0xa7, 0x75, 0x03, 0xe8, 0x36, 0x03, 0x8a, 0x86, 0x06, 0x02, 0xa8, 0x40, 0x75, 0x3d, 0x80, + 0x7e, 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x3a, 0xf6, + 0x86, 0x68, 0x02, 0x01, 0x74, 0x35, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x07, 0xf6, 0x86, 0x65, + 0x02, 0x01, 0x75, 0x27, 0xe8, 0xb3, 0x00, 0xc7, 0x86, 0xbe, 0x02, 0x01, 0x00, 0xeb, 0x1c, 0xbf, + 0xa4, 0x5d, 0x33, 0xc0, 0xab, 0xab, 0xab, 0xe8, 0xf3, 0x02, 0xeb, 0xbb, 0x24, 0xbf, 0x88, 0x86, + 0x06, 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xeb, 0xb6, 0xeb, 0x79, 0xf6, 0x86, 0x54, 0x02, 0x01, + 0x74, 0x3c, 0xf6, 0x86, 0x65, 0x02, 0x01, 0x74, 0x19, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x12, + 0x83, 0xbe, 0xbc, 0x02, 0x00, 0x75, 0x0b, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x05, 0x83, 0x8e, 0xda, + 0x02, 0x08, 0xc6, 0x86, 0x65, 0x02, 0x01, 0xc6, 0x86, 0x66, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, + 0x33, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab, 0xeb, 0x4b, 0xf6, 0x86, + 0x68, 0x02, 0x01, 0x74, 0x44, 0xf6, 0x86, 0x67, 0x02, 0x01, 0x75, 0x0d, 0xc6, 0x86, 0x67, 0x02, + 0x01, 0xbe, 0xc3, 0x45, 0xe8, 0xa5, 0xd4, 0xeb, 0x30, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x12, + 0x80, 0x7e, 0x08, 0x00, 0x75, 0x0c, 0x83, 0xbe, 0xbc, 0x02, 0x00, 0x75, 0x05, 0x83, 0x8e, 0xda, + 0x02, 0x08, 0xeb, 0x15, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x0e, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, + 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5, 0xa5, 0xc3, 0x53, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, + 0x77, 0x0e, 0x8d, 0xbe, 0x0a, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, + 0x54, 0x8b, 0x44, 0xfe, 0x89, 0x45, 0xfe, 0xf3, 0xa5, 0xbb, 0xfe, 0x04, 0xb9, 0x0b, 0x00, 0x8d, + 0xb6, 0x0a, 0x03, 0xad, 0x8b, 0x14, 0x8b, 0x74, 0x02, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x15, + 0x89, 0x75, 0x02, 0x83, 0xc3, 0x02, 0xe2, 0xf1, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x26, 0x8b, + 0xb6, 0xd9, 0x05, 0x8d, 0xbe, 0xea, 0x01, 0xa5, 0xa5, 0x80, 0x7e, 0x06, 0x08, 0x76, 0x0b, 0xc7, + 0x86, 0xbe, 0x02, 0x04, 0x00, 0xe8, 0xad, 0xef, 0xeb, 0x0b, 0xc6, 0x86, 0x84, 0x02, 0x01, 0xc7, + 0x86, 0xbe, 0x02, 0x01, 0x00, 0x5b, 0xc3, 0xb8, 0x80, 0x0a, 0xf6, 0x86, 0xa6, 0x02, 0x01, 0x75, + 0x45, 0xf6, 0x86, 0xa8, 0x02, 0x01, 0x75, 0x3e, 0xf7, 0x86, 0xf6, 0x00, 0x10, 0x00, 0x75, 0x36, + 0xf7, 0x07, 0x82, 0x00, 0x74, 0x2f, 0xc7, 0x86, 0x2a, 0x02, 0x07, 0x00, 0xc6, 0x86, 0x16, 0x01, + 0x00, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x01, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0xa7, 0x02, + 0x01, 0x75, 0x0c, 0x80, 0x7e, 0x06, 0x08, 0x72, 0x0c, 0x80, 0x7e, 0x06, 0x0e, 0x77, 0x06, 0xb8, + 0x0a, 0x00, 0xe8, 0x46, 0xe1, 0xc3, 0x89, 0x86, 0xe2, 0x02, 0xe9, 0xb4, 0xeb, 0xf7, 0x07, 0x02, + 0x00, 0x74, 0x0f, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x09, 0xc6, 0x86, 0x60, 0x02, 0x01, 0xc6, 0x46, + 0x07, 0x0e, 0x8b, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0xfe, 0x05, 0x0b, 0xf6, 0x74, 0x09, + 0xad, 0x86, 0xe0, 0x89, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xde, 0x02, 0x8b, 0xb6, 0xe5, + 0x05, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89, 0x86, 0x0c, 0x02, 0x8b, 0xb6, 0xea, 0x05, + 0x0b, 0xf6, 0x74, 0x05, 0x8b, 0xc6, 0xe8, 0xa2, 0x00, 0x8b, 0xb6, 0xef, 0x05, 0x0b, 0xf6, 0x74, + 0x07, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x08, 0x02, 0x8b, 0xb6, 0xf4, 0x05, 0x0b, 0xf6, 0x74, 0x07, + 0xad, 0x86, 0xc4, 0x89, 0x86, 0xf8, 0x01, 0x8b, 0xb6, 0xf9, 0x05, 0x0b, 0xf6, 0x74, 0x07, 0xad, + 0x86, 0xc4, 0x89, 0x86, 0xf6, 0x01, 0x8b, 0x07, 0xa9, 0x02, 0x00, 0x75, 0x07, 0xa8, 0x28, 0x74, + 0x03, 0xe9, 0x71, 0xff, 0xc7, 0x86, 0xe2, 0x02, 0x00, 0x01, 0xe9, 0x24, 0xeb, 0xc3, 0xf7, 0x07, + 0x02, 0x02, 0x74, 0xf9, 0x8b, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0x13, 0x06, 0x0b, 0xf6, + 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xde, 0x02, 0x8b, + 0xb6, 0x04, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89, 0x86, 0x0c, 0x02, 0x8b, 0xb6, + 0x09, 0x06, 0x0b, 0xf6, 0x74, 0x05, 0x8b, 0xc6, 0xe8, 0x20, 0x00, 0x8b, 0xb6, 0x0e, 0x06, 0x0b, + 0xf6, 0x74, 0x07, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x08, 0x02, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x96, + 0xc6, 0x86, 0x60, 0x02, 0x01, 0xc6, 0x46, 0x07, 0x0e, 0xeb, 0x8b, 0x53, 0x57, 0x8c, 0xdb, 0x8e, + 0xc3, 0xbb, 0x14, 0x05, 0xb9, 0x0a, 0x00, 0x8b, 0xf0, 0xad, 0x8b, 0x34, 0x8b, 0x3f, 0x03, 0xfd, + 0xab, 0x89, 0x35, 0x83, 0xc3, 0x02, 0xe2, 0xf4, 0x5f, 0x5b, 0xc3, 0x68, 0xf0, 0x29, 0xeb, 0x08, + 0x68, 0x58, 0x2a, 0xeb, 0x03, 0x68, 0x9a, 0x2a, 0xf7, 0x07, 0x82, 0x02, 0x74, 0x1c, 0x8b, 0x86, + 0x14, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0x4a, 0x06, 0x0b, 0xf6, 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, + 0x86, 0x14, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xde, 0x02, 0xc3, 0x83, 0xc4, 0x02, 0xc3, 0x8b, 0x07, + 0xf6, 0x86, 0x63, 0x01, 0x01, 0x74, 0x1e, 0xa9, 0x00, 0x20, 0x74, 0x40, 0x56, 0x57, 0xe8, 0x5b, + 0xd0, 0xc7, 0x44, 0x02, 0x02, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x6e, 0xd0, 0xbe, 0xb7, 0x45, 0xe8, + 0xfc, 0xd2, 0x5f, 0x5e, 0xc3, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x21, 0xa9, 0x00, 0x10, 0x74, 0x1c, + 0xa9, 0x3c, 0x00, 0x75, 0x17, 0xff, 0x86, 0xc8, 0x02, 0xff, 0x86, 0xc6, 0x02, 0x83, 0xbe, 0xc6, + 0x02, 0x02, 0x72, 0x05, 0xc6, 0x46, 0x07, 0x0a, 0xc3, 0xe8, 0xb7, 0xeb, 0xc3, 0x8c, 0xd8, 0x8e, + 0xc0, 0x33, 0xc0, 0x8b, 0x3e, 0x92, 0x56, 0x83, 0xc7, 0x06, 0x81, 0xff, 0xaa, 0x5d, 0x72, 0x03, + 0xbf, 0xa4, 0x5d, 0xab, 0xab, 0xab, 0xf6, 0x86, 0xcc, 0x01, 0x01, 0x74, 0x18, 0xc6, 0x86, 0xcb, + 0x01, 0x01, 0xe8, 0xf7, 0xcf, 0xc7, 0x44, 0x02, 0x05, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x0a, 0xd0, + 0xc6, 0x86, 0xca, 0x01, 0x00, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x06, 0xbe, 0x65, + 0x46, 0xe8, 0xd8, 0xd1, 0x8d, 0xb6, 0x6c, 0x15, 0x8e, 0x46, 0x02, 0x8a, 0x1c, 0xf6, 0xc3, 0x80, + 0x75, 0x0d, 0x80, 0xfb, 0x10, 0x77, 0x14, 0x32, 0xff, 0xd1, 0xe3, 0xff, 0xa7, 0xdc, 0x04, 0xc7, + 0x86, 0x0a, 0x01, 0x00, 0x00, 0xc3, 0xb8, 0x00, 0x80, 0xeb, 0x08, 0xb8, 0x00, 0x80, 0xeb, 0x03, + 0xb8, 0x00, 0x20, 0x8d, 0xb6, 0x6c, 0x15, 0x89, 0x44, 0x02, 0x80, 0x0c, 0x80, 0xb8, 0x40, 0x60, + 0x8e, 0xc0, 0xc7, 0x86, 0x0a, 0x01, 0x00, 0x00, 0x26, 0xc7, 0x06, 0x70, 0x00, 0x08, 0x00, 0xc3, + 0xeb, 0xe1, 0xb8, 0x04, 0x00, 0x80, 0xbe, 0x06, 0x01, 0x01, 0x75, 0xf4, 0xb8, 0x05, 0x00, 0x80, + 0xbe, 0x07, 0x01, 0x01, 0x74, 0xea, 0xc6, 0x86, 0x08, 0x01, 0x01, 0xc6, 0x86, 0xcd, 0x01, 0x00, + 0xc6, 0x86, 0x09, 0x01, 0x00, 0x8b, 0x86, 0xf8, 0x00, 0x89, 0x86, 0xf6, 0x00, 0x8d, 0xb6, 0x76, + 0x15, 0xb8, 0x03, 0x00, 0xf6, 0x04, 0x80, 0x75, 0xc7, 0x33, 0xc0, 0x39, 0x04, 0x75, 0x1e, 0x39, + 0x44, 0x02, 0x75, 0x19, 0x39, 0x44, 0x04, 0x75, 0x14, 0x8b, 0x86, 0x00, 0x01, 0x89, 0x04, 0x8b, + 0x86, 0x02, 0x01, 0x89, 0x44, 0x02, 0x8b, 0x86, 0x04, 0x01, 0x89, 0x44, 0x04, 0xad, 0x8b, 0x14, + 0x8b, 0x74, 0x02, 0x89, 0x86, 0xd0, 0x01, 0x89, 0x96, 0xd2, 0x01, 0x89, 0xb6, 0xd4, 0x01, 0x8e, + 0x46, 0x02, 0x50, 0xe8, 0xfc, 0xcd, 0x26, 0xa3, 0x1e, 0x00, 0x8b, 0xc2, 0xe8, 0xf3, 0xcd, 0x26, + 0xa3, 0x20, 0x00, 0x8b, 0xc6, 0xe8, 0xea, 0xcd, 0x26, 0xa3, 0x22, 0x00, 0x58, 0xbb, 0x2c, 0x05, + 0xb9, 0x13, 0x00, 0x1e, 0x07, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x15, 0x89, 0x75, 0x02, 0x83, + 0xc3, 0x02, 0xe2, 0xf1, 0xbb, 0x28, 0x05, 0x8d, 0x96, 0x84, 0x15, 0xb8, 0x02, 0x00, 0x8b, 0x3f, + 0x03, 0xfd, 0x8b, 0xf2, 0xb9, 0x09, 0x00, 0xf3, 0xa5, 0x83, 0xc3, 0x02, 0x48, 0x75, 0xef, 0xf7, + 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x06, 0xbe, 0x65, 0x46, 0xe8, 0xbf, 0xd0, 0x8d, 0xb6, 0x6c, + 0x15, 0x8b, 0x44, 0x08, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x20, 0x75, 0x0a, 0xf7, 0x86, 0xf6, 0x00, + 0x00, 0x0c, 0x75, 0x02, 0xeb, 0x03, 0x25, 0xff, 0x7b, 0x89, 0x86, 0x12, 0x01, 0x89, 0x86, 0x14, + 0x01, 0xf7, 0x86, 0x12, 0x01, 0x01, 0x00, 0x74, 0x08, 0xc7, 0x06, 0xb5, 0x45, 0x58, 0x02, 0xeb, + 0x06, 0xc7, 0x06, 0xb5, 0x45, 0x08, 0x07, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x28, 0x00, 0x81, + 0xe3, 0xff, 0xf4, 0xa9, 0x04, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74, + 0x04, 0x81, 0xcb, 0x00, 0x03, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x28, 0x00, 0x8d, 0xb6, 0x80, + 0x15, 0xe8, 0x02, 0x02, 0x8d, 0xb6, 0x7c, 0x15, 0xe8, 0x20, 0x00, 0xf6, 0x06, 0x8a, 0x56, 0x01, + 0x74, 0x03, 0xe8, 0x13, 0x14, 0xc6, 0x86, 0x07, 0x01, 0x01, 0xe8, 0x5f, 0x05, 0xe9, 0x90, 0xfe, + 0x56, 0x83, 0xc6, 0x08, 0xe8, 0x04, 0x00, 0x5e, 0xe9, 0x85, 0xfe, 0x8e, 0x46, 0x02, 0xb8, 0xc0, + 0x00, 0xe8, 0x0e, 0xcd, 0x26, 0xa3, 0x3a, 0x00, 0x8b, 0x04, 0x0d, 0x80, 0x00, 0x89, 0x86, 0xd6, + 0x01, 0xe8, 0xfe, 0xcc, 0x26, 0xa3, 0x3c, 0x00, 0x8b, 0x44, 0x02, 0x89, 0x86, 0xd8, 0x01, 0xe8, + 0xf0, 0xcc, 0x26, 0xa3, 0x3e, 0x00, 0xc3, 0x83, 0x8e, 0x1e, 0x01, 0x01, 0xc6, 0x86, 0x16, 0x01, + 0x00, 0x8a, 0x46, 0x06, 0x3c, 0x00, 0x74, 0x1b, 0x3c, 0x10, 0x74, 0x17, 0x3c, 0x12, 0x74, 0x13, + 0x3c, 0x0e, 0x74, 0x17, 0x3c, 0x48, 0x74, 0x19, 0xe8, 0x35, 0xfe, 0xb8, 0x0f, 0x00, 0xe8, 0x6a, + 0xdd, 0xeb, 0x35, 0xe8, 0x2a, 0xfe, 0xe8, 0xc7, 0x03, 0xeb, 0x2d, 0xc6, 0x46, 0x07, 0x10, 0xeb, + 0x20, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, + 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xef, 0x13, 0xc6, 0x46, 0x07, 0x12, 0xeb, + 0x00, 0xc6, 0x46, 0x09, 0x1e, 0xe9, 0xf8, 0xfd, 0xc3, 0xc6, 0x86, 0x06, 0x01, 0x00, 0xb8, 0x05, + 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03, 0xe9, 0xe8, 0xfd, 0x8b, 0x44, 0x08, 0x89, 0x86, + 0xf4, 0x00, 0x8b, 0x44, 0x0a, 0xa9, 0x00, 0x02, 0x74, 0x03, 0x0d, 0x00, 0x01, 0x89, 0x86, 0xf6, + 0x00, 0x89, 0x86, 0xf8, 0x00, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x04, 0x74, 0x06, 0xb8, 0x01, 0x00, + 0xe9, 0xc0, 0xfd, 0x8b, 0x44, 0x12, 0x0b, 0xc0, 0x75, 0x16, 0xb8, 0x18, 0x47, 0xf7, 0x86, 0xf6, + 0x00, 0x00, 0x01, 0x75, 0x0b, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x02, 0x75, 0x03, 0xb8, 0xc6, 0x11, + 0x89, 0x86, 0xfa, 0x00, 0x89, 0x86, 0x32, 0x01, 0x8d, 0xbe, 0x30, 0x04, 0x8b, 0x44, 0x0c, 0x89, + 0x05, 0x89, 0x86, 0x00, 0x01, 0x8b, 0x44, 0x0e, 0x89, 0x45, 0x02, 0x89, 0x86, 0x02, 0x01, 0x8b, + 0x44, 0x10, 0x89, 0x45, 0x04, 0x89, 0x86, 0x04, 0x01, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x21, + 0x8b, 0x44, 0x0c, 0x89, 0x86, 0xb0, 0x03, 0x89, 0x86, 0xb6, 0x03, 0x8b, 0x44, 0x0e, 0x89, 0x86, + 0xb2, 0x03, 0x89, 0x86, 0xb8, 0x03, 0x8b, 0x44, 0x10, 0x89, 0x86, 0xb4, 0x03, 0x89, 0x86, 0xba, + 0x03, 0x8e, 0x46, 0x02, 0x8b, 0x86, 0xfa, 0x00, 0x26, 0xa3, 0x12, 0x00, 0x8b, 0x44, 0x14, 0x26, + 0xa3, 0x2a, 0x00, 0x8b, 0x44, 0x16, 0x25, 0xff, 0xf4, 0x83, 0xc8, 0x30, 0x26, 0xa3, 0x28, 0x00, + 0x8b, 0x86, 0xf4, 0x00, 0x25, 0xff, 0xfe, 0xc1, 0xe8, 0x08, 0x89, 0x86, 0x24, 0x02, 0xf7, 0x86, + 0xf4, 0x00, 0x04, 0x00, 0x74, 0x0f, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0xc6, 0x06, 0x8a, + 0x56, 0x01, 0xe8, 0xbe, 0x0f, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x01, 0xc3, 0xc6, 0x86, 0x06, + 0x01, 0x01, 0xe9, 0xfb, 0xfc, 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6, 0xd0, + 0x02, 0xb9, 0x05, 0x00, 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, 0xd0, 0x02, 0x33, 0xc0, 0x8b, 0xca, + 0xf3, 0xab, 0x81, 0xa6, 0x06, 0x02, 0x7f, 0xdf, 0x5e, 0xe9, 0xd4, 0xfc, 0x56, 0x8c, 0xd8, 0x8e, + 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6, 0x3c, 0x02, 0xb9, 0x0c, 0x00, 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, + 0xbe, 0x3c, 0x02, 0x33, 0xc0, 0x8b, 0xca, 0xf3, 0xab, 0x5e, 0xe9, 0xb3, 0xfc, 0x83, 0xc6, 0x08, + 0xe8, 0x03, 0x00, 0xe9, 0xaa, 0xfc, 0x06, 0x8e, 0x46, 0x02, 0x8b, 0x04, 0x89, 0x86, 0xda, 0x01, + 0xe8, 0x2f, 0xcb, 0x26, 0xa3, 0x26, 0x00, 0x8b, 0x44, 0x02, 0x23, 0x86, 0xf8, 0x01, 0xe8, 0x21, + 0xcb, 0x25, 0xff, 0x7f, 0x26, 0x8b, 0x0e, 0x24, 0x00, 0x81, 0xe1, 0x00, 0x80, 0x0b, 0xc1, 0x26, + 0xa3, 0x24, 0x00, 0xe8, 0x0c, 0xcb, 0x89, 0x86, 0xdc, 0x01, 0x07, 0xc3, 0xb8, 0x05, 0x00, 0x80, + 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03, 0xe9, 0x6a, 0xfc, 0xc6, 0x86, 0x62, 0x01, 0x01, 0xe8, 0x68, + 0xfe, 0xc6, 0x86, 0x62, 0x01, 0x00, 0xc6, 0x86, 0x06, 0x01, 0x01, 0xe9, 0x52, 0xfc, 0xb8, 0x11, + 0x00, 0xc6, 0x86, 0x62, 0x01, 0x00, 0xe9, 0x4a, 0xfc, 0xc3, 0x8b, 0xd8, 0x26, 0x8b, 0x04, 0x50, + 0x33, 0xc0, 0x50, 0x23, 0xc3, 0x8b, 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, + 0xc1, 0x58, 0x75, 0x3c, 0x05, 0x55, 0x55, 0x73, 0xe9, 0xb8, 0x01, 0x00, 0x50, 0x23, 0xc3, 0x8b, + 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58, 0x75, 0x22, 0xd1, 0xc0, + 0x73, 0xea, 0xf7, 0xd0, 0x50, 0x23, 0xc3, 0x8b, 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, + 0xc3, 0x3b, 0xc1, 0x58, 0x75, 0x0a, 0xd1, 0xc0, 0x72, 0xea, 0xf8, 0x58, 0x26, 0x89, 0x04, 0xc3, + 0xf9, 0xeb, 0xf8, 0x8b, 0x44, 0x08, 0x25, 0xff, 0x7b, 0x89, 0x86, 0x12, 0x01, 0x89, 0x86, 0x14, + 0x01, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x28, 0x00, 0x81, 0xe3, 0xff, 0xf4, 0xa9, 0x04, 0x00, + 0x74, 0x04, 0x81, 0xcb, 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x03, 0x8e, + 0x46, 0x02, 0x26, 0x89, 0x1e, 0x28, 0x00, 0xe9, 0xb6, 0xfb, 0x8b, 0x44, 0x08, 0x89, 0x86, 0x28, + 0x02, 0x86, 0xc4, 0x89, 0x86, 0x62, 0x05, 0xf6, 0x86, 0x73, 0x02, 0x01, 0x75, 0x05, 0xc6, 0x86, + 0x74, 0x02, 0x01, 0xc6, 0x86, 0x73, 0x02, 0x00, 0xe9, 0x95, 0xfb, 0x8b, 0x44, 0x08, 0x89, 0x86, + 0x30, 0x01, 0xbe, 0x53, 0x46, 0xe8, 0x34, 0xcd, 0xe9, 0x85, 0xfb, 0x8b, 0x44, 0x08, 0x8e, 0x46, + 0x02, 0x26, 0xa3, 0x2a, 0x00, 0xe9, 0x78, 0xfb, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80, 0x7e, + 0x06, 0x48, 0x75, 0x13, 0x80, 0x7e, 0x08, 0x00, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x07, + 0x8d, 0x5c, 0x08, 0xe8, 0xc6, 0xe9, 0xc3, 0xb8, 0x00, 0x10, 0xe9, 0x56, 0xfb, 0xb8, 0x04, 0x00, + 0xf6, 0x86, 0x07, 0x01, 0x01, 0x74, 0x1e, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x28, 0x00, 0x8b, 0x5c, + 0x08, 0x81, 0xe3, 0xff, 0xf4, 0x25, 0x00, 0x0b, 0x0b, 0xd8, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, + 0x28, 0x00, 0xb8, 0x00, 0x20, 0xe9, 0x2b, 0xfb, 0xb8, 0x05, 0x00, 0xf6, 0x86, 0x07, 0x01, 0x01, + 0x75, 0x11, 0xfa, 0xe8, 0x9a, 0xce, 0xfa, 0xe8, 0x16, 0xfb, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, + 0x72, 0x00, 0x02, 0xe9, 0x0d, 0xfb, 0xe9, 0x07, 0xfb, 0x8b, 0xd0, 0xb8, 0x01, 0x00, 0xe9, 0xa4, + 0x01, 0xc3, 0x80, 0xbe, 0xad, 0x02, 0x01, 0x74, 0x0e, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0xf1, + 0x80, 0xbe, 0x09, 0x01, 0x01, 0x74, 0xea, 0xc6, 0x86, 0x09, 0x01, 0x01, 0xc6, 0x86, 0xad, 0x02, + 0x00, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x00, 0x00, 0x02, 0x00, 0x74, 0x08, 0xbe, 0x71, 0x46, + 0xe8, 0x79, 0xcc, 0xeb, 0x03, 0x0d, 0x00, 0x01, 0x80, 0xbe, 0xa5, 0x02, 0x01, 0x74, 0x0a, 0x80, + 0xbe, 0xa7, 0x02, 0x01, 0x74, 0x03, 0x0d, 0x00, 0x04, 0x80, 0xbe, 0xa5, 0x02, 0x01, 0x74, 0x0a, + 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x03, 0x0d, 0x00, 0x02, 0xf7, 0x86, 0xa1, 0x02, 0x01, 0x00, + 0x74, 0x03, 0x0d, 0x00, 0x08, 0xa9, 0x00, 0x80, 0x74, 0x1d, 0xc7, 0x86, 0x2e, 0x01, 0x02, 0x00, + 0xf6, 0x86, 0x2c, 0x01, 0x01, 0x74, 0x1d, 0x53, 0xbb, 0x40, 0x60, 0x8e, 0xc3, 0x26, 0x81, 0x0e, + 0x72, 0x00, 0x00, 0x02, 0x5b, 0xeb, 0x0d, 0x8a, 0x56, 0x06, 0xd0, 0xe2, 0xd0, 0xe2, 0xd0, 0xe2, + 0x24, 0x0f, 0x0a, 0xc2, 0x89, 0x86, 0x34, 0x02, 0x8b, 0xd0, 0xb8, 0x02, 0x00, 0xe9, 0x92, 0x00, + 0x8b, 0x96, 0x1e, 0x01, 0x8b, 0x86, 0x12, 0x01, 0xa9, 0x00, 0x02, 0x74, 0x06, 0xf7, 0xc2, 0x05, + 0x80, 0x74, 0x0e, 0xc6, 0x86, 0x07, 0x01, 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0xca, 0x80, + 0x00, 0x33, 0xc0, 0x89, 0x86, 0x1e, 0x01, 0x89, 0x96, 0x20, 0x01, 0xc7, 0x86, 0x34, 0x02, 0x00, + 0x00, 0xf7, 0xc2, 0x01, 0x00, 0x75, 0x22, 0x83, 0xbe, 0x2e, 0x01, 0x03, 0x74, 0x1b, 0xc7, 0x86, + 0x2e, 0x01, 0x03, 0x00, 0xf6, 0x86, 0x2c, 0x01, 0x01, 0x74, 0x0e, 0x53, 0xbb, 0x40, 0x60, 0x8e, + 0xc3, 0x26, 0x81, 0x0e, 0x72, 0x00, 0x00, 0x02, 0x5b, 0xb8, 0x03, 0x00, 0xeb, 0x34, 0x3b, 0xc0, + 0x74, 0x00, 0x8b, 0xd0, 0xb8, 0x04, 0x00, 0xeb, 0x29, 0xc3, 0xc6, 0x86, 0xca, 0x01, 0x00, 0xc6, + 0x86, 0xcb, 0x01, 0x00, 0x55, 0x33, 0xed, 0xbe, 0x84, 0x55, 0xe8, 0x8f, 0xcb, 0x5d, 0xb8, 0x05, + 0x00, 0xeb, 0x0f, 0xb8, 0x06, 0x00, 0xeb, 0x0a, 0xb8, 0x07, 0x00, 0xeb, 0x05, 0xb8, 0x08, 0x00, + 0xeb, 0x00, 0x8b, 0xb6, 0x60, 0x01, 0x3b, 0xb6, 0x5e, 0x01, 0x75, 0x0a, 0xf7, 0x86, 0x58, 0x15, + 0x00, 0x80, 0x74, 0x02, 0xeb, 0x5f, 0x8b, 0x8e, 0x5e, 0x01, 0x41, 0x80, 0xe1, 0x07, 0x3b, 0xf1, + 0x75, 0x20, 0x46, 0x83, 0xe6, 0x07, 0x89, 0xb6, 0x60, 0x01, 0x51, 0x8b, 0xce, 0xd1, 0xe1, 0xd1, + 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x8b, 0x0c, 0x83, 0xf9, 0x05, 0x74, 0x03, 0x0d, 0x00, + 0x01, 0x59, 0x83, 0xf8, 0x04, 0x75, 0x1a, 0x51, 0xb9, 0x08, 0x00, 0x8d, 0xb6, 0x3e, 0x01, 0x39, + 0x04, 0x74, 0x08, 0x83, 0xc6, 0x04, 0xe2, 0xf7, 0x59, 0xeb, 0x06, 0x89, 0x54, 0x02, 0x59, 0xeb, + 0x13, 0x89, 0x8e, 0x5e, 0x01, 0xd1, 0xe1, 0xd1, 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x89, + 0x04, 0x89, 0x54, 0x02, 0xc3, 0x8d, 0xb6, 0x58, 0x15, 0x89, 0x54, 0x06, 0xc7, 0x44, 0x04, 0x08, + 0x00, 0x3c, 0x05, 0x75, 0x05, 0xc7, 0x44, 0x04, 0x06, 0x00, 0x25, 0xff, 0x7f, 0x89, 0x04, 0xb8, + 0x40, 0x60, 0x8e, 0xc0, 0x26, 0xc7, 0x06, 0x70, 0x00, 0x00, 0x20, 0xc3, 0x8b, 0x86, 0x14, 0x01, + 0x89, 0x86, 0x12, 0x01, 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x08, 0x1e, 0xc7, 0x86, 0x28, 0x01, + 0x00, 0x00, 0xc7, 0x86, 0x2a, 0x01, 0x00, 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, + 0xe0, 0x01, 0xb9, 0x2b, 0x00, 0xf3, 0xab, 0xc7, 0x86, 0x26, 0x02, 0xff, 0xff, 0xb0, 0x02, 0xe8, + 0x1d, 0xce, 0xf7, 0x86, 0xf6, 0x00, 0x80, 0x00, 0x74, 0x0c, 0xb8, 0x05, 0x00, 0xe8, 0x13, 0x00, + 0xc6, 0x46, 0x07, 0x42, 0xeb, 0x0c, 0xb8, 0x02, 0x00, 0xe8, 0x07, 0x00, 0xc6, 0x46, 0x07, 0x02, + 0xeb, 0x00, 0xc3, 0x50, 0xb0, 0x00, 0x88, 0x86, 0xa5, 0x02, 0x88, 0x86, 0xa6, 0x02, 0x88, 0x86, + 0xa7, 0x02, 0x88, 0x86, 0xa8, 0x02, 0x88, 0x86, 0xaa, 0x02, 0x88, 0x86, 0xa9, 0x02, 0x58, 0x9c, + 0xfa, 0x83, 0xf8, 0x02, 0x74, 0x13, 0x83, 0xf8, 0x05, 0x74, 0x0c, 0xc7, 0x46, 0x12, 0x26, 0x1d, + 0xc7, 0x46, 0x14, 0x26, 0x1d, 0xeb, 0x42, 0xeb, 0x21, 0xc6, 0x86, 0xa5, 0x02, 0x01, 0xc6, 0x86, + 0xa9, 0x02, 0x01, 0xc6, 0x86, 0xaa, 0x02, 0x00, 0xc7, 0x46, 0x12, 0x0a, 0x32, 0xc7, 0x46, 0x14, + 0x37, 0x2f, 0xc7, 0x86, 0xba, 0x01, 0x2c, 0x00, 0xeb, 0x1f, 0xc6, 0x86, 0xa7, 0x02, 0x01, 0xc6, + 0x86, 0xa9, 0x02, 0x00, 0xc6, 0x86, 0xaa, 0x02, 0x01, 0xc7, 0x46, 0x12, 0x0e, 0x32, 0xc7, 0x46, + 0x14, 0x3b, 0x2f, 0xc7, 0x86, 0xba, 0x01, 0x2c, 0x00, 0x0e, 0xe8, 0x02, 0x00, 0xeb, 0x01, 0xcf, + 0xc3, 0x8c, 0x00, 0x84, 0x46, 0xbc, 0x02, 0x96, 0x00, 0xba, 0x46, 0x14, 0x00, 0x96, 0x00, 0xce, + 0x46, 0x08, 0x07, 0x96, 0x00, 0x08, 0x47, 0x6e, 0x00, 0x78, 0x00, 0x88, 0x49, 0x00, 0x00, 0x6e, + 0x00, 0xc2, 0x47, 0xf4, 0x01, 0x6e, 0x00, 0xf2, 0x47, 0x08, 0x07, 0x6e, 0x00, 0x30, 0x4b, 0x05, + 0x00, 0xaa, 0x00, 0x36, 0x48, 0xfa, 0x00, 0x8c, 0x00, 0xac, 0x48, 0x02, 0x00, 0x8c, 0x00, 0x8c, + 0x47, 0x3c, 0x00, 0x78, 0x00, 0x18, 0x49, 0x04, 0x01, 0x96, 0x00, 0x44, 0x49, 0x64, 0x00, 0x96, + 0x00, 0x68, 0x49, 0xdc, 0x05, 0xbe, 0x00, 0x8e, 0x4a, 0xf4, 0x01, 0xbe, 0x00, 0x8e, 0x4a, 0x32, + 0x00, 0xa0, 0x00, 0xb4, 0x4b, 0xf4, 0x01, 0xbe, 0x00, 0xb8, 0x4a, 0xf4, 0x01, 0x82, 0x00, 0xe6, + 0x4d, 0x19, 0x00, 0x6e, 0x00, 0x9b, 0x4b, 0x14, 0x00, 0x78, 0x00, 0xcc, 0x4a, 0xc4, 0x09, 0x6e, + 0x00, 0xe0, 0x4a, 0x02, 0x00, 0x78, 0x00, 0xec, 0x4c, 0xf0, 0x00, 0x6e, 0x00, 0x0b, 0x4c, 0x04, + 0x00, 0xa0, 0x00, 0x22, 0x4c, 0xbc, 0x02, 0x6e, 0x00, 0x34, 0x4c, 0x08, 0x07, 0x6e, 0x00, 0x42, + 0x4c, 0xe8, 0x03, 0x6e, 0x00, 0x54, 0x4c, 0x14, 0x00, 0x96, 0x00, 0x60, 0x4c, 0x64, 0x00, 0xa0, + 0x00, 0xfa, 0x4c, 0xf4, 0x01, 0xc8, 0x00, 0x70, 0x48, 0x02, 0x00, 0x6e, 0x00, 0x88, 0x4c, 0x04, + 0x00, 0x8c, 0x00, 0xca, 0x4c, 0x14, 0x00, 0xb4, 0x00, 0xf2, 0x4e, 0x64, 0x00, 0xa0, 0x00, 0x0b, + 0x4e, 0x05, 0x00, 0xc8, 0x00, 0x20, 0x4e, 0x03, 0x00, 0xd2, 0x00, 0x72, 0x4e, 0xf4, 0x01, 0xd2, + 0x00, 0x84, 0x4e, 0x4c, 0x04, 0xdc, 0x00, 0x9e, 0x4e, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x80, 0xbe, 0x54, 0x02, 0x01, 0x75, 0x28, 0x80, + 0x7e, 0x08, 0x00, 0x75, 0x22, 0xf6, 0x86, 0x65, 0x02, 0x01, 0x74, 0x1c, 0xe8, 0x3e, 0xe2, 0xbe, + 0x8d, 0x45, 0xe8, 0xf7, 0xc8, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0xee, 0x01, 0xab, + 0xab, 0xab, 0xc6, 0x86, 0x65, 0x02, 0x00, 0xc3, 0xe8, 0xa4, 0xe4, 0xeb, 0xdf, 0x90, 0x8a, 0x46, + 0x08, 0x3c, 0x0a, 0x75, 0x0b, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09, 0x04, + 0xc3, 0x90, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x32, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x2c, 0x80, + 0x7e, 0x06, 0x0c, 0x75, 0x0f, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x08, 0xb8, 0x07, 0x00, 0xe8, + 0x39, 0xd6, 0xeb, 0x17, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x10, 0xf6, 0x86, 0x59, 0x02, 0x01, + 0x75, 0x09, 0xc6, 0x86, 0x59, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x08, 0xc3, 0x8a, 0x4e, 0x06, 0x8a, + 0x56, 0x08, 0x80, 0xf9, 0x06, 0x74, 0x71, 0x80, 0xf9, 0x08, 0x74, 0x05, 0x80, 0xf9, 0x0a, 0x75, + 0x0a, 0x80, 0xfa, 0x0c, 0x74, 0x62, 0x80, 0xfa, 0x04, 0x74, 0x5d, 0x80, 0xfa, 0x0c, 0x74, 0x05, + 0x80, 0xfa, 0x04, 0x75, 0x52, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x4b, 0xe8, 0x07, 0x03, 0xf6, + 0x86, 0x61, 0x02, 0x01, 0x74, 0x0b, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x80, 0xc6, 0x86, 0x85, 0x02, + 0x01, 0xc6, 0x46, 0x09, 0x06, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x50, 0xc6, 0x86, 0x85, 0x02, 0x01, + 0xc6, 0x86, 0x6a, 0x02, 0x01, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8, + 0x6a, 0xca, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xbe, 0x99, 0x45, 0xe8, 0x1b, + 0xc8, 0xbe, 0xc3, 0x45, 0xe8, 0x15, 0xc8, 0xc3, 0xb8, 0x07, 0x00, 0xe8, 0x9d, 0xd5, 0xeb, 0xf7, + 0x80, 0xbe, 0xa5, 0x02, 0x01, 0x74, 0x02, 0xeb, 0x2b, 0x80, 0x7e, 0x06, 0x10, 0x75, 0x06, 0xc6, + 0x46, 0x07, 0x12, 0xeb, 0x1f, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x19, 0xc6, 0x86, 0x69, 0x02, 0x01, + 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8, 0x24, 0xca, 0xbe, 0x05, 0x46, 0xe8, 0xde, 0xc7, 0xbe, 0x0b, + 0x46, 0xe8, 0xd8, 0xc7, 0xc3, 0x90, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x74, 0x28, 0xc6, 0x86, 0x5f, + 0x02, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x17, 0x80, 0x7e, + 0x08, 0x06, 0x75, 0x11, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xe8, 0xf0, 0xc9, 0xbe, 0xc3, 0x45, 0xe8, + 0xaa, 0xc7, 0xe8, 0x45, 0xe0, 0xc3, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x75, 0x2e, 0xf7, 0x86, 0xf6, + 0x00, 0x00, 0x02, 0x75, 0x1e, 0xe8, 0x40, 0xd6, 0xc6, 0x86, 0x92, 0x02, 0x00, 0x8b, 0x86, 0xf8, + 0x00, 0x89, 0x86, 0xf6, 0x00, 0xc6, 0x46, 0x07, 0x06, 0xc6, 0x46, 0x06, 0x06, 0xc6, 0x46, 0x09, + 0x04, 0xeb, 0x16, 0xb8, 0x0d, 0x00, 0xe8, 0x02, 0xd5, 0xeb, 0x0e, 0x3c, 0x08, 0x72, 0x0a, 0x3c, + 0x0c, 0x77, 0x06, 0xb8, 0x05, 0x00, 0xe8, 0xf2, 0xd4, 0xc3, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x33, + 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75, 0x2c, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x25, 0x8e, 0x46, + 0x02, 0x26, 0xf7, 0x06, 0x14, 0x00, 0x03, 0x00, 0x74, 0x11, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, + 0x14, 0x00, 0x03, 0xbe, 0xbd, 0x45, 0xe8, 0x33, 0xc7, 0xeb, 0x08, 0xc6, 0x46, 0x09, 0x04, 0xff, + 0x86, 0x4a, 0x02, 0xc3, 0x80, 0x7e, 0x08, 0x18, 0x75, 0x0e, 0xbe, 0x41, 0x46, 0xe8, 0x1c, 0xc7, + 0xe8, 0xc3, 0x01, 0xe8, 0xb4, 0xdf, 0xeb, 0x00, 0xc3, 0xf6, 0x86, 0x7c, 0x02, 0x01, 0x75, 0x1e, + 0x80, 0xbe, 0x68, 0x02, 0x01, 0x75, 0x17, 0xc6, 0x46, 0x07, 0x12, 0xc6, 0x46, 0x09, 0x1e, 0x83, + 0x8e, 0x06, 0x02, 0x08, 0x83, 0x8e, 0x1e, 0x01, 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc3, 0x90, + 0x80, 0x7e, 0x08, 0x00, 0x75, 0x35, 0x80, 0xbe, 0x5b, 0x02, 0x01, 0x75, 0x58, 0x80, 0xbe, 0x54, + 0x02, 0x01, 0x74, 0x1f, 0xe8, 0x41, 0xe0, 0x80, 0x7e, 0x06, 0x0a, 0x75, 0x16, 0xc6, 0x86, 0x63, + 0x02, 0x01, 0xc6, 0x46, 0x07, 0x0c, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x40, 0x75, 0x05, 0xc6, 0x86, + 0x5e, 0x02, 0x01, 0xc3, 0xbe, 0xc3, 0x45, 0xe8, 0xb2, 0xc6, 0xc3, 0x8a, 0x46, 0x08, 0x3c, 0x04, + 0x75, 0x0e, 0xbe, 0xc3, 0x45, 0xe8, 0xa4, 0xc6, 0xff, 0x86, 0xb2, 0x02, 0xe8, 0x73, 0xdf, 0xc3, + 0x3c, 0x06, 0x75, 0xdf, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x75, 0xd8, 0xbe, 0xc3, 0x45, 0xe8, 0x8b, + 0xc6, 0xe8, 0x26, 0xdf, 0xc3, 0xc6, 0x86, 0x66, 0x02, 0x01, 0xc3, 0x90, 0x80, 0xbe, 0xa6, 0x02, + 0x01, 0x74, 0x22, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x1b, 0xff, 0x86, 0xb8, 0x02, 0x83, 0xbe, 0xb8, + 0x02, 0x04, 0x77, 0x0a, 0xbe, 0xcf, 0x45, 0xe8, 0x62, 0xc6, 0xe8, 0x70, 0xe0, 0xc3, 0xb8, 0x09, + 0x00, 0xe8, 0xe7, 0xd3, 0xc3, 0xeb, 0xfd, 0x90, 0x80, 0x7e, 0x08, 0x02, 0x75, 0x1d, 0x80, 0xbe, + 0x5e, 0x02, 0x01, 0x74, 0x08, 0xb8, 0x05, 0x00, 0xe8, 0xd0, 0xd3, 0xeb, 0x0e, 0xff, 0x86, 0x4a, + 0x02, 0xc6, 0x46, 0x09, 0x04, 0xb8, 0x00, 0x01, 0xe8, 0x25, 0xe2, 0xc3, 0x80, 0x7e, 0x08, 0x00, + 0x75, 0x16, 0x80, 0xbe, 0x54, 0x02, 0x01, 0x74, 0x07, 0x80, 0xbe, 0x5e, 0x02, 0x00, 0x74, 0x08, + 0xff, 0x86, 0x4a, 0x02, 0xc6, 0x46, 0x09, 0x04, 0xc3, 0xe9, 0xb8, 0x00, 0xf6, 0x86, 0xaa, 0x02, + 0x01, 0x75, 0x07, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0xef, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, + 0x74, 0x06, 0xbe, 0xa5, 0x45, 0xe8, 0xf4, 0xc5, 0x8d, 0xbe, 0xd0, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, + 0xb9, 0x05, 0x00, 0x33, 0xc0, 0xf3, 0xaf, 0x74, 0xd0, 0x80, 0xbe, 0xa5, 0x02, 0x01, 0x74, 0x45, + 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x5f, 0x80, 0xbe, 0xa7, 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe, + 0xa8, 0x02, 0x01, 0x74, 0x51, 0xeb, 0x6d, 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0x81, 0x8e, 0x06, + 0x02, 0x00, 0x20, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x74, 0x14, 0x80, + 0x7e, 0x08, 0x16, 0x75, 0x0e, 0xc6, 0x86, 0x56, 0x02, 0x00, 0xe8, 0xca, 0xdf, 0xc7, 0x86, 0x2a, + 0x02, 0x03, 0x00, 0xeb, 0x3f, 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0xc6, 0x86, 0x56, 0x02, 0x00, + 0xe8, 0xb4, 0xdf, 0xc7, 0x86, 0x2a, 0x02, 0x03, 0x00, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x20, 0xc6, + 0x86, 0x85, 0x02, 0x01, 0xeb, 0x1e, 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0x81, 0x8e, 0x06, 0x02, + 0x00, 0x20, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x75, 0x05, 0xc6, + 0x86, 0x56, 0x02, 0x00, 0xc3, 0x90, 0xb8, 0x00, 0x02, 0xc7, 0x86, 0x32, 0x02, 0x06, 0x00, 0x80, + 0xbe, 0x61, 0x02, 0x01, 0x74, 0x37, 0xf6, 0x86, 0xa7, 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0xa8, + 0x02, 0x01, 0x74, 0x05, 0xb8, 0x00, 0x05, 0xeb, 0x24, 0xb8, 0x00, 0x04, 0xc7, 0x86, 0x32, 0x02, + 0x04, 0x00, 0x8a, 0x4e, 0x08, 0x80, 0xf9, 0x0c, 0x74, 0x13, 0xb8, 0x00, 0x04, 0x80, 0xbe, 0x5a, + 0x02, 0x01, 0x74, 0x09, 0xb8, 0x00, 0x03, 0xc7, 0x86, 0x32, 0x02, 0x07, 0x00, 0x89, 0x86, 0x00, + 0x03, 0xc3, 0x80, 0x7e, 0x08, 0x08, 0x74, 0x23, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x72, 0x1c, 0x3c, + 0x48, 0x74, 0x04, 0x3c, 0x0e, 0x77, 0x14, 0xf6, 0x86, 0x5d, 0x02, 0x01, 0x74, 0x0d, 0xf6, 0x86, + 0x5c, 0x02, 0x01, 0x74, 0x06, 0xb8, 0x0c, 0x00, 0xe8, 0x70, 0xd2, 0xc3, 0xc6, 0x86, 0x5d, 0x02, + 0x01, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04, 0x00, 0xff, 0xf7, 0xe8, 0xd6, 0x02, 0xc3, 0x90, + 0x80, 0x7e, 0x06, 0x02, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x06, 0xb8, 0x01, 0x00, 0xe8, + 0x49, 0xd2, 0xc3, 0x90, 0x51, 0x52, 0x56, 0x33, 0xd2, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xe8, 0xeb, + 0xc6, 0x8d, 0xb6, 0xa6, 0x01, 0x8d, 0xbe, 0xac, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, + 0xc6, 0x86, 0x83, 0x02, 0x00, 0x32, 0xc0, 0xe8, 0x52, 0xe3, 0xc6, 0x86, 0x68, 0x01, 0x02, 0xc7, + 0x86, 0x66, 0x01, 0x20, 0x03, 0xbe, 0xb7, 0x45, 0xe8, 0x81, 0xc4, 0x8b, 0xb6, 0x64, 0x01, 0xb9, + 0xe8, 0x03, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x1c, 0x00, 0x00, 0x00, 0xe8, 0x1d, 0xde, 0x5e, + 0x5a, 0x59, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x02, 0x74, 0x0e, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x08, + 0x80, 0x7e, 0x08, 0x08, 0x74, 0x02, 0xeb, 0x56, 0xfe, 0x8e, 0x68, 0x01, 0x80, 0x8e, 0x68, 0x01, + 0x00, 0x74, 0x45, 0xbe, 0xb7, 0x45, 0xe8, 0x43, 0xc4, 0xe8, 0xac, 0xbe, 0x8e, 0x46, 0x02, 0x26, + 0x81, 0x0e, 0x0c, 0x00, 0x00, 0x01, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x0c, 0x00, 0xff, + 0xfe, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x1c, 0x00, 0x00, 0x00, 0x8b, 0xb6, 0x64, 0x01, 0xb9, + 0xe8, 0x03, 0xc6, 0x86, 0x86, 0x02, 0x01, 0x83, 0xbe, 0x66, 0x01, 0x01, 0x75, 0x05, 0xe8, 0xa2, + 0xdd, 0xeb, 0x0b, 0xe8, 0xb6, 0xdd, 0xeb, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0x8d, 0xd1, 0xc3, 0xf7, + 0x86, 0xf6, 0x00, 0x80, 0x00, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x14, 0x75, 0x0a, 0xb8, 0x05, 0x00, + 0xe8, 0x60, 0xf9, 0xc6, 0x46, 0x07, 0x42, 0xc3, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x4e, 0xc6, + 0x86, 0x6c, 0x02, 0x00, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x2c, 0xf6, 0x86, 0x6d, 0x02, 0x01, 0x74, + 0x25, 0xe9, 0xa6, 0xcf, 0xbe, 0xc9, 0x45, 0xe8, 0xc2, 0xc3, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, + 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, + 0x01, 0xe8, 0xe6, 0x07, 0xeb, 0x16, 0x80, 0x7e, 0x06, 0x10, 0x75, 0x10, 0xc6, 0x46, 0x09, 0x00, + 0xc6, 0x86, 0x54, 0x02, 0x00, 0xc6, 0x86, 0x68, 0x02, 0x00, 0xeb, 0xc8, 0xc3, 0xeb, 0xfd, 0x80, + 0x7e, 0x06, 0x42, 0x75, 0x0f, 0xc7, 0x86, 0xce, 0x02, 0x05, 0x00, 0xbe, 0x47, 0x46, 0xe8, 0x7b, + 0xc3, 0xe8, 0xbc, 0xdf, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x18, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x1a, + 0x75, 0x04, 0xc6, 0x46, 0x09, 0x1c, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x06, 0xb8, 0x05, + 0x00, 0xe8, 0xe7, 0xd0, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x1c, 0x75, 0x0a, 0x80, 0x7e, 0x06, 0x48, + 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x04, 0xc6, 0x46, + 0x07, 0x44, 0xc3, 0x90, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x20, 0xf6, 0x46, 0x06, 0x46, 0x75, + 0x11, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xe8, 0x5e, 0xc5, 0xff, 0x86, + 0xcc, 0x02, 0xe8, 0x83, 0xdc, 0xbe, 0x35, 0x46, 0xe8, 0x11, 0xc3, 0xc3, 0x80, 0x7e, 0x06, 0x42, + 0x75, 0x3b, 0xf6, 0x86, 0x77, 0x02, 0x01, 0x75, 0x34, 0x83, 0xbe, 0xce, 0x02, 0x00, 0x74, 0x0f, + 0xff, 0x8e, 0xce, 0x02, 0xbe, 0x47, 0x46, 0xe8, 0xf2, 0xc2, 0xe8, 0x33, 0xdf, 0xeb, 0x1e, 0xf7, + 0x86, 0xf4, 0x00, 0x00, 0x10, 0x74, 0x10, 0xb8, 0x02, 0x00, 0xe8, 0x56, 0xf8, 0xc6, 0x46, 0x09, + 0x1e, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x06, 0xb8, 0x06, 0x00, 0xe8, 0x5e, 0xd0, 0xc3, 0x80, 0x7e, + 0x06, 0x46, 0x75, 0x1a, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xe8, 0xfb, + 0xc4, 0xff, 0x86, 0xcc, 0x02, 0xbe, 0x4d, 0x46, 0xe8, 0xb1, 0xc2, 0xe8, 0x34, 0xdf, 0xc3, 0x90, + 0x80, 0x7e, 0x06, 0x44, 0x75, 0x06, 0xb8, 0x05, 0x00, 0xe8, 0x2f, 0xd0, 0xc3, 0x90, 0x80, 0x7e, + 0x06, 0x46, 0x75, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0x21, 0xd0, 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x16, + 0x75, 0x11, 0xc7, 0x86, 0x2a, 0x02, 0x04, 0x00, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x74, 0x04, 0xc6, + 0x46, 0x09, 0x18, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x16, 0x02, 0x00, 0xf7, 0xc2, 0x02, 0x00, + 0x74, 0x14, 0x8b, 0xc2, 0x83, 0xe0, 0xfd, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x02, 0x00, 0x8e, 0x46, + 0x02, 0x26, 0x89, 0x16, 0x02, 0x00, 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x14, 0x00, + 0x03, 0x00, 0x74, 0x10, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x14, 0x00, 0x03, 0xc6, 0x86, 0x55, + 0x02, 0x01, 0xeb, 0x00, 0xf6, 0x86, 0x55, 0x02, 0x01, 0x75, 0x14, 0x80, 0x7e, 0x08, 0x00, 0x75, + 0x0e, 0xc6, 0x46, 0x09, 0x02, 0xff, 0x86, 0x40, 0x02, 0x81, 0x8e, 0xda, 0x02, 0x00, 0x02, 0xc6, + 0x86, 0x55, 0x02, 0x00, 0xc3, 0x90, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x10, 0x75, 0x15, 0x8e, 0x46, + 0x02, 0x26, 0xf7, 0x06, 0x14, 0x00, 0x03, 0x00, 0x74, 0x09, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, + 0x14, 0x00, 0x03, 0xc3, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x75, 0x3d, 0x8e, 0x46, 0x02, 0x26, 0xf7, + 0x06, 0x14, 0x00, 0x08, 0x00, 0x74, 0x2c, 0xf6, 0x86, 0x5d, 0x02, 0x01, 0x74, 0x2a, 0xf6, 0x86, + 0x5c, 0x02, 0x01, 0x75, 0x23, 0xc7, 0x86, 0x2a, 0x02, 0x0a, 0x00, 0xbe, 0xe1, 0x45, 0xf7, 0x86, + 0x12, 0x01, 0x20, 0x00, 0x74, 0x03, 0xbe, 0xe7, 0x45, 0xe8, 0xc0, 0xc1, 0xc6, 0x86, 0x5c, 0x02, + 0x01, 0xeb, 0x05, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xc3, 0x90, 0xbe, 0xf9, 0x45, 0xe8, 0xac, 0xc1, + 0x33, 0xc0, 0x87, 0x86, 0xc2, 0x02, 0x0b, 0xc0, 0x75, 0x14, 0x80, 0xbe, 0x61, 0x02, 0x00, 0x74, + 0x0d, 0xc6, 0x86, 0x61, 0x02, 0x00, 0x80, 0xa6, 0x07, 0x02, 0x7f, 0xe8, 0x38, 0xfc, 0xc3, 0x80, + 0x7e, 0x06, 0x12, 0x75, 0x0d, 0xc6, 0x86, 0x08, 0x01, 0x01, 0xc6, 0x86, 0x09, 0x01, 0x00, 0xe8, + 0x9a, 0xf6, 0xc3, 0x90, 0xf6, 0x86, 0x6e, 0x01, 0x01, 0x74, 0x15, 0x80, 0xbe, 0x70, 0x01, 0x03, + 0x73, 0x07, 0xc6, 0x86, 0x6c, 0x01, 0x01, 0xeb, 0x23, 0xc6, 0x86, 0x6e, 0x01, 0x00, 0xeb, 0x1c, + 0xf6, 0x86, 0x6f, 0x01, 0x01, 0x74, 0x15, 0x80, 0xbe, 0x71, 0x01, 0x03, 0x73, 0x07, 0xc6, 0x86, + 0x6d, 0x01, 0x01, 0xeb, 0x07, 0xc6, 0x86, 0x6f, 0x01, 0x00, 0xeb, 0x00, 0xc3, 0xf7, 0x86, 0x58, + 0x15, 0x00, 0x80, 0x75, 0x07, 0x83, 0xbe, 0x58, 0x15, 0x05, 0x74, 0x05, 0xc6, 0x86, 0xca, 0x01, + 0x01, 0xc3, 0xe8, 0x9d, 0xcf, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x09, 0xe8, 0x92, + 0xf5, 0xbe, 0x6b, 0x46, 0xe8, 0x15, 0xc1, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x11, + 0x81, 0x8e, 0x06, 0x02, 0x00, 0x04, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xb8, 0x10, 0x00, 0xe8, 0x8a, + 0xce, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x00, 0x00, 0x02, 0x00, 0x74, 0x41, 0xbb, 0x00, + 0x03, 0x8b, 0x47, 0x14, 0x83, 0xf8, 0x00, 0x74, 0x36, 0x3b, 0x86, 0x2a, 0x01, 0x74, 0x0c, 0x89, + 0x86, 0x2a, 0x01, 0xc7, 0x86, 0x28, 0x01, 0x00, 0x00, 0xeb, 0x24, 0xff, 0x86, 0x28, 0x01, 0x83, + 0xbe, 0x28, 0x01, 0x02, 0x72, 0x19, 0x83, 0xbe, 0x28, 0x01, 0x18, 0x73, 0x0c, 0x80, 0x7e, 0x08, + 0x00, 0x74, 0x0c, 0x80, 0x7e, 0x08, 0x16, 0x74, 0x06, 0xb8, 0x10, 0x00, 0xe8, 0x3c, 0xce, 0xbe, + 0x71, 0x46, 0xe8, 0xa7, 0xc0, 0xc3, 0x8b, 0x86, 0x30, 0x01, 0x88, 0xa6, 0x2c, 0x01, 0x86, 0x86, + 0x2d, 0x01, 0x32, 0x86, 0x2d, 0x01, 0x74, 0x0f, 0xf6, 0x46, 0x06, 0x0e, 0x74, 0x06, 0xf6, 0x46, + 0x06, 0x48, 0x75, 0x03, 0xe8, 0x94, 0xbb, 0xc3, 0xf6, 0x86, 0x90, 0x02, 0x01, 0x74, 0x0a, 0xa8, + 0x24, 0x74, 0x06, 0xc7, 0x86, 0x9d, 0x02, 0x05, 0x00, 0xf6, 0x86, 0xa9, 0x02, 0x01, 0x74, 0x09, + 0x80, 0xbe, 0x5e, 0x02, 0x01, 0x75, 0x58, 0xeb, 0x09, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x75, 0x10, + 0xeb, 0x52, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x02, 0xeb, 0x45, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x3f, + 0xa8, 0x01, 0x74, 0x05, 0x83, 0x8e, 0xda, 0x02, 0x10, 0xa8, 0x04, 0x74, 0x05, 0x83, 0x8e, 0xda, + 0x02, 0x04, 0xa8, 0x08, 0x74, 0x05, 0x83, 0x8e, 0xda, 0x02, 0x40, 0xa8, 0x20, 0x74, 0x10, 0x81, + 0x8e, 0xda, 0x02, 0x00, 0x01, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75, 0x03, 0xe8, 0x2f, 0xc4, 0xa8, + 0x40, 0x74, 0x05, 0x83, 0x8e, 0xda, 0x02, 0x01, 0xa8, 0x80, 0x74, 0x03, 0xe8, 0x52, 0x00, 0xa9, + 0x00, 0x01, 0x75, 0x01, 0xc3, 0x50, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x04, + 0xeb, 0x1b, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x23, 0xc6, 0x46, 0x09, 0x02, 0xff, 0x86, 0x40, 0x02, + 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x06, 0x81, 0x8e, 0xda, 0x02, 0x00, 0x02, 0xc6, 0x86, 0x69, + 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x10, 0x8e, 0x46, 0x02, 0x26, 0xc7, + 0x06, 0x08, 0x00, 0x00, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x08, 0x00, 0x00, 0x01, 0x58, + 0xc3, 0x83, 0x8e, 0xda, 0x02, 0x20, 0x83, 0x7e, 0x06, 0x08, 0x75, 0x13, 0x8b, 0x8e, 0xc4, 0x02, + 0x41, 0x89, 0x8e, 0xc4, 0x02, 0x80, 0xf9, 0x02, 0x75, 0x05, 0x50, 0xe8, 0x35, 0xd9, 0x58, 0xc3, + 0x50, 0x53, 0x51, 0x8a, 0x4e, 0x06, 0x80, 0xf9, 0x0e, 0x74, 0x1e, 0x80, 0xf9, 0x48, 0x74, 0x19, + 0x80, 0xbe, 0x54, 0x02, 0x01, 0x74, 0x46, 0x80, 0xf9, 0x08, 0x72, 0x41, 0x80, 0xf9, 0x0e, 0x77, + 0x3c, 0xb8, 0x02, 0x00, 0xe8, 0x04, 0xcd, 0xeb, 0x34, 0xc7, 0x86, 0x2a, 0x02, 0x05, 0x00, 0xc6, + 0x86, 0x61, 0x02, 0x01, 0x8a, 0x46, 0x08, 0x3c, 0x06, 0x74, 0x26, 0x3c, 0x02, 0x74, 0x51, 0x3c, + 0x08, 0x74, 0x1a, 0x3c, 0x04, 0x74, 0x16, 0xf6, 0x86, 0xa7, 0x02, 0x01, 0x75, 0x13, 0xf6, 0x86, + 0xa8, 0x02, 0x01, 0x75, 0x0c, 0xc6, 0x46, 0x09, 0x04, 0xff, 0x86, 0x4a, 0x02, 0x59, 0x5b, 0x58, + 0xc3, 0x8b, 0x86, 0x06, 0x02, 0xf6, 0xc4, 0x80, 0x75, 0x0c, 0x80, 0xcc, 0x80, 0x89, 0x86, 0x06, + 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0x81, 0xbe, 0x00, 0x03, 0x00, 0x02, 0x74, 0xdf, 0xc7, 0x86, + 0x00, 0x03, 0x00, 0x02, 0xf6, 0x86, 0xa5, 0x02, 0x01, 0x74, 0xd2, 0xe8, 0xac, 0xd7, 0xeb, 0xcd, + 0xb8, 0x00, 0x01, 0xe8, 0xfa, 0xda, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0xc0, 0xc6, 0x46, 0x09, + 0x04, 0xeb, 0xba, 0xfa, 0xc7, 0x06, 0x30, 0x00, 0x0c, 0x0f, 0x8c, 0x0e, 0x32, 0x00, 0xb8, 0x00, + 0x00, 0xe7, 0x06, 0xb8, 0xea, 0x09, 0xe7, 0x00, 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, 0x7f, 0xe8, + 0x92, 0xbb, 0xc6, 0x06, 0x8b, 0x56, 0x80, 0xfb, 0xc3, 0xf7, 0x86, 0x82, 0x01, 0x01, 0x00, 0x74, + 0x1a, 0xc7, 0x86, 0x82, 0x01, 0x00, 0x00, 0xf6, 0x86, 0x6e, 0x01, 0x01, 0x74, 0x0d, 0xc6, 0x86, + 0x6e, 0x01, 0x00, 0xbe, 0x5f, 0x46, 0xe8, 0x65, 0xbf, 0xeb, 0x00, 0xf7, 0x86, 0x8a, 0x01, 0x01, + 0x00, 0x74, 0x45, 0xc7, 0x86, 0x8a, 0x01, 0x00, 0x00, 0xf6, 0x86, 0x6f, 0x01, 0x01, 0x74, 0x0d, + 0xc6, 0x86, 0x6f, 0x01, 0x00, 0xbe, 0x5f, 0x46, 0xe8, 0x43, 0xbf, 0xeb, 0x2b, 0x80, 0x7e, 0x06, + 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x1f, 0xf6, 0x86, 0x5d, 0x02, 0x01, 0x74, 0x18, + 0xf6, 0x86, 0x5c, 0x02, 0x01, 0x75, 0x11, 0xc6, 0x86, 0x5c, 0x02, 0x01, 0xc7, 0x86, 0x2a, 0x02, + 0x0a, 0x00, 0xb8, 0x0c, 0x00, 0xe8, 0xf3, 0xcb, 0xc3, 0xb9, 0x01, 0x00, 0x33, 0xdb, 0x8b, 0xaf, + 0x52, 0x55, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x16, 0x14, 0x00, 0x83, 0xe2, 0x08, 0x26, 0xa1, 0x32, + 0x00, 0xd1, 0xe8, 0xd0, 0xe8, 0x86, 0xe0, 0xf7, 0xc2, 0x08, 0x00, 0x75, 0x02, 0xeb, 0x67, 0x83, + 0xbe, 0x74, 0x01, 0x00, 0x75, 0x04, 0x88, 0xa6, 0x78, 0x01, 0x81, 0xbe, 0x74, 0x01, 0xbc, 0x02, + 0x72, 0x06, 0xc7, 0x86, 0x74, 0x01, 0xf4, 0x01, 0x8a, 0xc4, 0x2a, 0xe4, 0x83, 0xf8, 0x7f, 0x75, + 0x12, 0x8b, 0x86, 0x74, 0x01, 0xbe, 0xeb, 0x09, 0xf7, 0xe6, 0xbe, 0x20, 0x00, 0xf7, 0xf6, 0x03, + 0x86, 0x78, 0x01, 0x89, 0x86, 0x7c, 0x01, 0xff, 0x86, 0x74, 0x01, 0x83, 0xbe, 0x7c, 0x01, 0x7d, + 0x72, 0x21, 0x83, 0xbe, 0x88, 0x01, 0x01, 0x74, 0x1a, 0xc7, 0x86, 0x88, 0x01, 0x01, 0x00, 0xc7, + 0x86, 0x8a, 0x01, 0x01, 0x00, 0xa1, 0x3c, 0x55, 0x89, 0x86, 0x8c, 0x01, 0xa1, 0x3e, 0x55, 0x89, + 0x86, 0x8e, 0x01, 0xe9, 0x94, 0x00, 0x83, 0xbe, 0x76, 0x01, 0x00, 0x75, 0x04, 0x88, 0x86, 0x7a, + 0x01, 0x81, 0xbe, 0x76, 0x01, 0xbc, 0x02, 0x72, 0x06, 0xc7, 0x86, 0x76, 0x01, 0xf4, 0x01, 0x2a, + 0xe4, 0x83, 0xf8, 0x7f, 0x75, 0x12, 0x8b, 0x86, 0x76, 0x01, 0xbe, 0xeb, 0x09, 0xf7, 0xe6, 0xbe, + 0x20, 0x00, 0xf7, 0xf6, 0x03, 0x86, 0x7a, 0x01, 0x89, 0x86, 0x7e, 0x01, 0xff, 0x86, 0x76, 0x01, + 0x83, 0xbe, 0x80, 0x01, 0x01, 0x74, 0x53, 0x83, 0xf8, 0x1f, 0x72, 0x4e, 0x8d, 0xb6, 0x96, 0x01, + 0x83, 0x3c, 0x12, 0x72, 0x45, 0x83, 0x3c, 0x23, 0x77, 0x40, 0x83, 0x7c, 0x02, 0x1f, 0x72, 0x3a, + 0x83, 0x7c, 0x02, 0x45, 0x77, 0x34, 0x83, 0x7c, 0x04, 0x12, 0x72, 0x2e, 0x90, 0x83, 0x7c, 0x04, + 0x23, 0x77, 0x27, 0x81, 0x7c, 0x06, 0x9c, 0x00, 0x72, 0x20, 0xc7, 0x86, 0x80, 0x01, 0x01, 0x00, + 0xc7, 0x86, 0x82, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x88, 0x01, 0x00, 0x00, 0xa1, 0x3c, 0x55, 0x89, + 0x86, 0x84, 0x01, 0xa1, 0x3e, 0x55, 0x89, 0x86, 0x86, 0x01, 0x83, 0xc3, 0x02, 0x49, 0x74, 0x03, + 0xe9, 0xdb, 0xfe, 0xc3, 0x50, 0x51, 0x52, 0x56, 0x57, 0x8e, 0x46, 0x02, 0x83, 0x86, 0x90, 0x01, + 0x01, 0x83, 0x96, 0x92, 0x01, 0x00, 0xc7, 0x86, 0x80, 0x01, 0x00, 0x00, 0x26, 0xa1, 0x32, 0x00, + 0xd1, 0xe8, 0xd0, 0xe8, 0x86, 0xe0, 0x8d, 0xb6, 0x96, 0x01, 0x26, 0x8b, 0x0e, 0x14, 0x00, 0x83, + 0xe1, 0x08, 0x89, 0x8e, 0x94, 0x01, 0xf7, 0xc1, 0x08, 0x00, 0x74, 0x4f, 0x8b, 0x4c, 0x0a, 0x89, + 0x4c, 0x0e, 0x8b, 0x4c, 0x06, 0x89, 0x4c, 0x0a, 0x8b, 0x4c, 0x02, 0x89, 0x4c, 0x06, 0x2a, 0xe4, + 0x8b, 0xc8, 0x83, 0xf8, 0x7f, 0x75, 0x19, 0xb0, 0x0a, 0xe6, 0x10, 0xe5, 0x00, 0xb1, 0x05, 0xd3, + 0xe8, 0x03, 0x86, 0x7e, 0x01, 0x8b, 0xc8, 0xe4, 0x10, 0xa8, 0x10, 0x74, 0x03, 0x83, 0xc1, 0x4f, + 0x8b, 0xc1, 0x89, 0x44, 0x02, 0xc7, 0x86, 0x7e, 0x01, 0x00, 0x00, 0xc7, 0x86, 0x76, 0x01, 0x00, + 0x00, 0xeb, 0x7f, 0xc7, 0x86, 0x88, 0x01, 0x00, 0x00, 0xeb, 0x77, 0x8b, 0x4c, 0x08, 0x89, 0x4c, + 0x0c, 0x8b, 0x4c, 0x04, 0x89, 0x4c, 0x08, 0x8b, 0x0c, 0x89, 0x4c, 0x04, 0x8a, 0xc4, 0x2a, 0xe4, + 0x8b, 0xc8, 0x83, 0xf8, 0x7f, 0x75, 0x25, 0xb0, 0x0a, 0xe6, 0x10, 0xe5, 0x00, 0xb1, 0x05, 0xd3, + 0xe8, 0x03, 0x86, 0x7c, 0x01, 0x8b, 0xc8, 0xe4, 0x10, 0xa8, 0x10, 0x74, 0x03, 0x83, 0xc1, 0x4f, + 0x8b, 0x96, 0x7c, 0x01, 0x83, 0xf9, 0x7f, 0x77, 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0xc1, 0x89, 0x04, + 0xc7, 0x86, 0x7c, 0x01, 0x00, 0x00, 0xc7, 0x86, 0x74, 0x01, 0x00, 0x00, 0x83, 0xf8, 0x7d, 0x72, + 0xa2, 0x83, 0xbe, 0x88, 0x01, 0x01, 0x74, 0x1a, 0xc7, 0x86, 0x88, 0x01, 0x01, 0x00, 0xc7, 0x86, + 0x8a, 0x01, 0x01, 0x00, 0xa1, 0x3c, 0x55, 0x89, 0x86, 0x84, 0x01, 0xa1, 0x3e, 0x55, 0x89, 0x86, + 0x86, 0x01, 0x5f, 0x5e, 0x5a, 0x59, 0x58, 0xc3, 0x50, 0x51, 0x57, 0x06, 0xfa, 0x8c, 0xd8, 0x8e, + 0xc0, 0x2b, 0xc0, 0x8d, 0xbe, 0x72, 0x01, 0xb9, 0x1a, 0x00, 0xf3, 0xab, 0xfb, 0x07, 0x5f, 0x59, + 0x58, 0xc3, 0xfa, 0xf6, 0x06, 0x8b, 0x56, 0x80, 0x74, 0x4e, 0xc6, 0x86, 0x6c, 0x01, 0x00, 0xc6, + 0x86, 0x6e, 0x01, 0x01, 0xfe, 0x86, 0x70, 0x01, 0x8a, 0x46, 0x00, 0xa2, 0x8b, 0x56, 0xc7, 0x06, + 0x8c, 0x56, 0x02, 0x00, 0xc7, 0x06, 0x8e, 0x56, 0x01, 0x00, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, + 0x06, 0x8b, 0xc8, 0xb8, 0xd6, 0x13, 0xe7, 0x02, 0xb8, 0x4e, 0x03, 0xe7, 0x04, 0x83, 0xc9, 0x46, + 0x8b, 0xc1, 0xe7, 0x06, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x02, 0x00, 0x01, 0xbe, 0x5f, 0x46, + 0xe8, 0xc9, 0xbb, 0xc6, 0x86, 0x5d, 0x02, 0x01, 0xfb, 0xc3, 0xfa, 0xf6, 0x06, 0x8b, 0x56, 0x80, + 0x74, 0x49, 0xc6, 0x86, 0x6d, 0x01, 0x00, 0xc6, 0x86, 0x6f, 0x01, 0x01, 0xfe, 0x86, 0x71, 0x01, + 0x8a, 0x46, 0x00, 0xa2, 0x8b, 0x56, 0xc7, 0x06, 0x8c, 0x56, 0x0e, 0x00, 0xc7, 0x06, 0x8e, 0x56, + 0x02, 0x00, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0x8b, 0xc8, 0xb8, 0xf7, 0x03, 0xe7, 0x02, + 0xb8, 0xd6, 0x13, 0xe7, 0x04, 0x83, 0xc9, 0x46, 0x8b, 0xc1, 0xe7, 0x06, 0x8e, 0x46, 0x02, 0x26, + 0x83, 0x0e, 0x02, 0x00, 0x01, 0xbe, 0x5f, 0x46, 0xe8, 0x71, 0xbb, 0xfb, 0xc3, 0x90, 0xe5, 0x06, + 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0x9d, 0x06, 0xe7, 0x02, 0xc7, 0x06, 0x8c, 0x56, 0x04, + 0x00, 0xc3, 0xc7, 0x06, 0x8c, 0x56, 0x06, 0x00, 0xc3, 0x90, 0xc7, 0x06, 0x8c, 0x56, 0x08, 0x00, + 0xc3, 0x90, 0x53, 0xc7, 0x06, 0x8c, 0x56, 0x0a, 0x00, 0x33, 0xdb, 0x8a, 0x1e, 0x8b, 0x56, 0xd0, + 0xe3, 0x8b, 0x9f, 0x52, 0x55, 0x06, 0x8e, 0x47, 0x02, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfe, 0x07, + 0xb8, 0x9d, 0x06, 0xe7, 0x02, 0x5b, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc7, + 0x06, 0x8c, 0x56, 0x0c, 0x00, 0xc6, 0x06, 0x8b, 0x56, 0x80, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, + 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0xf7, 0x03, 0xe7, 0x02, 0xc7, 0x06, 0x8c, 0x56, 0x10, 0x00, 0xc3, + 0x53, 0xc7, 0x06, 0x8c, 0x56, 0x12, 0x00, 0x33, 0xdb, 0x8a, 0x1e, 0x8b, 0x56, 0xd0, 0xe3, 0x8b, + 0x9f, 0x52, 0x55, 0x06, 0x8e, 0x47, 0x02, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfe, 0x07, 0xb8, 0x9d, + 0x06, 0xe7, 0x02, 0x5b, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc7, 0x06, 0x8c, + 0x56, 0x14, 0x00, 0xc6, 0x06, 0x8b, 0x56, 0x80, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, + 0x06, 0xc3, 0x4e, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x54, 0x78, 0x74, 0x30, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x12, 0x45, 0x23, 0x56, 0x34, 0x00, 0x00, 0x00, 0x00, + 0xcd, 0xab, 0xde, 0xbc, 0xef, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x49, 0x6d, 0x70, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x30, 0x00, + 0x00, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x31, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74, 0x31, 0x00, 0x00, + 0x54, 0x65, 0x73, 0x74, 0x32, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x55, 0x59, 0x4e, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, + 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, + 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xe0, 0x02, 0xc0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x04, 0x01, + 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x03, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x03, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x04, 0xc0, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x04, 0x08, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0xe0, 0x05, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x12, 0x00, 0x05, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x06, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, + 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x02, 0x26, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, + 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, + 0x50, 0x20, 0x0c, 0x23, 0x30, 0x30, 0x30, 0x30, 0xf3, 0xf0, 0xf0, 0xf8, 0xf9, 0xf6, 0x08, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x04, 0x21, + 0x00, 0x00, 0x06, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x06, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x29, 0x20, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x06, + 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0xe0, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x40, 0x25, 0x06, 0x0b, + 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x26, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x00, 0xe0, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x27, 0x08, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xe0, 0x00, 0xc0, 0x00, + 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x60, 0x28, 0x04, 0x30, + 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x11, 0x04, 0x0c, 0x00, 0x01, 0x04, 0x0e, 0x00, 0x02, + 0x04, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x12, 0x04, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x30, 0x13, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00, + 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x14, + 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x15, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x22, 0x60, 0x29, 0x08, 0x2d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x2e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x2a, 0x00, 0x00, 0x02, 0x20, 0x80, 0x00, 0x00, 0x06, 0x09, 0x00, 0x00, 0x00, + 0x04, 0x03, 0x01, 0x80, 0x00, 0x00, 0x04, 0x02, 0x80, 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x00, + 0x06, 0x02, 0x02, 0x80, 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x01, 0x26, 0x80, 0x00, + 0x00, 0xff, 0x06, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, + 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, + 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x00, + 0x04, 0x09, 0x00, 0x00, 0x00, 0x04, 0x03, 0x0c, 0x80, 0x00, 0x00, 0x04, 0x0e, 0x80, 0x00, 0x00, + 0x04, 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x0f, 0x80, 0x00, 0x00, 0x04, 0x01, 0x0d, 0x80, 0x00, + 0x00, 0x04, 0x04, 0x02, 0x80, 0x00, 0x00, 0x08, 0x22, 0x00, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, + 0x00, 0xff, 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00, 0xa5, 0xa5, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +#endif /* OLTR_NO_HAWKEYE_MAC */ diff --git a/sys/contrib/dev/oltr/trlldmac.c b/sys/contrib/dev/oltr/trlldmac.c new file mode 100644 index 0000000..930dc26 --- /dev/null +++ b/sys/contrib/dev/oltr/trlldmac.c @@ -0,0 +1,1990 @@ +/* + * $FreeBSD$ + * + * Copyright (c) 1997 + * OLICOM A/S + * Denmark + * + * All Rights Reserved + * + * This source file is subject to the terms and conditions of the + * OLICOM Software License Agreement which restricts the manner + * in which it may be used. + * + *--------------------------------------------------------------------------- + * + * Description: Olicom TMS-380 adapter micro-code + * + *--------------------------------------------------------------------------- + */ + +#include "opt_oltr.h" + +#ifndef OLTR_NO_TMS_MAC + +unsigned char TRlldMacCode[] = { 0x52, 0x94, 0x02, 0x00, 0xba, 0x7a, 0x00, 0x00, 0xa0, 0x00, 0x01, 0xc8, 0xe2, 0x28, 0xd4, 0xdb, + 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, + 0x00, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, + 0xff, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0x7f, 0xff, 0x00, 0x03, + 0x00, 0x00, 0x00, 0xd4, 0xe7, 0xe7, 0xe7, 0xf2, 0xf2, 0xf8, 0x28, 0x43, 0x29, 0x20, 0x43, 0x4f, + 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x20, 0x49, 0x42, 0x4d, 0x20, 0x31, 0x39, 0x38, 0x33, + 0x2c, 0x34, 0x2c, 0x35, 0x2c, 0x36, 0x28, 0x43, 0x29, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, + 0x47, 0x48, 0x54, 0x20, 0x54, 0x49, 0x20, 0x31, 0x39, 0x38, 0x33, 0x2d, 0x38, 0x39, 0x2c, 0x39, + 0x30, 0x2d, 0x39, 0x34, 0x00, 0x00, 0x7b, 0x63, 0xf6, 0xde, 0xf1, 0xcc, 0xed, 0x9c, 0xf7, 0xe2, + 0x00, 0x00, 0x00, 0xc4, 0xbd, 0x24, 0x06, 0x4a, 0x06, 0x50, 0x06, 0x4c, 0xda, 0x00, 0x06, 0x4e, + 0x00, 0x0f, 0x06, 0x32, 0x00, 0x01, 0x07, 0x50, 0x07, 0x58, 0x07, 0x52, 0xc2, 0xce, 0x07, 0x54, + 0x00, 0x0f, 0x07, 0x38, 0x00, 0x01, 0x00, 0xba, 0x00, 0xa0, 0x00, 0xbc, 0xf7, 0xf0, 0x00, 0xbe, + 0x00, 0x0f, 0x07, 0x5e, 0x07, 0x3a, 0x07, 0x62, 0x80, 0x40, 0x07, 0x64, 0xc7, 0xb2, 0x07, 0x66, + 0xc7, 0x94, 0x07, 0x68, 0xc5, 0x9e, 0x07, 0x98, 0x80, 0x00, 0x07, 0x78, 0x80, 0x00, 0x08, 0xe2, + 0x00, 0x04, 0x08, 0xe4, 0x00, 0x01, 0x08, 0xec, 0x00, 0x08, 0x08, 0xf6, 0x00, 0x0a, 0x08, 0xf8, + 0x00, 0x06, 0x09, 0x00, 0x00, 0x0c, 0x09, 0x02, 0x00, 0x04, 0x01, 0xae, 0x00, 0x00, 0x09, 0x1e, + 0x00, 0x00, 0x09, 0x66, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x13, 0x06, 0x0a, 0x00, 0x20, 0x00, 0x00, + 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb2, 0xe6, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb5, 0x02, + 0x00, 0xe0, 0xb6, 0x5e, 0x00, 0xe0, 0xb9, 0x3c, 0x00, 0xe0, 0xb4, 0x12, 0x00, 0xc0, 0xb4, 0x22, + 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xc0, 0xb4, 0x74, 0x00, 0xe0, 0xb3, 0x86, + 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86, + 0x00, 0xc0, 0xbd, 0x4a, 0x00, 0xc0, 0xbd, 0xb4, 0x00, 0xc0, 0xbd, 0xf0, 0x00, 0xc0, 0xbe, 0x60, + 0x00, 0xc0, 0xbe, 0xe2, 0x00, 0xe0, 0xc0, 0x50, 0x00, 0xe0, 0xbf, 0xf6, 0x00, 0xe0, 0xc1, 0x52, + 0x00, 0xe0, 0xc0, 0xe8, 0x00, 0xe0, 0xba, 0x90, 0x00, 0xc0, 0xbb, 0x00, 0x00, 0xc0, 0xbb, 0x5a, + 0x00, 0xc0, 0xbb, 0x8c, 0x00, 0xc0, 0xba, 0xb4, 0x00, 0xc0, 0xb3, 0x80, 0x00, 0xc0, 0xb3, 0x80, + 0x3f, 0x00, 0x7f, 0x00, 0x5e, 0x00, 0x00, 0x30, 0x00, 0x28, 0x00, 0x43, 0xb6, 0xb6, 0xb6, 0xb6, + 0xb5, 0x1c, 0xb5, 0x14, 0xb5, 0x46, 0xb5, 0x46, 0xb5, 0x62, 0xb6, 0xb6, 0x40, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, 0x00, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c, 0x00, 0x10, 0x00, 0x14, 0x10, 0x0e, 0x0c, 0x0c, + 0x0a, 0x0a, 0x0a, 0x0a, 0x00, 0x00, 0xa1, 0xc8, 0x00, 0x09, 0x08, 0x08, 0x00, 0x00, 0xa1, 0xd0, + 0x00, 0x11, 0x06, 0x06, 0x00, 0x00, 0xa1, 0xe0, 0x00, 0x21, 0x04, 0x04, 0x00, 0x00, 0xa2, 0x00, + 0x00, 0x41, 0x02, 0x02, 0x00, 0x00, 0xa2, 0x40, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xc0, + 0x06, 0xd8, 0x07, 0x98, 0xd7, 0xa2, 0x07, 0x58, 0xc6, 0x56, 0x07, 0x58, 0xc5, 0x5c, 0x07, 0x58, + 0xc6, 0xc6, 0x07, 0x58, 0xc6, 0x2e, 0x07, 0x98, 0xd4, 0x7e, 0x07, 0x98, 0xd4, 0x76, 0x07, 0x78, + 0xce, 0xea, 0x07, 0x58, 0xc6, 0x8e, 0x07, 0x98, 0xd7, 0x5c, 0x07, 0x78, 0xcf, 0xbe, 0x07, 0x58, + 0xd4, 0x8e, 0x07, 0x58, 0xc6, 0x3e, 0x07, 0x58, 0xc6, 0x7c, 0x07, 0x58, 0xc7, 0x40, 0x07, 0x98, + 0xd8, 0xd2, 0x07, 0x98, 0xd4, 0xb2, 0x07, 0x78, 0xcf, 0x7e, 0x07, 0xb8, 0xd9, 0x38, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xce, 0x3e, 0xce, 0xf2, 0xd3, 0xfa, 0xca, 0xba, 0xca, 0xf2, + 0xcb, 0x10, 0xcb, 0x9a, 0xcb, 0xbe, 0xcb, 0xda, 0xcc, 0x52, 0xcc, 0x52, 0xcb, 0x86, 0xcc, 0xf0, + 0xcb, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x0c, 0x00, 0x0f, 0x01, 0xfe, 0xff, 0x58, 0x00, + 0x0e, 0x00, 0xfe, 0xff, 0x00, 0x0e, 0x70, 0x00, 0x80, 0x40, 0x5e, 0x00, 0xc0, 0xa0, 0xff, 0xdf, + 0x18, 0x00, 0xe0, 0x00, 0x78, 0x00, 0x50, 0x00, 0x60, 0x00, 0x70, 0x00, 0x0c, 0x00, 0x00, 0x06, + 0x00, 0x00, 0xe3, 0x84, 0x07, 0xe6, 0x07, 0xf4, 0x00, 0x08, 0x00, 0x00, 0xe3, 0x8a, 0x07, 0xea, + 0x07, 0xf4, 0x00, 0x06, 0x00, 0x40, 0x0a, 0x00, 0x07, 0xe6, 0x07, 0xee, 0x00, 0x08, 0x00, 0x40, + 0x0a, 0x06, 0x07, 0xea, 0x07, 0xee, 0x00, 0x00, 0xc1, 0xe2, 0xd4, 0x8b, 0xff, 0xff, 0xd1, 0xd7, + 0xc5, 0xd9, 0xc3, 0xd4, 0x59, 0x3b, 0x09, 0x34, 0x05, 0xfc, 0x09, 0x6c, 0x06, 0xd8, 0x04, 0x06, + 0xea, 0x7a, 0x09, 0x30, 0x04, 0x48, 0x08, 0x80, 0x00, 0x06, 0x06, 0x0a, 0x0c, 0x0e, 0xdb, 0xa8, + 0xe8, 0x7c, 0xe8, 0xa4, 0xe9, 0x8a, 0xea, 0x8c, 0xea, 0xe6, 0xeb, 0x40, 0xeb, 0xf2, 0xdb, 0xa8, + 0xec, 0x74, 0xec, 0x04, 0xe8, 0x62, 0xec, 0x10, 0xec, 0x10, 0xed, 0x3a, 0xed, 0x44, 0xed, 0x4e, + 0xe5, 0x62, 0xe7, 0xea, 0xdb, 0x9e, 0xe5, 0xb4, 0xe6, 0x82, 0xe6, 0xf2, 0xe7, 0x6e, 0xe7, 0x92, + 0xdb, 0xf6, 0xdb, 0x9e, 0xe4, 0xd2, 0xe4, 0xb4, 0xe4, 0x6e, 0xdb, 0x9e, 0xe7, 0xf6, 0xdb, 0x9e, + 0x06, 0x72, 0xdf, 0xa2, 0x07, 0x08, 0x06, 0x72, 0xdf, 0x00, 0x01, 0xf4, 0x06, 0x72, 0xde, 0xe0, + 0x07, 0x08, 0x06, 0x7c, 0xe6, 0x5a, 0x00, 0x04, 0x06, 0x7c, 0xdf, 0x24, 0x00, 0x00, 0x06, 0x7c, + 0xe7, 0xd8, 0x00, 0xfa, 0x06, 0x86, 0xde, 0x70, 0x00, 0x05, 0x06, 0x90, 0xe8, 0x28, 0x00, 0x28, + 0x06, 0x90, 0xdf, 0xfc, 0x01, 0x04, 0x06, 0x90, 0x00, 0x00, 0x00, 0x02, 0x06, 0x90, 0xdf, 0x2c, + 0x02, 0xbc, 0x06, 0x9a, 0xdf, 0xb2, 0x05, 0xdc, 0x06, 0x9a, 0xdf, 0x56, 0x00, 0x64, 0x06, 0x9a, + 0xdf, 0xb6, 0x00, 0x14, 0x06, 0x9a, 0xe9, 0x1c, 0x06, 0x40, 0x06, 0x9a, 0xdf, 0xbe, 0x00, 0x64, + 0x00, 0x00, 0x07, 0x0a, 0x07, 0x0e, 0x07, 0x04, 0x06, 0xd8, 0x07, 0x00, 0x06, 0xf0, 0x06, 0xee, + 0x06, 0xec, 0x07, 0x0c, 0x06, 0xe6, 0x07, 0x18, 0x50, 0x00, 0x00, 0xcc, 0x00, 0x03, 0x84, 0x00, + 0xa8, 0x00, 0xa0, 0x00, 0x20, 0x00, 0x80, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, 0x00, + 0x40, 0x00, 0x10, 0x00, 0xf4, 0x40, 0xf3, 0x06, 0xf3, 0x20, 0xf3, 0x3a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0xf3, 0xa8, 0xf3, 0x10, 0xf3, 0x26, 0xf3, 0x40, 0x01, 0x40, + 0x01, 0x42, 0x01, 0x42, 0x01, 0x42, 0x00, 0x00, 0x00, 0x7f, 0x00, 0xa0, 0x00, 0xff, 0x02, 0x10, + 0x02, 0x1f, 0x02, 0x30, 0x02, 0x3f, 0x02, 0x50, 0x02, 0x5f, 0x02, 0x70, 0x02, 0x7f, 0x02, 0x90, + 0x02, 0x9f, 0x02, 0xb0, 0x02, 0xbf, 0x02, 0xd0, 0x02, 0xdf, 0x02, 0xe1, 0x02, 0xff, 0x03, 0x01, + 0x03, 0x7f, 0x03, 0x81, 0x03, 0x8f, 0x03, 0x91, 0x03, 0x9f, 0x03, 0xa1, 0x03, 0xaf, 0x03, 0xb1, + 0x03, 0xbf, 0x03, 0xc1, 0x03, 0xcf, 0x03, 0xe1, 0x03, 0xff, 0x07, 0xc0, 0x07, 0xff, 0x0c, 0x00, + 0x0f, 0xff, 0x30, 0x00, 0x37, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xbc, 0x00, 0x07, 0x02, 0x5e, + 0x01, 0x00, 0xba, 0xff, 0xba, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x01, 0x0a, + 0x01, 0x0e, 0x01, 0x10, 0x01, 0x14, 0x00, 0x00, 0x01, 0x12, 0xf8, 0x00, 0x01, 0x16, 0xff, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x0a, 0x01, 0x1c, 0x01, 0x82, 0x96, 0x66, 0x96, 0x66, 0x55, 0x55, + 0x00, 0x00, 0x01, 0x82, 0x8a, 0x2a, 0x8a, 0x2a, 0xc9, 0x18, 0xc9, 0x18, 0x01, 0x86, 0xa2, 0xaa, + 0xa0, 0x1e, 0x55, 0x55, 0x54, 0x1e, 0x01, 0x8a, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x01, 0x8c, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x8e, 0x50, 0x00, 0x00, 0x00, + 0xa8, 0x00, 0x00, 0x00, 0x01, 0x90, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x92, + 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x94, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, + 0x00, 0x00, 0x01, 0x96, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x98, 0x50, 0x00, + 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x9a, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, + 0x01, 0x9c, 0x55, 0x55, 0x7f, 0xc0, 0xaa, 0xaa, 0x7f, 0xc0, 0x00, 0x00, 0x01, 0xa2, 0x01, 0xa4, + 0x01, 0xa8, 0x01, 0xaa, 0x01, 0xae, 0x01, 0xb0, 0x01, 0xb2, 0x01, 0x80, 0x00, 0x00, 0x01, 0x88, + 0xff, 0x00, 0x01, 0x9e, 0x00, 0xff, 0x01, 0xa0, 0x80, 0x00, 0x01, 0xac, 0x80, 0x00, 0x00, 0x00, + 0x01, 0xa6, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xbc, 0x88, 0x00, 0x06, 0x00, 0xc8, 0x00, + 0x00, 0x00, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x02, 0x00, 0x44, 0xf2, 0x50, + 0x00, 0x48, 0xf2, 0x56, 0x00, 0x50, 0xf2, 0x5c, 0x00, 0x60, 0xf2, 0x62, 0x00, 0x78, 0xf2, 0x68, + 0xef, 0xc8, 0xee, 0xd6, 0xe9, 0xfc, 0xee, 0xe8, 0x55, 0x14, 0x01, 0xa0, 0xee, 0xaa, 0xe9, 0x90, + 0xef, 0x04, 0xef, 0x5e, 0xee, 0xbe, 0xf0, 0x16, 0x00, 0x00, 0x00, 0x1e, 0xef, 0x04, 0xef, 0x50, + 0x41, 0x00, 0x41, 0x01, 0xef, 0x74, 0xea, 0x33, 0xee, 0xd6, 0xea, 0x08, 0xee, 0xaa, 0xe9, 0xc4, + 0xef, 0x14, 0xef, 0x20, 0xef, 0x74, 0xea, 0x2e, 0xf0, 0x20, 0x00, 0x00, 0xef, 0xf4, 0xee, 0xaa, + 0xe9, 0xba, 0xef, 0x14, 0xef, 0x20, 0xef, 0xf4, 0xf0, 0x20, 0x00, 0x00, 0xee, 0xaa, 0xe9, 0xb0, + 0xee, 0xca, 0xef, 0x08, 0xef, 0x20, 0xef, 0xf4, 0xee, 0xaa, 0xe9, 0xba, 0xef, 0x14, 0xef, 0x20, + 0xef, 0xf4, 0xf0, 0x20, 0x20, 0x00, 0xee, 0xe8, 0x55, 0x14, 0x01, 0xa0, 0xee, 0xd6, 0xea, 0x10, + 0xee, 0xaa, 0xe9, 0x90, 0xf0, 0x16, 0x55, 0x50, 0x00, 0x0c, 0xef, 0x04, 0xef, 0x50, 0x01, 0x00, + 0x00, 0x00, 0xef, 0x74, 0xea, 0x35, 0xee, 0xbe, 0xf0, 0x16, 0x55, 0x55, 0x00, 0x0c, 0xef, 0x14, + 0xef, 0x5e, 0xee, 0xbe, 0xf0, 0x16, 0xff, 0xff, 0x00, 0x08, 0xf0, 0x16, 0x10, 0x02, 0x00, 0x06, + 0xef, 0x04, 0xef, 0x50, 0x01, 0x00, 0x01, 0x01, 0xef, 0x74, 0xea, 0x40, 0xee, 0xbe, 0xf0, 0x16, + 0xc0, 0x00, 0x00, 0x08, 0xf0, 0x16, 0xff, 0xff, 0x00, 0x0a, 0xf0, 0x16, 0xff, 0xff, 0x00, 0x0c, + 0xf0, 0x16, 0x10, 0x0d, 0x00, 0x06, 0xef, 0x04, 0xef, 0x50, 0x01, 0x00, 0x01, 0x01, 0xef, 0x74, + 0xea, 0x34, 0xf0, 0x20, 0x20, 0x08, 0xee, 0xbe, 0xf0, 0x10, 0x01, 0x82, 0xc9, 0x02, 0xef, 0x04, + 0xef, 0x74, 0xea, 0x40, 0xf0, 0x20, 0x20, 0x34, 0xee, 0xbe, 0xf0, 0x16, 0x10, 0x00, 0x00, 0x06, + 0xef, 0x04, 0xf0, 0x84, 0xef, 0x74, 0xea, 0x38, 0xf0, 0x10, 0x01, 0x9c, 0x00, 0x40, 0xee, 0xd6, + 0xea, 0x10, 0xee, 0xe8, 0x00, 0xff, 0x07, 0x80, 0xf0, 0xe4, 0x00, 0x03, 0xf1, 0x24, 0xf1, 0x32, + 0xe9, 0xd2, 0xf0, 0xf6, 0x00, 0x00, 0xf1, 0x32, 0xe9, 0xdc, 0xf0, 0xf6, 0x00, 0x04, 0xf1, 0x32, + 0xe9, 0xe4, 0xf0, 0xf6, 0x00, 0x07, 0xf1, 0x32, 0xe9, 0xec, 0xf0, 0xe4, 0x00, 0x01, 0xf1, 0x32, + 0xe9, 0xf4, 0xf0, 0xf6, 0x00, 0x02, 0xf1, 0x32, 0xe9, 0xf4, 0xf0, 0xf6, 0x00, 0x06, 0xf1, 0x32, + 0xe9, 0xf4, 0xf0, 0xf6, 0x00, 0x05, 0xf1, 0x32, 0xe9, 0xf4, 0xf0, 0xe4, 0x00, 0x01, 0xf1, 0x08, + 0xf0, 0xe4, 0x00, 0x03, 0xf1, 0x16, 0xef, 0x20, 0xf0, 0xa4, 0xe9, 0x98, 0x00, 0x01, 0xf0, 0xa4, + 0xe9, 0xe5, 0x00, 0x02, 0xf0, 0xa4, 0xe9, 0xef, 0x00, 0x06, 0xf0, 0xa4, 0xe9, 0xfa, 0x00, 0x05, + 0xef, 0x74, 0xea, 0x34, 0xef, 0xf4, 0xee, 0xaa, 0xe9, 0x90, 0xef, 0x14, 0xf0, 0x84, 0xee, 0xca, + 0xef, 0x50, 0x01, 0x00, 0x80, 0x00, 0xef, 0x74, 0xea, 0x38, 0xee, 0xbe, 0xf0, 0xbc, 0xf0, 0x10, + 0x01, 0x80, 0x8e, 0x41, 0xef, 0x08, 0xef, 0x50, 0x01, 0x00, 0x1b, 0x01, 0xf0, 0xc4, 0xff, 0xe4, + 0xef, 0x74, 0xea, 0x3c, 0xf0, 0x7c, 0xee, 0xd6, 0xea, 0x16, 0xee, 0xca, 0xf0, 0x28, 0xee, 0xfa, + 0xe0, 0x00, 0xf0, 0x84, 0xef, 0x74, 0xea, 0x46, 0xee, 0xfa, 0xe8, 0x00, 0xef, 0x20, 0xef, 0x74, + 0xea, 0x45, 0xee, 0xfa, 0x08, 0x00, 0xf0, 0x84, 0xef, 0x74, 0xea, 0x46, 0xee, 0xfa, 0xf8, 0x00, + 0xef, 0x20, 0xef, 0x74, 0xea, 0x45, 0xf0, 0x10, 0x01, 0x80, 0x02, 0x00, 0xee, 0xfa, 0xe0, 0x00, + 0xef, 0x20, 0xef, 0x74, 0xea, 0x45, 0xf0, 0x10, 0x01, 0x84, 0x00, 0x00, 0xf0, 0x20, 0x00, 0x34, + 0xee, 0xfa, 0x00, 0x00, 0xf0, 0x84, 0xf0, 0x20, 0x60, 0x34, 0xf0, 0xcc, 0xf0, 0x10, 0x01, 0x84, + 0x00, 0x00, 0xef, 0x74, 0xea, 0x46, 0xf0, 0x10, 0x01, 0x82, 0xc8, 0x00, 0xee, 0xfa, 0xe0, 0x00, + 0xf0, 0x84, 0xee, 0xfa, 0x10, 0x00, 0xf0, 0x84, 0xf0, 0x20, 0x60, 0x34, 0xf0, 0x10, 0x01, 0x80, + 0x06, 0x00, 0xee, 0xfa, 0x00, 0x10, 0xf0, 0x36, 0xef, 0xf4, 0xf0, 0x10, 0x01, 0x84, 0x00, 0x00, + 0xf0, 0x20, 0x00, 0x34, 0xee, 0xaa, 0xe9, 0x90, 0xee, 0xd6, 0xea, 0x1c, 0xf0, 0x8e, 0xe9, 0x52, + 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0xf0, 0x40, 0x00, 0x06, 0xc7, 0x00, 0xef, 0x5e, 0xf0, 0x9a, + 0xe0, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0xd0, 0x40, 0x00, 0x06, 0xe0, 0x00, 0xef, 0x5e, + 0xf0, 0x9a, 0xc0, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x90, 0x40, 0x00, 0x06, 0xa0, 0x00, + 0xef, 0x5e, 0xf0, 0x9a, 0x80, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x50, 0x40, 0x00, 0x06, + 0x60, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x40, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x10, 0x40, + 0x00, 0x06, 0x20, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x00, 0x00, 0xf0, 0x8e, 0xe9, 0x52, 0xee, 0xbe, + 0xee, 0xca, 0xef, 0x2e, 0xd0, 0x40, 0x00, 0x06, 0xa6, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0xc0, 0x00, + 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x90, 0x40, 0x00, 0x06, 0xc0, 0x00, 0xef, 0x5e, 0xf0, 0x9a, + 0x80, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x50, 0x40, 0x00, 0x06, 0x40, 0x00, 0xef, 0x5e, + 0xf0, 0x9a, 0x40, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x70, 0x40, 0x00, 0x06, 0x60, 0x00, + 0xef, 0x5e, 0xf0, 0x9a, 0x60, 0x00, 0xf1, 0x3c, 0xe9, 0x50, 0xee, 0xd6, 0xea, 0x22, 0xee, 0xaa, + 0xe9, 0x90, 0xf0, 0x62, 0x55, 0x55, 0x00, 0x16, 0xef, 0x04, 0xef, 0x50, 0x00, 0x00, 0x00, 0x00, + 0xef, 0x74, 0xea, 0x4b, 0xef, 0xc8, 0xee, 0xd6, 0xea, 0x22, 0xf0, 0x16, 0x55, 0x55, 0x00, 0x16, + 0xee, 0xbe, 0xef, 0x04, 0xef, 0x5e, 0xee, 0xe8, 0x00, 0xff, 0x08, 0x00, 0xee, 0xe8, 0x00, 0xff, + 0x0c, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x10, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x14, 0x00, 0xee, 0xe8, + 0x00, 0xff, 0x18, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x1c, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x20, 0x00, + 0xee, 0xe8, 0x00, 0xff, 0x24, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x28, 0x00, 0xee, 0xe8, 0x00, 0xff, + 0x2c, 0x00, 0xef, 0x90, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x30, 0x40, 0x00, 0x06, 0x01, 0x00, + 0xef, 0x5e, 0xf0, 0x9a, 0x20, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x70, 0x40, 0x00, 0x06, + 0x43, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x60, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0xb0, 0x40, + 0x00, 0x06, 0x85, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0xa0, 0x00, 0xf0, 0x96, 0x01, 0x00, 0x01, 0x03, + 0x01, 0x01, 0x00, 0x00, 0x81, 0x00, 0x00, 0x1a, 0x10, 0x40, 0x00, 0x00, 0xa9, 0x98, 0x00, 0x0d, + 0x55, 0x55, 0x00, 0x00, 0xa9, 0xa4, 0x00, 0xaa, 0x82, 0x72, 0xa9, 0x4a, 0x5a, 0xa5, 0xe7, 0xda, + 0x09, 0x03, 0x9d, 0x11, 0x00, 0x00, 0x81, 0x00, 0x00, 0x04, 0x90, 0xd8, 0x10, 0x00, 0x00, 0x00, + 0x81, 0x00, 0x00, 0x04, 0x90, 0xd8, 0xb4, 0xd8, 0x00, 0x00, 0x81, 0x00, 0x00, 0x08, 0x90, 0xd8, + 0x16, 0x46, 0x40, 0x00, 0xb4, 0xd8, 0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x00, 0x13, 0x10, 0x40, + 0x00, 0x16, 0x00, 0x00, 0x80, 0x00, 0x00, 0x10, 0x00, 0x15, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f, + 0x00, 0x15, 0x00, 0x00, 0x81, 0x00, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x00, 0x80, 0x00, 0x00, 0x12, + 0x80, 0x0a, 0x9e, 0x40, 0xc8, 0x00, 0x00, 0x00, 0x80, 0x5e, 0x00, 0x0f, 0x80, 0x06, 0xfe, 0x40, + 0xcc, 0x00, 0x00, 0x00, 0x80, 0x04, 0x8e, 0x40, 0xc9, 0x00, 0x80, 0x04, 0x06, 0x00, 0xcc, 0x00, + 0x80, 0x04, 0x0a, 0x40, 0xc8, 0x00, 0x80, 0x0a, 0x8a, 0x40, 0xc8, 0x00, 0x00, 0x00, 0x80, 0x5e, + 0x00, 0x0f, 0x08, 0x0a, 0x1c, 0x80, 0x00, 0x0a, 0x1a, 0x1c, 0x80, 0x00, 0x0c, 0x1c, 0x80, 0x00, + 0x1a, 0x1c, 0x80, 0x00, 0x0e, 0x1a, 0x1c, 0x80, 0x00, 0x04, 0x80, 0x00, 0x02, 0x80, 0x00, 0x02, + 0x80, 0x00, 0x00, 0x00, 0xaa, 0x4e, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x7a, 0x00, 0x4e, + 0x07, 0x58, 0xc5, 0x6a, 0xe0, 0x16, 0x08, 0xe2, 0x08, 0xec, 0x08, 0xf6, 0xe0, 0x16, 0x09, 0x00, + 0x09, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x08, 0xe2, 0x00, 0x00, 0x08, 0xec, 0x08, 0xf6, 0x09, 0x00, + 0x00, 0x00, 0x07, 0xb8, 0xd8, 0xee, 0x02, 0x80, 0x07, 0xb8, 0xd9, 0x0c, 0xff, 0x84, 0x07, 0xb8, + 0xd9, 0x2e, 0x07, 0xb8, 0xd9, 0xa8, 0xda, 0x88, 0xda, 0x7c, 0xda, 0xa2, 0xda, 0xa6, 0xda, 0x9e, + 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x86, 0xda, 0xa8, 0xda, 0xb2, 0xdb, 0x2e, 0xdb, 0x78, 0x00, 0x00, + 0xaa, 0xc8, 0x00, 0x09, 0xdb, 0x86, 0x00, 0x00, 0xaa, 0xd0, 0x02, 0xb0, 0x00, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x08, 0x08, 0x05, 0x08, 0x08, 0x08, 0x00, 0x00, 0x02, + 0x04, 0x04, 0x04, 0x04, 0x00, 0x08, 0x0a, 0x00, 0x00, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x41, 0x04, 0x0b, 0x06, 0xc2, 0x08, 0xe6, 0x00, 0xe7, 0x00, 0x06, 0x04, 0x07, 0x04, 0x03, 0x04, + 0x04, 0x06, 0x05, 0x04, 0x88, 0x04, 0x00, 0x03, 0x00, 0x1c, 0x0c, 0x00, 0x80, 0x00, 0xe3, 0xfc, + 0xe4, 0x04, 0xe4, 0x48, 0xe4, 0x08, 0xe4, 0x14, 0xe4, 0x1a, 0xe4, 0x3e, 0xe4, 0x0e, 0xe4, 0x5c, + 0x06, 0x00, 0x00, 0x00, 0x07, 0x06, 0x0e, 0x14, 0x14, 0x1e, 0x2a, 0x4c, 0x38, 0x7c, 0x3e, 0x78, + 0x43, 0x92, 0x58, 0x9c, 0x4d, 0xb2, 0x2f, 0x64, 0x1d, 0x34, 0x6c, 0xd0, 0x23, 0x3e, 0x1d, 0x2a, + 0x65, 0xc0, 0x72, 0xe0, 0x78, 0xee, 0x7f, 0xfc, 0x01, 0x32, 0x57, 0x01, 0x11, 0x32, 0x51, 0x81, + 0x56, 0x02, 0x55, 0x03, 0x11, 0x54, 0x81, 0x56, 0x02, 0x55, 0x02, 0x54, 0x81, 0x56, 0x76, 0x01, + 0x34, 0x02, 0x55, 0x02, 0x54, 0x81, 0x58, 0x02, 0x55, 0x02, 0x54, 0x81, 0x58, 0x02, 0x12, 0x11, + 0x52, 0x02, 0x83, 0x58, 0x05, 0x52, 0x04, 0x81, 0x58, 0x05, 0x52, 0x03, 0x15, 0x5c, 0x5b, 0x53, + 0x87, 0x52, 0x03, 0x11, 0x51, 0x41, 0x51, 0x78, 0x11, 0x34, 0x11, 0x81, 0x31, 0x20, 0x57, 0x54, + 0x53, 0x01, 0x12, 0x5a, 0x51, 0x81, 0x31, 0x20, 0x57, 0x5b, 0x5a, 0x01, 0x11, 0x01, 0x11, 0x51, + 0x81, 0x31, 0x20, 0x57, 0x01, 0x15, 0x01, 0x13, 0x01, 0x11, 0x11, 0x11, 0x51, 0x81, 0x58, 0x05, + 0x52, 0x02, 0x54, 0x5b, 0x81, 0x5d, 0x05, 0x52, 0x02, 0x54, 0x81, 0x58, 0x02, 0x50, 0x03, 0x13, + 0x81, 0x58, 0x02, 0x50, 0x03, 0x11, 0x54, 0x81, 0x5d, 0x72, 0x03, 0x50, 0x03, 0x13, 0x01, 0x13, + 0x54, 0x40, 0x00, 0x0e, 0x06, 0x20, 0x06, 0x56, 0xe5, 0x2a, 0x00, 0x24, 0x10, 0x02, 0x00, 0x16, + 0x00, 0x02, 0x04, 0x01, 0x07, 0x08, 0xe5, 0x2a, 0x00, 0x20, 0x10, 0x03, 0x00, 0x12, 0x00, 0x03, + 0xe4, 0x78, 0x8e, 0x14, 0x00, 0x20, 0x10, 0x04, 0x00, 0x12, 0x00, 0x04, 0xdb, 0xc0, 0x00, 0x20, + 0xe0, 0x05, 0x00, 0x12, 0x00, 0x05, 0xdb, 0xc0, 0x00, 0x20, 0xe0, 0x06, 0x00, 0x12, 0x00, 0x06, + 0xe7, 0x22, 0x00, 0x12, 0xe0, 0x01, 0x09, 0x6c, 0x06, 0xcc, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, + 0x06, 0x30, 0xe6, 0x42, 0x05, 0xf0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xe2, + 0x00, 0x08, 0xff, 0x26, 0x05, 0xdc, 0xe7, 0xae, 0x00, 0x3e, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x30, 0x50, 0x20, 0x0c, 0x23, 0x05, 0xfc, 0x06, 0x52, 0x06, 0x56, 0x00, 0x00, + 0x81, 0x00, 0x00, 0x16, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x40, 0x2a, + 0x04, 0x2a, 0x06, 0x56, 0x00, 0x26, 0xec, 0x71, 0x06, 0x2b, 0x09, 0x72, 0x00, 0x22, 0x00, 0x24, + 0xec, 0x87, 0x0c, 0x23, 0x05, 0xfc, 0x08, 0x28, 0x09, 0x34, 0x08, 0x29, 0x07, 0x58, 0x07, 0x78, + 0x07, 0x98, 0x00, 0x23, 0x00, 0x2a, 0xec, 0x95, 0x04, 0x06, 0x06, 0xf0, 0x04, 0x07, 0x06, 0xee, + 0x00, 0x24, 0xdb, 0xc0, 0x00, 0x34, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x26, + 0x40, 0x25, 0xdb, 0xc0, 0x00, 0x20, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x12, + 0x40, 0x26, 0xdb, 0xc0, 0x00, 0x1a, 0xe0, 0x00, 0x00, 0x0c, 0x60, 0x27, 0x08, 0x0a, 0x06, 0xe6, + 0xdb, 0xc0, 0x00, 0x24, 0xe0, 0x00, 0x00, 0x16, 0x60, 0x28, 0x04, 0x30, 0x07, 0x06, 0xdc, 0x16, + 0x81, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00, 0x22, 0x60, 0x29, 0x08, 0x2d, 0x07, 0x1c, 0x08, 0x2e, + 0x07, 0x22, 0x00, 0x00, 0x02, 0x08, 0x01, 0x06, 0x06, 0x14, 0x08, 0x18, 0x0c, 0x20, 0x0e, 0x26, + 0x0f, 0x30, 0x11, 0x34, 0x12, 0x3e, 0x14, 0x42, 0x16, 0x46, 0x0a, 0x1c, 0x18, 0x4a, 0x03, 0x13, + 0x83, 0x11, 0x11, 0x01, 0x81, 0x11, 0x81, 0x12, 0x01, 0x13, 0x83, 0x52, 0x85, 0x81, 0x11, 0x85, + 0x81, 0x12, 0x81, 0x12, 0x81, 0x19, 0x85, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x6c, + 0x00, 0x00, 0x06, 0x30, 0xec, 0xfc, 0x06, 0x54, 0x06, 0x50, 0x02, 0x38, 0x04, 0x21, 0x09, 0x1e, + 0x06, 0x0b, 0x06, 0xd8, 0x08, 0x02, 0x06, 0xdc, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x41, + 0x00, 0x41, 0xae, 0x14, 0x00, 0x00, 0x81, 0x00, 0x04, 0x09, 0x07, 0x0c, 0x00, 0x41, 0x00, 0x41, + 0x02, 0x14, 0x00, 0x00, 0x81, 0x00, 0x06, 0x0b, 0x06, 0xd8, 0x06, 0x2c, 0x09, 0x76, 0x14, 0x22, + 0x09, 0x3a, 0x00, 0x41, 0x00, 0x41, 0x02, 0x54, 0x00, 0x00, 0x81, 0x00, 0x06, 0xd8, 0x84, 0x00, + 0x48, 0x00, 0xff, 0xfc, 0x00, 0x09, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xad, 0x80, + 0x02, 0x81, 0x00, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x06, 0x44, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63, + 0x6f, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x64, 0x20, + 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x4f, 0x6e, + 0x6c, 0x79, 0x2c, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x01, 0x60, 0x01, 0x42, 0x08, 0x00, 0x16, 0x08, + 0x03, 0xb0, 0x04, 0xe0, 0x00, 0x00, 0x01, 0x20, 0x00, 0x00, 0xff, 0xff, 0x13, 0xfc, 0x03, 0x80, + 0x07, 0xa0, 0x01, 0x42, 0x08, 0x00, 0x07, 0x20, 0x00, 0x00, 0x04, 0xe0, 0x01, 0x00, 0x07, 0x8b, + 0x3d, 0x00, 0x01, 0x60, 0x01, 0x42, 0x00, 0x80, 0x13, 0x09, 0x07, 0x8b, 0x2d, 0x00, 0xc0, 0x20, + 0x01, 0x4e, 0x02, 0x80, 0x0f, 0x41, 0x11, 0x02, 0x07, 0x8b, 0x3d, 0x00, 0xc8, 0x0b, 0x01, 0x4a, + 0x02, 0x00, 0xa0, 0x00, 0x09, 0xa0, 0xc8, 0x00, 0x01, 0x66, 0x02, 0xe0, 0x00, 0xa0, 0x07, 0xa0, + 0x01, 0x04, 0x00, 0x20, 0x01, 0xa0, 0x01, 0x40, 0xfe, 0x00, 0x48, 0x20, 0xe0, 0x2a, 0x01, 0x42, + 0x04, 0xe0, 0x01, 0x02, 0x04, 0xe0, 0x09, 0x60, 0x04, 0xe0, 0x01, 0x82, 0x01, 0x60, 0x01, 0x1c, + 0x00, 0x04, 0x16, 0x03, 0x01, 0xe0, 0x01, 0x40, 0x0c, 0x00, 0x06, 0xa0, 0xb1, 0xbc, 0x07, 0xa0, + 0x01, 0x04, 0x00, 0x2d, 0xc2, 0x20, 0xe0, 0x00, 0x02, 0x88, 0xe2, 0x28, 0x16, 0x14, 0x07, 0xa0, + 0x01, 0x04, 0x00, 0x2e, 0x01, 0x60, 0x01, 0x42, 0x03, 0x00, 0x16, 0x0d, 0x07, 0xa0, 0x01, 0x04, + 0x00, 0x21, 0x07, 0x88, 0xb0, 0x00, 0x07, 0x89, 0xff, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a, + 0xe0, 0x02, 0x06, 0xa0, 0xf4, 0x42, 0x10, 0x56, 0x07, 0x88, 0xa0, 0x00, 0x07, 0x89, 0xaf, 0xfe, + 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a, 0xe0, 0x78, 0x06, 0xa0, 0xf4, 0x42, 0x10, 0x4b, 0x05, 0xa0, + 0x01, 0x04, 0x07, 0x88, 0x00, 0x08, 0x07, 0x89, 0x00, 0x7a, 0x03, 0x00, 0x00, 0x01, 0x06, 0xa0, + 0xf4, 0x7c, 0x10, 0x40, 0x06, 0xa0, 0xb1, 0xbc, 0x02, 0xe0, 0x03, 0xf4, 0x07, 0x88, 0x00, 0xa0, + 0x07, 0x89, 0x00, 0xfe, 0x06, 0xa0, 0xf4, 0x7c, 0x10, 0x35, 0x02, 0xe0, 0x00, 0xa0, 0x04, 0xe0, + 0x01, 0x7e, 0x04, 0xc8, 0x02, 0x09, 0x03, 0xf2, 0x62, 0x48, 0xc1, 0xe0, 0x01, 0x40, 0x01, 0xa0, + 0x01, 0x40, 0x04, 0x00, 0xce, 0x18, 0x06, 0x09, 0x16, 0xfd, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, + 0xc8, 0x07, 0x01, 0x40, 0x07, 0x88, 0x03, 0xf4, 0x07, 0x89, 0x3f, 0xfe, 0x06, 0xa0, 0xf4, 0x7c, + 0x10, 0x19, 0x02, 0xe0, 0x00, 0xa0, 0x06, 0xa0, 0xf5, 0xa4, 0x10, 0x14, 0xc8, 0x08, 0x04, 0x44, + 0xc8, 0x09, 0x04, 0x46, 0x06, 0xa0, 0xf4, 0xd2, 0x10, 0x0d, 0x07, 0x81, 0xe0, 0x7c, 0xc0, 0xb1, + 0x13, 0x26, 0xc8, 0x01, 0x00, 0xe0, 0x05, 0xa0, 0x01, 0x04, 0x06, 0x92, 0x10, 0x03, 0xc0, 0x60, + 0x00, 0xe0, 0x10, 0xf5, 0x01, 0xe0, 0x01, 0x04, 0x00, 0x10, 0x03, 0xb0, 0x10, 0xff, 0x01, 0xa0, + 0x01, 0x04, 0x80, 0x00, 0x03, 0x80, 0x07, 0x80, 0x00, 0xa0, 0x04, 0xc2, 0xcc, 0x80, 0x07, 0x81, + 0xb1, 0xaa, 0x02, 0x82, 0x00, 0x1e, 0x16, 0x02, 0x07, 0x81, 0xb1, 0xb4, 0xc4, 0x81, 0x8c, 0x81, + 0x16, 0xe9, 0x02, 0x82, 0x00, 0x7c, 0x16, 0xf2, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x5b, 0x07, 0x81, + 0xe1, 0x08, 0x07, 0x82, 0x00, 0x04, 0x04, 0xe0, 0x01, 0x80, 0x04, 0xe0, 0x01, 0x82, 0xc4, 0x91, + 0x8c, 0xb1, 0x16, 0xd8, 0x02, 0x82, 0x00, 0x7c, 0x16, 0xfa, 0xc8, 0x20, 0xe0, 0x04, 0x01, 0x82, + 0xe8, 0x20, 0xe0, 0x0c, 0x01, 0x82, 0xc8, 0x20, 0xe0, 0x10, 0x01, 0x80, 0x07, 0x81, 0xe0, 0x86, + 0xc0, 0xb1, 0x13, 0x07, 0xc4, 0xb1, 0x10, 0xfc, 0x07, 0xa0, 0x01, 0x04, 0x00, 0x2e, 0x04, 0x60, + 0xb1, 0xaa, 0x07, 0x81, 0xe0, 0x34, 0x07, 0x82, 0x05, 0xfc, 0x07, 0x83, 0x00, 0x0a, 0xcc, 0xb1, + 0x06, 0x43, 0x16, 0xfd, 0x02, 0x02, 0x06, 0x00, 0xd0, 0x60, 0x01, 0x4e, 0x13, 0xed, 0x02, 0x21, + 0xf7, 0x00, 0x02, 0x21, 0xc0, 0x00, 0xdc, 0x81, 0xd0, 0x60, 0x01, 0x4f, 0xc0, 0xc1, 0x09, 0x41, + 0x02, 0x21, 0xf0, 0x00, 0xdc, 0x81, 0x02, 0x43, 0x0f, 0x00, 0x02, 0x23, 0xf0, 0x00, 0xdc, 0x83, + 0x02, 0x01, 0x0c, 0x32, 0xc0, 0xa0, 0x04, 0x44, 0xc0, 0xe0, 0x04, 0x46, 0xc1, 0x03, 0x61, 0x02, + 0x05, 0x84, 0xc8, 0x04, 0x04, 0x48, 0xc1, 0x03, 0x05, 0x84, 0xa1, 0x04, 0xa1, 0x01, 0xc8, 0x04, + 0x0c, 0x30, 0xc1, 0x03, 0x05, 0x84, 0x04, 0xf1, 0x06, 0x04, 0x16, 0xfd, 0x02, 0x08, 0xb0, 0x00, + 0x09, 0xa8, 0xc2, 0x60, 0x0c, 0x30, 0x02, 0x29, 0x03, 0xff, 0x09, 0xa9, 0x02, 0x29, 0x00, 0x40, + 0x07, 0x80, 0xa0, 0x00, 0x09, 0xa0, 0x07, 0x8a, 0xaf, 0xfe, 0x02, 0x2a, 0x03, 0xff, 0x09, 0xaa, + 0x02, 0x01, 0x0c, 0x32, 0x02, 0x05, 0x00, 0x00, 0xc1, 0x03, 0x05, 0x84, 0x07, 0x11, 0x05, 0xc1, + 0x05, 0x85, 0x06, 0x04, 0x13, 0x0b, 0x80, 0x85, 0x1a, 0xf9, 0x80, 0x05, 0x1a, 0xf8, 0x82, 0x85, + 0x1a, 0xf5, 0x82, 0x05, 0x1a, 0xf4, 0x82, 0x45, 0x1a, 0xf1, 0x10, 0xf1, 0x2d, 0x20, 0x00, 0x02, + 0x01, 0x60, 0x01, 0x40, 0x40, 0x00, 0x16, 0x06, 0x07, 0x8a, 0x08, 0x00, 0x01, 0xa0, 0x01, 0x40, + 0x40, 0x00, 0x10, 0x48, 0x01, 0x60, 0x01, 0x42, 0x80, 0x00, 0x16, 0x06, 0x07, 0x8a, 0x10, 0x00, + 0x01, 0xa0, 0x01, 0x42, 0x80, 0x00, 0x10, 0x3e, 0x01, 0x60, 0x01, 0x02, 0x10, 0x00, 0x16, 0x0a, + 0x01, 0x60, 0x01, 0x00, 0x04, 0x00, 0x16, 0x06, 0x07, 0x8a, 0x80, 0x00, 0x01, 0xa0, 0x01, 0x02, + 0x10, 0x00, 0x10, 0x30, 0x01, 0x60, 0x01, 0x02, 0x08, 0x00, 0x16, 0x0a, 0x01, 0x60, 0x01, 0x00, + 0x04, 0x00, 0x16, 0x06, 0x01, 0xa0, 0x01, 0x02, 0x08, 0x00, 0x02, 0x0d, 0x00, 0x01, 0x10, 0x0d, + 0x01, 0x60, 0x01, 0x02, 0x04, 0x00, 0x16, 0x16, 0x01, 0x60, 0x01, 0x00, 0x08, 0x00, 0x16, 0x12, + 0x01, 0xa0, 0x01, 0x02, 0x04, 0x00, 0x02, 0x0d, 0x00, 0x02, 0xc3, 0xa0, 0x01, 0x0e, 0xc3, 0xe0, + 0x01, 0x10, 0x07, 0x8a, 0x20, 0x00, 0x01, 0x60, 0x01, 0x00, 0x80, 0x00, 0x13, 0x0b, 0x07, 0x8a, + 0x40, 0x00, 0x10, 0x08, 0x07, 0x8a, 0x00, 0x04, 0x10, 0x05, 0x07, 0x8a, 0x00, 0x02, 0x10, 0x02, + 0x07, 0x8a, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x04, 0xe0, 0x01, 0x82, 0x07, 0x8b, 0x05, 0xe0, + 0xce, 0xca, 0xce, 0xcd, 0xce, 0xce, 0xc6, 0xcf, 0xc3, 0x20, 0x07, 0x58, 0x23, 0x20, 0xe0, 0x04, + 0x13, 0x12, 0x07, 0x8b, 0xff, 0x18, 0x02, 0x8a, 0x80, 0x00, 0x13, 0x0a, 0x05, 0x8b, 0xa2, 0xcd, + 0x02, 0x8a, 0x40, 0x00, 0x13, 0x05, 0x02, 0x8a, 0x20, 0x00, 0x13, 0x02, 0x07, 0x8b, 0xff, 0x1d, + 0xc8, 0x0b, 0x01, 0x04, 0x10, 0x0d, 0xd3, 0x20, 0x01, 0x05, 0x11, 0xfd, 0xd8, 0x20, 0x07, 0xdf, + 0x01, 0x17, 0x07, 0x8b, 0xff, 0x80, 0xc8, 0x0b, 0x01, 0x04, 0xe8, 0x20, 0xe0, 0x0a, 0x01, 0x00, + 0xc2, 0xe0, 0x01, 0x04, 0x22, 0xe0, 0xe1, 0x86, 0x16, 0xfb, 0x02, 0xe0, 0x00, 0xa0, 0x04, 0xe0, + 0x01, 0x82, 0xe8, 0x20, 0xe0, 0x0a, 0x01, 0x00, 0xc2, 0xe0, 0x01, 0x00, 0x22, 0xe0, 0xe0, 0x06, + 0x13, 0xf8, 0x01, 0xa0, 0x01, 0x40, 0xf6, 0x00, 0x04, 0x60, 0xb0, 0x90, 0x03, 0x00, 0x00, 0x02, + 0x07, 0xa0, 0x01, 0x02, 0xdf, 0xff, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, + 0x07, 0x09, 0xc2, 0xa0, 0x01, 0x04, 0x01, 0x8a, 0x00, 0x80, 0x52, 0x4a, 0xd2, 0x89, 0xc8, 0x0a, + 0x01, 0x04, 0xd2, 0xa0, 0x01, 0x04, 0x16, 0xf9, 0x05, 0x49, 0x01, 0x89, 0x80, 0x00, 0x01, 0x49, + 0x40, 0x00, 0x13, 0x0e, 0xf8, 0x09, 0x07, 0x3a, 0xc2, 0x60, 0x07, 0x36, 0x16, 0x03, 0x03, 0x90, + 0xff, 0xff, 0x03, 0x80, 0x04, 0xe0, 0x07, 0x36, 0x04, 0x54, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, + 0x22, 0x60, 0xe1, 0x86, 0x13, 0xc2, 0x04, 0xe0, 0x01, 0x82, 0x04, 0x60, 0xb3, 0xe0, 0x03, 0x00, + 0x00, 0x02, 0x07, 0xa0, 0x09, 0x62, 0x03, 0xe8, 0x04, 0xc9, 0xc1, 0xa0, 0x06, 0x34, 0x16, 0x04, + 0x06, 0xa0, 0xc2, 0xae, 0x04, 0xe0, 0x09, 0x20, 0x07, 0x86, 0x05, 0xe8, 0x01, 0xa0, 0x01, 0x40, + 0x80, 0x00, 0xc2, 0x20, 0x01, 0x84, 0x48, 0x20, 0xe0, 0x08, 0x01, 0x84, 0x22, 0x20, 0xe0, 0x08, + 0x13, 0x08, 0x01, 0x60, 0x01, 0xae, 0x00, 0x01, 0x16, 0x04, 0x01, 0xe0, 0x06, 0x34, 0x80, 0x00, + 0x10, 0x06, 0xc2, 0x20, 0x09, 0x32, 0x13, 0x06, 0x01, 0xe0, 0x06, 0x34, 0x08, 0x00, 0x04, 0xe0, + 0x06, 0x30, 0x07, 0x09, 0x05, 0xa0, 0x05, 0xee, 0x06, 0x20, 0x05, 0xec, 0x16, 0x02, 0xc2, 0x16, + 0x16, 0x03, 0xc2, 0x49, 0x16, 0x12, 0x03, 0x80, 0xc5, 0x98, 0xc1, 0xe8, 0x00, 0x02, 0xe9, 0xe0, + 0xe0, 0x14, 0x00, 0x04, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x08, 0x06, 0xa0, 0xc2, 0x44, 0xc2, 0x16, + 0x13, 0x04, 0xc8, 0x28, 0x00, 0x08, 0x05, 0xec, 0x13, 0xef, 0x04, 0x54, 0x03, 0x00, 0x00, 0x02, + 0xc1, 0xe0, 0x01, 0x86, 0x02, 0x47, 0x00, 0x0e, 0xc2, 0xa7, 0xe1, 0x90, 0x04, 0x5a, 0x07, 0x8a, + 0xa0, 0x00, 0xc8, 0x0a, 0x01, 0x86, 0xa1, 0xc7, 0x02, 0x27, 0xe1, 0x98, 0xe8, 0x37, 0x06, 0x34, + 0xe8, 0x17, 0x06, 0xd2, 0x04, 0xe0, 0x06, 0x30, 0x04, 0x60, 0xb9, 0xc0, 0xe8, 0x0a, 0x06, 0xd2, + 0x01, 0xe0, 0x06, 0x34, 0x08, 0x00, 0x04, 0xe0, 0x06, 0x30, 0xe0, 0x20, 0xe0, 0x18, 0x04, 0x5b, + 0x05, 0xa0, 0x09, 0x20, 0x88, 0x20, 0x09, 0x20, 0xe0, 0x16, 0x1a, 0xe5, 0x04, 0xe0, 0x09, 0x20, + 0x06, 0xa0, 0xe1, 0x18, 0x03, 0x80, 0x05, 0xa0, 0x09, 0x32, 0x03, 0x80, 0xc3, 0x01, 0x13, 0xfb, + 0x01, 0x60, 0x09, 0x6a, 0x00, 0x01, 0x13, 0x78, 0x05, 0xa0, 0x09, 0x32, 0x10, 0x75, 0xc0, 0x41, + 0x13, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02, 0x11, 0x01, 0x10, 0x7b, 0x01, 0x60, + 0x01, 0x9c, 0x00, 0x40, 0x16, 0x79, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83, 0xc0, 0x41, 0x13, 0x04, + 0xc8, 0x01, 0x01, 0x8a, 0xc8, 0x01, 0x09, 0x18, 0x07, 0x86, 0x00, 0x43, 0xc8, 0x06, 0x01, 0x6c, + 0x02, 0x07, 0xfc, 0x02, 0xc2, 0x17, 0x04, 0x60, 0xb6, 0xfa, 0x04, 0xe0, 0x09, 0x18, 0x61, 0xc7, + 0x07, 0x08, 0x01, 0x60, 0xfc, 0x06, 0x00, 0x40, 0x13, 0x02, 0x02, 0x08, 0x00, 0x01, 0x10, 0x09, + 0xc2, 0x4c, 0xc3, 0x20, 0xfc, 0x00, 0x13, 0x2a, 0xc8, 0x0c, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02, + 0x11, 0x1b, 0x01, 0x4b, 0x01, 0x00, 0x16, 0xf4, 0x22, 0xc8, 0x13, 0x12, 0x01, 0xcb, 0x40, 0x00, + 0xc8, 0x0b, 0xfc, 0x02, 0x10, 0x0d, 0xc1, 0xe0, 0x09, 0x18, 0xc3, 0x01, 0x13, 0x21, 0xc2, 0x4c, + 0x13, 0x15, 0xc8, 0x0c, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02, 0x11, 0x06, 0x81, 0xcc, 0x13, 0xd5, + 0xc2, 0x4c, 0xc3, 0x20, 0xfc, 0x00, 0x10, 0xf4, 0xc8, 0x09, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02, + 0x16, 0x1e, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0xc3, 0x09, 0x10, 0x19, 0xc8, 0x09, 0x01, 0x6c, + 0xc2, 0xe0, 0xfc, 0x02, 0x16, 0x05, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0xc3, 0x09, 0x10, 0x0f, + 0xc2, 0xe0, 0x0c, 0x02, 0x11, 0x01, 0x10, 0x1e, 0xd8, 0x20, 0xe2, 0x00, 0x01, 0x83, 0x00, 0x00, + 0xb6, 0x44, 0x00, 0x09, 0x09, 0x8b, 0x00, 0x00, 0xb6, 0x4c, 0x0b, 0x36, 0x07, 0xa0, 0x01, 0x8a, + 0x00, 0x43, 0x10, 0x13, 0xc8, 0x0c, 0x01, 0x8a, 0xc8, 0x0c, 0x09, 0x18, 0x10, 0x0e, 0x03, 0x00, + 0x00, 0x02, 0xc0, 0xe0, 0x01, 0x6c, 0xc3, 0x20, 0x01, 0x8a, 0x98, 0x20, 0x01, 0x83, 0xe2, 0x00, + 0x13, 0x81, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x13, 0xb9, 0x83, 0x01, 0x16, 0x31, 0xc8, 0x03, + 0x01, 0x6c, 0x01, 0x40, 0x00, 0x10, 0x16, 0x14, 0xc2, 0xe0, 0x06, 0x2e, 0x13, 0x11, 0xc2, 0xe0, + 0x05, 0xf8, 0x13, 0x0e, 0x01, 0xe0, 0x07, 0x3a, 0x80, 0x00, 0x01, 0x80, 0x00, 0x10, 0xc2, 0xe0, + 0x07, 0x36, 0x13, 0x06, 0x04, 0xe0, 0x07, 0x36, 0x01, 0x80, 0x00, 0x20, 0x04, 0x60, 0xb9, 0xc0, + 0x01, 0x40, 0x00, 0x20, 0x13, 0xf9, 0x03, 0x90, 0x11, 0xff, 0x03, 0x80, 0x01, 0x08, 0x04, 0x00, + 0x16, 0x19, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x01, 0x16, 0x15, 0x01, 0x88, 0x1a, 0x00, 0x01, 0xc8, + 0x01, 0x00, 0xc5, 0xc8, 0x10, 0x0f, 0x04, 0xe0, 0x09, 0x18, 0x01, 0xc0, 0x00, 0x04, 0x10, 0x15, + 0xc1, 0x81, 0xc8, 0x01, 0x01, 0x6c, 0x02, 0x07, 0xfc, 0x00, 0xc0, 0x77, 0xc2, 0x17, 0x01, 0x48, + 0x18, 0x00, 0x13, 0xe4, 0x01, 0x40, 0x00, 0x40, 0x16, 0x15, 0x01, 0x80, 0x00, 0x45, 0xc1, 0x46, + 0xd0, 0x20, 0xfc, 0x07, 0x81, 0x60, 0x09, 0x18, 0x13, 0xe6, 0xc2, 0xe0, 0xfc, 0x08, 0x11, 0x08, + 0xc2, 0xe0, 0xfc, 0x0e, 0x15, 0x07, 0x13, 0x06, 0xc2, 0xe0, 0xfc, 0x14, 0x15, 0x03, 0x13, 0x02, + 0x01, 0xc0, 0x00, 0x01, 0x01, 0x48, 0x01, 0x00, 0x13, 0x11, 0x01, 0x40, 0x40, 0x80, 0x13, 0x5b, + 0x04, 0x60, 0xb6, 0x66, 0x01, 0x48, 0x00, 0x01, 0x16, 0x03, 0x01, 0x40, 0x40, 0x00, 0x16, 0x0b, + 0x01, 0xc8, 0x40, 0x00, 0x05, 0xa0, 0x09, 0x32, 0xc5, 0xc8, 0x10, 0x05, 0x01, 0xc0, 0x00, 0x40, + 0x01, 0x40, 0x00, 0x04, 0x13, 0xef, 0x05, 0xc7, 0xc2, 0xd7, 0x62, 0xc4, 0x05, 0x0b, 0x02, 0x2b, + 0xff, 0xfc, 0xc5, 0xcb, 0x15, 0x02, 0x81, 0x46, 0x13, 0x5d, 0x01, 0x08, 0x5e, 0x00, 0x16, 0x5a, + 0x01, 0x08, 0x00, 0x88, 0x16, 0x13, 0x02, 0x86, 0x00, 0x43, 0x16, 0x1e, 0x01, 0x40, 0x40, 0x00, + 0x13, 0x0b, 0x01, 0x08, 0x00, 0x03, 0x13, 0x08, 0xc2, 0x84, 0x02, 0x2a, 0xff, 0xd8, 0xc8, 0x06, + 0x01, 0x6c, 0x68, 0x0a, 0xfc, 0x04, 0x10, 0x66, 0x04, 0x60, 0xb8, 0xa8, 0x01, 0x40, 0x00, 0x01, + 0x13, 0xea, 0x01, 0x08, 0x00, 0x02, 0x16, 0xe7, 0x01, 0x48, 0x00, 0x01, 0x16, 0xe4, 0x07, 0x8a, + 0x00, 0x80, 0x06, 0xa0, 0xb5, 0x32, 0x10, 0xdf, 0xc0, 0x00, 0x11, 0xee, 0xc2, 0x60, 0x09, 0x6a, + 0x01, 0x40, 0x40, 0x00, 0x13, 0x0a, 0x01, 0x48, 0x00, 0x01, 0x13, 0x2e, 0x01, 0x48, 0x00, 0x02, + 0x13, 0x04, 0x01, 0x49, 0x00, 0x04, 0x16, 0xe0, 0x10, 0x00, 0x01, 0x49, 0x00, 0x01, 0x13, 0x12, + 0x01, 0x40, 0x40, 0x80, 0x16, 0x01, 0xc1, 0x46, 0x04, 0xe0, 0xfc, 0x00, 0x07, 0x87, 0x05, 0xf8, + 0xc2, 0x17, 0x13, 0x14, 0x05, 0xc7, 0xc8, 0x17, 0x01, 0x6c, 0xc8, 0x05, 0xfc, 0x00, 0xc5, 0xc6, + 0x04, 0x60, 0xb6, 0x66, 0x02, 0x07, 0xfc, 0x02, 0xa1, 0xe0, 0x09, 0x2c, 0xcd, 0xe0, 0x05, 0xee, + 0xc5, 0xe0, 0xfc, 0x04, 0xc8, 0x20, 0x09, 0x2c, 0xfc, 0x04, 0x10, 0xe2, 0xcd, 0xc5, 0xc5, 0xc6, + 0x04, 0x60, 0xb6, 0x66, 0x04, 0x60, 0xb8, 0x8c, 0xc8, 0x06, 0x01, 0x6c, 0x81, 0x85, 0x13, 0x1a, + 0xc2, 0xe0, 0xfc, 0x04, 0x15, 0x17, 0xc2, 0x86, 0xa2, 0x8a, 0xc1, 0xaa, 0x0c, 0x32, 0xc8, 0x06, + 0x01, 0x6c, 0xa8, 0x0b, 0xfc, 0x04, 0x09, 0x1a, 0xc8, 0x0a, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02, + 0x04, 0xe0, 0xfc, 0x00, 0xc8, 0x06, 0x01, 0x6c, 0xc8, 0x0b, 0xfc, 0x02, 0x06, 0xa0, 0xc1, 0x9c, + 0xc8, 0x06, 0x01, 0x6c, 0x04, 0xe0, 0xfc, 0x00, 0x01, 0xa0, 0xfc, 0x02, 0x00, 0x02, 0x07, 0x87, + 0x06, 0x30, 0x01, 0xe7, 0x00, 0x04, 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x0c, 0xc2, 0x05, + 0x06, 0xa0, 0xc2, 0x5a, 0x01, 0xc0, 0x00, 0x20, 0x04, 0x60, 0xb6, 0x66, 0x01, 0x48, 0x18, 0x00, + 0x13, 0x03, 0x01, 0x48, 0x10, 0x00, 0x16, 0x02, 0x05, 0xa0, 0x09, 0x32, 0x02, 0x86, 0x00, 0x43, + 0x13, 0x03, 0x01, 0x40, 0x40, 0x80, 0x13, 0x9f, 0xc8, 0x06, 0x01, 0x6c, 0x04, 0xe0, 0xfc, 0x00, + 0xc2, 0x85, 0x06, 0xa0, 0xc1, 0x9c, 0x06, 0x20, 0x09, 0x62, 0x16, 0xe6, 0x06, 0xa0, 0xe1, 0x18, + 0x10, 0xe3, 0xc2, 0xa0, 0x05, 0xf6, 0x16, 0x52, 0xc8, 0x19, 0x05, 0xf0, 0xc2, 0xa9, 0x00, 0x0a, + 0x11, 0x0d, 0xf2, 0xa0, 0x09, 0x2e, 0xd8, 0x0a, 0x01, 0x80, 0xc8, 0x29, 0x00, 0x06, 0x01, 0x8c, + 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04, 0xc8, 0x09, 0x05, 0xf4, 0x10, 0x42, 0xc8, 0x29, 0x00, 0x06, + 0x01, 0x6c, 0xc8, 0x20, 0xfc, 0x0e, 0x01, 0xbc, 0xc8, 0x20, 0xfc, 0x10, 0x01, 0xb0, 0xc8, 0x20, + 0xfc, 0x12, 0x01, 0xb2, 0xf2, 0xa0, 0x09, 0x2e, 0x01, 0x8a, 0x10, 0x00, 0x01, 0xa0, 0x01, 0x80, + 0xc4, 0x00, 0x10, 0xe1, 0x01, 0x47, 0x00, 0x08, 0x16, 0x06, 0xc2, 0xa8, 0x00, 0x06, 0x06, 0xa0, + 0xc1, 0x9c, 0x04, 0xe8, 0x00, 0x06, 0x01, 0x07, 0x00, 0x20, 0x13, 0x2d, 0x04, 0xe8, 0x00, 0x02, + 0x10, 0x37, 0x04, 0xe0, 0xfc, 0x00, 0x06, 0xa0, 0xc1, 0x9c, 0x10, 0x25, 0x03, 0x00, 0x00, 0x02, + 0xc2, 0x20, 0x01, 0x8c, 0xc0, 0xe0, 0x01, 0x6c, 0xc2, 0x20, 0x05, 0xf4, 0xc8, 0x28, 0x00, 0x08, + 0x01, 0x6c, 0xc1, 0xe8, 0x00, 0x0a, 0xc3, 0x20, 0xfc, 0x02, 0x01, 0x0c, 0xfe, 0x00, 0x16, 0x3b, + 0x01, 0x47, 0x00, 0x40, 0x13, 0x50, 0xc2, 0x60, 0x05, 0xf0, 0x16, 0xab, 0x04, 0xe0, 0x05, 0xf4, + 0xca, 0x0c, 0x00, 0x08, 0x01, 0x47, 0x00, 0x80, 0x16, 0xcd, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x6c, + 0xc2, 0xa0, 0xfc, 0x00, 0x16, 0xd6, 0xc1, 0xe8, 0x00, 0x02, 0xc2, 0xd7, 0x16, 0x0f, 0x02, 0x27, + 0x00, 0x10, 0x04, 0xd8, 0xc2, 0x57, 0x13, 0x0e, 0x05, 0xc7, 0xc2, 0x57, 0xc6, 0x48, 0xc5, 0xc8, + 0xc8, 0x03, 0x01, 0x6c, 0x11, 0x0d, 0x03, 0x90, 0x11, 0xff, 0x03, 0x80, 0x04, 0xd7, 0x01, 0xc3, + 0x80, 0x00, 0x10, 0xed, 0x01, 0xe7, 0xff, 0xf4, 0x00, 0x20, 0xcd, 0xc8, 0xc5, 0xc8, 0x10, 0xf0, + 0x03, 0x90, 0x11, 0xf8, 0x02, 0xe0, 0x00, 0xc0, 0xc3, 0x60, 0x00, 0xfa, 0xc3, 0xa0, 0x00, 0xfc, + 0xc3, 0xe0, 0x00, 0xfe, 0x04, 0x54, 0xc2, 0xe8, 0x00, 0x08, 0xc2, 0xa8, 0x00, 0x06, 0xc3, 0x0c, + 0x11, 0x33, 0x23, 0x20, 0xe0, 0x0a, 0x13, 0x45, 0x23, 0x20, 0xe0, 0x10, 0x13, 0x46, 0x23, 0x20, + 0xe0, 0x0e, 0x13, 0x13, 0x21, 0xe0, 0xe0, 0x16, 0x16, 0xb6, 0x23, 0x20, 0xe0, 0x06, 0x16, 0x03, + 0x27, 0x20, 0xe4, 0x68, 0x13, 0x0a, 0xc2, 0xe8, 0x00, 0x08, 0xc2, 0xa8, 0x00, 0x06, 0x01, 0x4c, + 0x00, 0x88, 0x16, 0xa9, 0x01, 0x0c, 0x00, 0x44, 0x16, 0xa6, 0x06, 0x20, 0x09, 0x16, 0x13, 0xa3, + 0xc8, 0x0a, 0x01, 0x6c, 0xc8, 0x20, 0xe0, 0x04, 0xfc, 0x02, 0xc8, 0x0b, 0x01, 0x6c, 0x07, 0xa0, + 0xfc, 0x02, 0x81, 0x00, 0xc3, 0x20, 0x01, 0x80, 0x01, 0xa0, 0x01, 0x80, 0xc4, 0x00, 0xc8, 0x0c, + 0x01, 0x80, 0xc8, 0x0a, 0x01, 0x8c, 0x10, 0xac, 0xc2, 0x0a, 0x13, 0x0f, 0xc8, 0x08, 0x01, 0x6c, + 0xc2, 0xa0, 0xfc, 0x00, 0xc3, 0x20, 0xfc, 0x02, 0x23, 0x20, 0xe0, 0x12, 0x16, 0xf5, 0xc8, 0x0b, + 0x01, 0x6c, 0xc8, 0x0c, 0xfc, 0x02, 0x04, 0x60, 0xb9, 0x48, 0x07, 0x8a, 0x04, 0x00, 0x04, 0x60, + 0xb3, 0x8a, 0x07, 0x8a, 0x00, 0x20, 0x04, 0x60, 0xb3, 0x8a, 0x07, 0x8a, 0x02, 0x00, 0x27, 0x20, + 0xe0, 0x0e, 0x16, 0x02, 0x06, 0xa0, 0xb5, 0x32, 0xc2, 0xa8, 0x00, 0x06, 0x04, 0x60, 0xb9, 0x66, + 0x03, 0x00, 0x00, 0x02, 0x01, 0xc0, 0x00, 0x10, 0xc2, 0xe0, 0x06, 0x2e, 0x13, 0x08, 0xc2, 0xe0, + 0x05, 0xf8, 0x13, 0x05, 0x01, 0xe0, 0x07, 0x3a, 0x80, 0x00, 0x01, 0x80, 0x00, 0x10, 0x03, 0x90, + 0x7f, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc2, 0x20, 0x05, 0xf6, 0xe2, 0x20, 0x05, 0xf4, + 0x16, 0x0e, 0xd8, 0x20, 0x09, 0x2e, 0x01, 0x80, 0xc8, 0x2b, 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, + 0x09, 0x16, 0x00, 0x04, 0xc8, 0x0b, 0x05, 0xf4, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x07, 0x87, + 0x05, 0xf0, 0x04, 0xdb, 0xc2, 0x57, 0x16, 0x05, 0xcd, 0xcb, 0xc5, 0xcb, 0x03, 0x90, 0xff, 0xff, + 0x03, 0x80, 0x05, 0xc7, 0xc2, 0x57, 0xc6, 0x4b, 0xc5, 0xcb, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, + 0x03, 0x00, 0x00, 0x02, 0xc2, 0x0b, 0xc3, 0x20, 0x05, 0xf4, 0x13, 0x0f, 0xc2, 0xa8, 0x00, 0x0a, + 0x01, 0x4a, 0x00, 0x10, 0x16, 0x16, 0x22, 0xa0, 0xe0, 0x04, 0x16, 0x1a, 0xc3, 0x08, 0x06, 0xa0, + 0xbb, 0xfe, 0xc2, 0x0c, 0xc3, 0x20, 0x05, 0xf4, 0x16, 0x13, 0x01, 0x68, 0x00, 0x0a, 0x00, 0x10, + 0x13, 0x03, 0xc2, 0xe0, 0x05, 0xf6, 0x16, 0x05, 0x06, 0xa0, 0xbc, 0x40, 0x03, 0x90, 0xff, 0xff, + 0x03, 0x80, 0x07, 0x87, 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x44, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, + 0x07, 0x87, 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x8a, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0x07, 0x87, + 0x05, 0xf0, 0xc2, 0xcb, 0x16, 0x08, 0x06, 0xa0, 0xbb, 0xfe, 0x07, 0x20, 0x05, 0xf6, 0xcb, 0x60, + 0x05, 0xf4, 0x00, 0x02, 0x03, 0x80, 0x04, 0xe0, 0x05, 0xf6, 0xc2, 0x20, 0x05, 0xf4, 0x16, 0x05, + 0xc2, 0x17, 0x13, 0x03, 0xc5, 0xd8, 0x06, 0xa0, 0xbc, 0x40, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, + 0xc2, 0x8b, 0x06, 0xa0, 0xbb, 0xfe, 0xc1, 0xca, 0x02, 0x27, 0x00, 0x10, 0x07, 0x88, 0x05, 0xf0, + 0xc1, 0x88, 0xc2, 0x18, 0x13, 0x26, 0x82, 0xa8, 0x00, 0x02, 0x16, 0xfa, 0xc2, 0xe8, 0x00, 0x0a, + 0x22, 0xe0, 0xe0, 0x1e, 0x16, 0xf5, 0xc5, 0x98, 0x22, 0xe0, 0xe0, 0x1c, 0x16, 0x0b, 0xc8, 0x28, + 0x00, 0x06, 0x00, 0xf4, 0x02, 0xe0, 0x00, 0xe0, 0x06, 0xa0, 0xc1, 0x9c, 0x02, 0xe0, 0x00, 0xc0, + 0x04, 0xe8, 0x00, 0x06, 0x22, 0xe0, 0xe0, 0x18, 0x13, 0xe4, 0xea, 0x20, 0xe0, 0x22, 0x00, 0x0a, + 0xea, 0xa0, 0xe0, 0x18, 0x00, 0x04, 0x04, 0xda, 0x06, 0xa0, 0xc2, 0x44, 0x06, 0x47, 0xc2, 0x06, + 0x10, 0xd8, 0xc8, 0x06, 0x05, 0xf2, 0xcb, 0x60, 0x05, 0xf4, 0x00, 0x02, 0x04, 0x54, 0xc2, 0x20, + 0x05, 0xf4, 0x13, 0x13, 0x01, 0xe0, 0x01, 0x9c, 0x40, 0x00, 0x0b, 0x8b, 0x0b, 0x8b, 0x01, 0x60, + 0x01, 0x9c, 0x40, 0x00, 0x16, 0x0a, 0xc2, 0x60, 0x01, 0x6c, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x6c, + 0xc2, 0xa0, 0xfc, 0x02, 0x11, 0x03, 0xc8, 0x09, 0x01, 0x6c, 0x04, 0x5b, 0xc8, 0x09, 0x01, 0x6c, + 0xc2, 0x4b, 0x07, 0x87, 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x8a, 0x04, 0xe0, 0x05, 0xf4, 0x04, 0x59, + 0xc2, 0xa8, 0x00, 0x0a, 0x11, 0x0d, 0xf2, 0xa0, 0x09, 0x2e, 0xd8, 0x0a, 0x01, 0x80, 0xc8, 0x28, + 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04, 0xc8, 0x08, 0x05, 0xf4, 0x04, 0x5b, + 0xc3, 0x20, 0x01, 0x6c, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x6c, 0xc8, 0x20, 0xfc, 0x0e, 0x01, 0xbc, + 0xc8, 0x20, 0xfc, 0x10, 0x01, 0xb0, 0xc8, 0x20, 0xfc, 0x12, 0x01, 0xb2, 0xc8, 0x0c, 0x01, 0x6c, + 0xf2, 0xa0, 0x09, 0x2e, 0x01, 0x8a, 0x10, 0x00, 0x01, 0xa0, 0x01, 0x80, 0xc4, 0x00, 0x10, 0xdd, + 0x07, 0x33, 0x07, 0x33, 0x10, 0x0c, 0x07, 0x13, 0x07, 0x23, 0x00, 0x02, 0xc8, 0xcb, 0x00, 0x06, + 0x02, 0x23, 0x00, 0x18, 0xcc, 0xe0, 0x01, 0x6c, 0xcc, 0xcd, 0xcc, 0xce, 0xcc, 0xcf, 0x07, 0x83, + 0x06, 0x30, 0xc1, 0xd3, 0x13, 0x0a, 0x07, 0x83, 0x07, 0x36, 0xc1, 0xd3, 0x13, 0x06, 0x07, 0x83, + 0x00, 0xa0, 0x00, 0x93, 0xc8, 0x0c, 0x01, 0x6c, 0x03, 0x80, 0x07, 0x63, 0x00, 0x02, 0x15, 0x2a, + 0xc2, 0x63, 0x00, 0x04, 0x42, 0x63, 0x00, 0x06, 0x13, 0xdb, 0xc3, 0x63, 0x00, 0x1a, 0xd2, 0x49, + 0x13, 0x0c, 0x06, 0xc9, 0x72, 0x49, 0xd2, 0x69, 0xe1, 0xc0, 0x06, 0xc9, 0x72, 0x49, 0x48, 0xe9, + 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02, 0x04, 0x52, 0xc2, 0x69, 0xe1, 0xc0, 0x72, 0x49, + 0x02, 0x29, 0x00, 0x10, 0xc2, 0xc3, 0xa2, 0xe9, 0xe1, 0xa8, 0xc3, 0x1b, 0x02, 0x89, 0x00, 0x12, + 0x13, 0x0f, 0xc6, 0xdc, 0x16, 0x03, 0x48, 0xe9, 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02, + 0xcb, 0x4c, 0x00, 0x04, 0x03, 0x90, 0x01, 0xff, 0x00, 0x93, 0xc8, 0x0c, 0x01, 0x6c, 0x03, 0x80, + 0xc8, 0x0c, 0x01, 0x6c, 0xc6, 0xe0, 0xfc, 0x00, 0x16, 0xf1, 0x48, 0xe9, 0xe0, 0x04, 0x00, 0x04, + 0xcb, 0x49, 0x00, 0x02, 0xcb, 0x4c, 0x00, 0x04, 0x10, 0xed, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xdb, + 0xc2, 0x63, 0x00, 0x04, 0x42, 0x4b, 0x13, 0x9f, 0xd2, 0x49, 0x13, 0x0e, 0x06, 0xc9, 0x72, 0x49, + 0xd2, 0x69, 0xe1, 0xc0, 0x06, 0xc9, 0x72, 0x49, 0x48, 0xe9, 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, + 0x00, 0x02, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0xc2, 0x69, 0xe1, 0xc0, 0x72, 0x49, 0x02, 0x29, + 0x00, 0x10, 0xc2, 0xc3, 0xa2, 0xe9, 0xe1, 0xa8, 0xc3, 0x1b, 0x02, 0x89, 0x00, 0x12, 0x13, 0x0c, + 0xc6, 0xdc, 0x16, 0x03, 0x48, 0xe9, 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02, 0xcb, 0x4c, + 0x00, 0x04, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0xc8, 0x0c, 0x01, 0x6c, 0xc6, 0xe0, 0xfc, 0x00, + 0x16, 0xf4, 0x10, 0xf0, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xbb, 0xc1, 0xbb, 0xd1, 0x86, 0x13, 0x03, + 0xea, 0x86, 0x00, 0x04, 0x10, 0x13, 0xd1, 0xa6, 0xe1, 0xc0, 0x06, 0xc6, 0x71, 0x86, 0xc1, 0xca, + 0xa1, 0xe6, 0xe1, 0xb8, 0xea, 0xa6, 0xe0, 0x14, 0x00, 0x04, 0xc2, 0x1b, 0x02, 0x86, 0x00, 0x02, + 0x16, 0x03, 0x06, 0xa0, 0xc2, 0x6a, 0x10, 0x02, 0x06, 0xa0, 0xc2, 0x44, 0x04, 0xda, 0x03, 0x80, + 0x03, 0x00, 0x00, 0x02, 0xc2, 0xab, 0x00, 0x06, 0x07, 0x8c, 0x05, 0xe8, 0xc2, 0x5c, 0x13, 0x16, + 0xc1, 0xa0, 0x05, 0xec, 0x81, 0x8a, 0x1a, 0x1a, 0xc1, 0xc6, 0xc2, 0x09, 0xc2, 0x59, 0x13, 0x20, + 0xa1, 0xe9, 0x00, 0x08, 0x82, 0x87, 0x12, 0xf9, 0xa2, 0xa9, 0x00, 0x08, 0x62, 0x87, 0xca, 0xca, + 0x00, 0x08, 0x6a, 0x4a, 0x00, 0x08, 0xc6, 0xc9, 0xc6, 0x0b, 0x03, 0x80, 0xca, 0xca, 0x00, 0x08, + 0xc8, 0x0a, 0x05, 0xec, 0x04, 0xdb, 0xcf, 0x0b, 0xc7, 0x0b, 0x03, 0x80, 0x61, 0x8a, 0xca, 0x46, + 0x00, 0x08, 0xca, 0xca, 0x00, 0x08, 0xc8, 0x0a, 0x05, 0xec, 0xc6, 0xc9, 0xc7, 0x0b, 0x03, 0x80, + 0x62, 0x87, 0xca, 0xca, 0x00, 0x08, 0x04, 0xdb, 0xc6, 0x0b, 0xcb, 0x0b, 0x00, 0x02, 0x03, 0x80, + 0x03, 0x00, 0x00, 0x02, 0xc1, 0xbb, 0xc2, 0xdb, 0x07, 0x8c, 0x05, 0xe8, 0xc2, 0x4c, 0x04, 0xed, + 0x00, 0x02, 0xc2, 0x09, 0xc2, 0x59, 0x13, 0x18, 0x81, 0xa9, 0x00, 0x02, 0x16, 0xfa, 0x82, 0xe9, + 0x00, 0x04, 0x16, 0xf7, 0xcb, 0x49, 0x00, 0x04, 0xc2, 0x99, 0xc6, 0x0a, 0x13, 0x0a, 0x83, 0x08, + 0x13, 0x04, 0xaa, 0xa9, 0x00, 0x08, 0x00, 0x08, 0x03, 0x80, 0xa8, 0x2a, 0x00, 0x08, 0x05, 0xec, + 0x03, 0x80, 0xcb, 0x08, 0x00, 0x02, 0x03, 0x80, 0x07, 0x2d, 0x00, 0x02, 0x07, 0x8c, 0x00, 0x08, + 0xa3, 0x06, 0xc2, 0x4c, 0xc2, 0x09, 0xc2, 0x59, 0x13, 0x13, 0x82, 0xe9, 0x00, 0x04, 0x16, 0xfa, + 0x07, 0xad, 0x00, 0x02, 0x00, 0x01, 0xcb, 0x49, 0x00, 0x04, 0xc6, 0x19, 0x13, 0x01, 0x03, 0x80, + 0x83, 0x08, 0x16, 0x04, 0x49, 0xa0, 0xe0, 0x14, 0x00, 0x04, 0x03, 0x80, 0xcb, 0x08, 0x00, 0x02, + 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0x06, 0x0b, 0x11, 0x1f, 0x13, 0x4d, 0x07, 0x8b, 0x4e, 0x00, + 0x01, 0x60, 0x01, 0x42, 0x00, 0x80, 0x13, 0x09, 0x07, 0x8b, 0x3a, 0x00, 0xc1, 0x20, 0x01, 0x4e, + 0x02, 0x84, 0x0f, 0x41, 0x11, 0x02, 0x07, 0x8b, 0x4e, 0x00, 0xc8, 0x0b, 0x01, 0x44, 0x07, 0xa0, + 0x09, 0x62, 0x03, 0xe8, 0x01, 0xe0, 0x01, 0x40, 0x02, 0x00, 0x01, 0xe0, 0x01, 0x40, 0x20, 0x00, + 0x07, 0x84, 0xbc, 0xa0, 0x04, 0x60, 0xbc, 0xae, 0xc8, 0x20, 0xe0, 0x16, 0x00, 0xe0, 0xc2, 0xe0, + 0x09, 0x6a, 0x22, 0xe0, 0xe0, 0x10, 0x13, 0x03, 0xe8, 0x20, 0xe0, 0x14, 0x00, 0xe0, 0xc8, 0x20, + 0xe0, 0x04, 0x01, 0x82, 0xc8, 0x20, 0x00, 0xe2, 0x01, 0x8a, 0x04, 0xe0, 0x09, 0x18, 0x04, 0xe0, + 0x05, 0xf4, 0x04, 0xe0, 0x05, 0xf8, 0x04, 0xe0, 0x05, 0xf0, 0x04, 0xe0, 0x07, 0x42, 0x07, 0xa0, + 0x01, 0x88, 0x00, 0x20, 0xc2, 0xe0, 0x09, 0x30, 0x13, 0x09, 0x07, 0xa0, 0x01, 0x88, 0x00, 0x80, + 0xe8, 0x20, 0xe0, 0x16, 0x01, 0x80, 0x01, 0xe0, 0x01, 0x82, 0x03, 0x00, 0x07, 0x8b, 0xa0, 0x00, + 0xe8, 0x0b, 0x01, 0x86, 0x03, 0x80, 0x04, 0xe0, 0x01, 0x86, 0x01, 0xe0, 0x01, 0x9c, 0x00, 0x40, + 0x01, 0xe0, 0x01, 0x9c, 0x40, 0x00, 0x04, 0xcb, 0x03, 0xb0, 0x06, 0x0b, 0x13, 0x04, 0x01, 0x60, + 0x01, 0x9c, 0x40, 0x00, 0x16, 0xf9, 0x04, 0xe0, 0x01, 0x82, 0xe8, 0x20, 0xe0, 0x08, 0x09, 0x6a, + 0x07, 0x8b, 0x80, 0x00, 0xc8, 0x0b, 0x07, 0x98, 0xc8, 0x0b, 0x07, 0x78, 0xc8, 0x20, 0xe0, 0x04, + 0x01, 0x82, 0x07, 0x8b, 0x87, 0x6f, 0x48, 0x0b, 0x07, 0x3a, 0xc2, 0xe0, 0x07, 0x50, 0x02, 0x8b, + 0x07, 0x58, 0x13, 0x10, 0xe8, 0x20, 0xe0, 0x0a, 0x01, 0x00, 0xc2, 0xe0, 0x01, 0x00, 0x22, 0xe0, + 0xe0, 0x06, 0x13, 0xf8, 0x07, 0x8b, 0x07, 0x58, 0xc8, 0x0b, 0x07, 0x50, 0x07, 0x8b, 0xc5, 0x6a, + 0xc8, 0x0b, 0x07, 0x52, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xe0, 0x09, 0x1a, 0x13, 0x0c, + 0x06, 0x20, 0x09, 0x1c, 0xc8, 0x0b, 0x01, 0x6c, 0xc8, 0x20, 0xfc, 0x00, 0x09, 0x1a, 0xcb, 0x4b, + 0x00, 0x02, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0xc0, 0x41, 0x13, 0x0f, 0x80, 0x81, 0x13, 0x0d, + 0xa0, 0x82, 0xc2, 0xe2, 0x0c, 0x32, 0x09, 0x12, 0xc8, 0x0b, 0x01, 0x6c, 0x04, 0xe0, 0xfc, 0x00, + 0xc3, 0x20, 0xfc, 0x02, 0x11, 0x07, 0xc8, 0x02, 0xfc, 0x00, 0x04, 0xed, 0x00, 0x02, 0x04, 0xe0, + 0x01, 0x6c, 0x03, 0x80, 0xcb, 0x42, 0x00, 0x02, 0xc8, 0x02, 0x01, 0x6c, 0xc0, 0x8b, 0x03, 0x80, + 0x03, 0x00, 0x00, 0x02, 0x07, 0x83, 0x80, 0x00, 0xc2, 0x60, 0x09, 0x7e, 0xc1, 0x09, 0x02, 0x24, + 0xff, 0xf8, 0x08, 0xa9, 0x02, 0x01, 0x00, 0x00, 0x02, 0x02, 0x00, 0x00, 0x02, 0x0b, 0x00, 0x00, + 0x02, 0x0c, 0x00, 0x00, 0x02, 0x07, 0x00, 0x00, 0xcb, 0x2c, 0x0c, 0x32, 0x0c, 0x32, 0x13, 0x06, + 0x05, 0x8b, 0x05, 0xcc, 0x88, 0x0b, 0x04, 0x46, 0x1b, 0x27, 0x10, 0xf6, 0xc2, 0x09, 0xc2, 0x8b, + 0x06, 0x08, 0x13, 0x0a, 0x05, 0x8b, 0x05, 0xcc, 0x88, 0x0b, 0x04, 0x46, 0x1b, 0x1d, 0xcb, 0x2c, + 0x0c, 0x32, 0x0c, 0x32, 0x16, 0xed, 0x10, 0xf4, 0xc0, 0x82, 0x13, 0x14, 0xc8, 0x02, 0x01, 0x6c, + 0xc8, 0x0a, 0xfc, 0x00, 0xc8, 0x0a, 0x01, 0x6c, 0x04, 0xe0, 0xfc, 0x00, 0x07, 0xa0, 0xfc, 0x02, + 0x80, 0x00, 0xc8, 0x04, 0xfc, 0x04, 0xc2, 0x0a, 0xa2, 0x08, 0xca, 0x02, 0x0c, 0x32, 0xc0, 0x8a, + 0x05, 0x87, 0x10, 0xd6, 0xc0, 0x4a, 0x10, 0xee, 0xcb, 0x47, 0x00, 0x02, 0x04, 0xe0, 0x01, 0x6c, + 0x07, 0x8b, 0x00, 0x43, 0x04, 0xe0, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x02, 0xc8, 0x0b, 0x01, 0x6c, + 0xc2, 0x8b, 0x06, 0xa0, 0xc1, 0xa0, 0x03, 0x90, 0x00, 0x7f, 0x03, 0x80, 0x01, 0xa0, 0xfc, 0x02, + 0x00, 0x20, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x01, 0x16, 0x0b, 0x02, 0x0a, 0xfc, 0x02, 0xa2, 0xa0, + 0x09, 0x2c, 0xce, 0xa0, 0x05, 0xee, 0xc6, 0xa0, 0xfc, 0x04, 0xc8, 0x20, 0x09, 0x2c, 0xfc, 0x04, + 0x07, 0x8a, 0x05, 0xf8, 0xc2, 0x5a, 0x13, 0x08, 0x05, 0xca, 0xc2, 0x5a, 0xc8, 0x09, 0x01, 0x6c, + 0xc8, 0x0b, 0xfc, 0x00, 0xc6, 0x8b, 0x10, 0x02, 0xce, 0x8b, 0xc6, 0x8b, 0x20, 0x20, 0xe0, 0x1a, + 0x16, 0x05, 0xe8, 0x20, 0xe0, 0x04, 0x07, 0x3a, 0x04, 0xe0, 0x07, 0x36, 0x03, 0x90, 0x00, 0x7f, + 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc8, 0x0b, 0x01, 0x6c, 0x04, 0xcc, 0x04, 0xe0, 0xfc, 0x00, + 0xc2, 0x8b, 0x06, 0xa0, 0xc1, 0xae, 0x03, 0x90, 0x00, 0x7f, 0x03, 0x80, 0x07, 0xa0, 0xfc, 0x02, + 0x80, 0x00, 0xc8, 0x20, 0xe1, 0x8c, 0xfc, 0x04, 0xc0, 0x41, 0x16, 0x0f, 0xd8, 0x20, 0xe2, 0x00, + 0x01, 0x83, 0x00, 0x00, 0xc1, 0x82, 0x00, 0x15, 0x0b, 0x8b, 0x00, 0x00, 0xc1, 0x96, 0x0c, 0xa8, + 0xc8, 0x0a, 0x01, 0x8a, 0x04, 0x5b, 0xc8, 0x0a, 0x01, 0x6c, 0xc3, 0x20, 0xfc, 0x00, 0x04, 0xe0, + 0xfc, 0x00, 0x02, 0x8a, 0x00, 0x43, 0x13, 0xdf, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0xc8, 0x04, + 0xfc, 0x04, 0x98, 0x20, 0x09, 0x84, 0x09, 0x1d, 0x13, 0x0a, 0xc8, 0x20, 0x09, 0x1a, 0xfc, 0x00, + 0xc8, 0x0a, 0x09, 0x1a, 0x05, 0xa0, 0x09, 0x1c, 0xc2, 0x8c, 0x16, 0xe5, 0x04, 0x5b, 0xc0, 0x41, + 0x13, 0x10, 0xa2, 0x8a, 0xca, 0x82, 0x0c, 0x32, 0x09, 0x1a, 0xc8, 0x02, 0x01, 0x6c, 0xc8, 0x0a, + 0xfc, 0x00, 0xc0, 0x8a, 0x98, 0x20, 0x01, 0x83, 0xe2, 0x00, 0x13, 0x09, 0xc2, 0x8c, 0x16, 0xd3, + 0x04, 0x5b, 0xc0, 0x4a, 0xc0, 0x8a, 0x98, 0x20, 0x01, 0x83, 0xe2, 0x00, 0x16, 0x1b, 0x01, 0xe0, + 0x01, 0x9c, 0x00, 0x40, 0x07, 0xa0, 0x09, 0x64, 0x70, 0x00, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, + 0x13, 0x07, 0x06, 0x20, 0x09, 0x64, 0x16, 0xf9, 0x02, 0x0a, 0x01, 0x00, 0x04, 0x60, 0xb3, 0x8a, + 0x01, 0x60, 0x0c, 0x02, 0x01, 0x00, 0x13, 0xe2, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83, 0x07, 0xa0, + 0x0c, 0x02, 0x80, 0x00, 0xc8, 0x0a, 0x01, 0x8a, 0xc8, 0x0a, 0x09, 0x18, 0x10, 0xd7, 0x04, 0xd8, + 0xc2, 0x57, 0x16, 0x03, 0xcd, 0xc8, 0xc5, 0xc8, 0x04, 0x5b, 0x05, 0xc7, 0xc2, 0x57, 0xc6, 0x48, + 0xc5, 0xc8, 0x04, 0x5b, 0xc8, 0x08, 0x01, 0x6c, 0xa2, 0x08, 0xca, 0x20, 0xfc, 0x00, 0x0c, 0x32, + 0x09, 0x18, 0x10, 0x02, 0xc8, 0x08, 0x01, 0x6c, 0x04, 0xe0, 0xfc, 0x00, 0xc2, 0x57, 0x16, 0x03, + 0xcd, 0xc8, 0xc5, 0xc8, 0x04, 0x5b, 0x05, 0xc7, 0xc8, 0x17, 0x01, 0x6c, 0xc8, 0x08, 0xfc, 0x00, + 0xc5, 0xc8, 0x04, 0x5b, 0xc6, 0x17, 0x16, 0x02, 0xc9, 0xc8, 0x00, 0x02, 0xc5, 0xc8, 0x04, 0x5b, + 0xc2, 0x17, 0xc8, 0x08, 0x01, 0x6c, 0x13, 0x07, 0xc5, 0xe0, 0xfc, 0x00, 0xa2, 0x08, 0xc8, 0x28, + 0x0c, 0x32, 0xfc, 0x00, 0x09, 0x18, 0x04, 0x5b, 0x01, 0x60, 0x01, 0x82, 0x20, 0x00, 0x16, 0x0a, + 0xc2, 0x60, 0x01, 0x84, 0x01, 0xa0, 0x01, 0x82, 0x20, 0x00, 0x01, 0xe0, 0x01, 0x82, 0x20, 0x00, + 0xc8, 0x09, 0x01, 0x84, 0x04, 0xc9, 0x04, 0x5b, 0x06, 0xa0, 0xc5, 0x1c, 0x04, 0xd3, 0x04, 0xe0, + 0x01, 0x02, 0xe8, 0x20, 0xe0, 0x14, 0x01, 0x00, 0xc8, 0x20, 0xe0, 0x16, 0x01, 0x04, 0x2c, 0x05, + 0x48, 0x20, 0xe0, 0x14, 0x01, 0x00, 0x07, 0x8c, 0x0a, 0x00, 0x07, 0x8d, 0x07, 0xd8, 0x07, 0x8e, + 0x00, 0x18, 0xcf, 0x7c, 0x06, 0x4e, 0x16, 0xfd, 0x02, 0xe0, 0x07, 0xd8, 0x07, 0x8f, 0xff, 0x11, + 0x02, 0x8b, 0x59, 0x3b, 0x16, 0x21, 0x02, 0x8a, 0x59, 0x3b, 0x13, 0x1e, 0x05, 0x8f, 0x20, 0x20, + 0xe0, 0x16, 0x16, 0x01, 0x10, 0x19, 0x20, 0x20, 0xe0, 0x04, 0x16, 0x16, 0x01, 0x00, 0x00, 0xbf, + 0x16, 0x13, 0x07, 0x8b, 0x40, 0xc0, 0x01, 0x00, 0x60, 0x00, 0x13, 0x10, 0x01, 0x40, 0x60, 0x00, + 0x16, 0x0b, 0x07, 0x8b, 0x44, 0xc4, 0xc3, 0xa0, 0x01, 0x02, 0x48, 0x0e, 0x01, 0x02, 0x01, 0x4e, + 0x10, 0x00, 0x16, 0x04, 0x07, 0x8f, 0xff, 0x18, 0x04, 0x60, 0xc4, 0xf2, 0xc3, 0x0b, 0xc3, 0x4b, + 0x20, 0x20, 0xe0, 0x0a, 0x16, 0x02, 0x02, 0x6b, 0x20, 0x20, 0x20, 0x20, 0xe0, 0x0c, 0x16, 0x02, + 0x02, 0x6c, 0x20, 0x00, 0x20, 0x20, 0xe0, 0x0e, 0x16, 0x02, 0x02, 0x6c, 0x00, 0x20, 0x05, 0x8f, + 0x20, 0x20, 0xe0, 0x10, 0x16, 0x07, 0x02, 0x6d, 0x00, 0x20, 0x21, 0x20, 0xe0, 0x22, 0x13, 0xe4, + 0xc1, 0x04, 0x16, 0x02, 0x07, 0x84, 0x7f, 0xfe, 0x05, 0x8f, 0x20, 0x20, 0xe0, 0x12, 0x16, 0x02, + 0x02, 0x6d, 0x20, 0x00, 0x21, 0x60, 0xe0, 0x22, 0x13, 0xd7, 0xc1, 0x45, 0x16, 0x02, 0x07, 0x85, + 0x7f, 0xfe, 0x05, 0x8f, 0xd1, 0x86, 0x13, 0x0b, 0x25, 0xa0, 0xe0, 0x26, 0x13, 0x08, 0x05, 0x8f, + 0x26, 0x20, 0xe0, 0x22, 0x16, 0x04, 0x05, 0x8f, 0x26, 0xa0, 0xe0, 0x22, 0x13, 0x02, 0x04, 0x60, + 0xc4, 0xf2, 0xd8, 0x01, 0x08, 0xec, 0xd8, 0x20, 0x07, 0xdb, 0x09, 0x00, 0xd8, 0x02, 0x08, 0xf6, + 0xd8, 0x20, 0x07, 0xdd, 0x08, 0xe2, 0x02, 0xe0, 0x07, 0x58, 0xd8, 0x20, 0x07, 0xef, 0x07, 0xf4, + 0xd8, 0x20, 0x07, 0xf1, 0x07, 0xf6, 0xd8, 0x20, 0x07, 0xf3, 0x07, 0xf8, 0x02, 0x09, 0x00, 0x06, + 0x04, 0xcb, 0x02, 0x0f, 0x07, 0xee, 0x05, 0x8f, 0xdf, 0xcb, 0x06, 0x09, 0x16, 0xfc, 0x06, 0xa0, + 0xc5, 0x1c, 0x07, 0x89, 0xe3, 0x5c, 0x04, 0xe0, 0x01, 0x1a, 0xc8, 0x20, 0x07, 0xe4, 0x01, 0x18, + 0xc8, 0x19, 0x01, 0x0c, 0xc8, 0x39, 0x01, 0x0a, 0xc8, 0x39, 0x01, 0x12, 0x16, 0x09, 0xc3, 0x79, + 0x02, 0x0f, 0xe0, 0x00, 0x63, 0x4f, 0x02, 0x2d, 0xa0, 0x00, 0xc8, 0x0d, 0x01, 0x14, 0x10, 0x02, + 0xc8, 0x39, 0x01, 0x14, 0xc3, 0xf9, 0xc8, 0x3f, 0x01, 0x0e, 0xc8, 0x1f, 0x01, 0x10, 0x04, 0xe0, + 0x09, 0x14, 0xc2, 0xb9, 0xc8, 0x1a, 0x01, 0x00, 0x06, 0x96, 0x02, 0x89, 0xe3, 0x84, 0x16, 0xe0, + 0x07, 0x8f, 0xff, 0x1c, 0x07, 0x8c, 0x0a, 0x00, 0x07, 0x8d, 0xe3, 0x84, 0x07, 0x8e, 0x00, 0x10, + 0x8f, 0x7c, 0x16, 0x44, 0x06, 0x4e, 0x16, 0xfc, 0xc3, 0xa0, 0x07, 0xe2, 0xc3, 0xe0, 0x07, 0xe0, + 0x83, 0xce, 0x14, 0x01, 0xc3, 0xce, 0xc8, 0x0f, 0x01, 0x1a, 0x07, 0x8c, 0xe3, 0x94, 0x07, 0x8d, + 0x0a, 0x00, 0x07, 0x8e, 0xe3, 0xa4, 0x63, 0x8c, 0xcf, 0x7c, 0x06, 0x4e, 0x16, 0xfd, 0x04, 0xe0, + 0x09, 0x30, 0x01, 0x20, 0x01, 0x42, 0x04, 0x00, 0x16, 0x02, 0x07, 0x20, 0x09, 0x30, 0xc2, 0x60, + 0x01, 0x62, 0x04, 0xe0, 0x01, 0x62, 0x07, 0x8e, 0x80, 0x00, 0x07, 0x8c, 0x09, 0x34, 0x07, 0x8d, + 0x00, 0x06, 0xdf, 0x3e, 0x05, 0x8e, 0x06, 0x0d, 0x16, 0xfc, 0xd3, 0xfe, 0x06, 0xcf, 0x05, 0x8e, + 0xd3, 0xfe, 0x06, 0xcf, 0x07, 0x8c, 0x09, 0x34, 0xc8, 0x09, 0x01, 0x62, 0x04, 0xc9, 0xa3, 0x5c, + 0xe2, 0x7c, 0xa3, 0x5c, 0xe2, 0x7c, 0xa3, 0x5c, 0xe2, 0x7c, 0x13, 0x02, 0x83, 0xcd, 0x13, 0x09, + 0x07, 0x20, 0x09, 0x34, 0x10, 0x06, 0x07, 0x8f, 0xff, 0x19, 0xa3, 0xcd, 0xc8, 0x0f, 0x01, 0x04, + 0x10, 0xff, 0x01, 0xa0, 0x01, 0x02, 0x10, 0x00, 0xc3, 0xe0, 0x07, 0xee, 0x43, 0xe0, 0xe0, 0x06, + 0xc8, 0x0f, 0x01, 0x00, 0xc0, 0x20, 0xe0, 0x04, 0x04, 0xe0, 0x06, 0xfe, 0x04, 0xd3, 0x04, 0xe0, + 0x01, 0x04, 0x04, 0x60, 0xc5, 0x6a, 0x07, 0x8c, 0x0a, 0x00, 0x07, 0x8d, 0x00, 0x18, 0x07, 0x8e, + 0x59, 0x3b, 0xcf, 0x0e, 0x06, 0x4d, 0x16, 0xfd, 0x04, 0x5b, 0x01, 0x93, 0x80, 0x00, 0x04, 0x20, + 0xe2, 0xc0, 0xd0, 0x60, 0x07, 0x98, 0x13, 0x1c, 0x03, 0x00, 0x00, 0x02, 0xc0, 0xa0, 0x07, 0x46, + 0xc8, 0x12, 0x07, 0x46, 0x16, 0x02, 0x01, 0x93, 0x00, 0x20, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x20, + 0xe2, 0xe8, 0x01, 0x93, 0x20, 0x00, 0x01, 0x80, 0x40, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x16, 0x49, + 0xc3, 0xc4, 0x16, 0x25, 0xc3, 0xd3, 0x43, 0xc5, 0x16, 0x0c, 0xc3, 0xe0, 0x07, 0x98, 0x11, 0x03, + 0x02, 0xe0, 0x07, 0x98, 0x04, 0x51, 0xc3, 0xe0, 0x07, 0x78, 0x11, 0x0a, 0x02, 0xe0, 0x07, 0x78, + 0x04, 0x51, 0x11, 0xd3, 0x01, 0x4f, 0x20, 0x00, 0x13, 0xe4, 0x01, 0x4f, 0x00, 0x20, 0x13, 0xd1, + 0x2c, 0x05, 0xa0, 0x41, 0x04, 0x21, 0xe2, 0xc0, 0x07, 0x8b, 0xc5, 0x6a, 0x01, 0x00, 0x40, 0x00, + 0x13, 0x0f, 0xc3, 0xdd, 0x02, 0x4f, 0x00, 0x0f, 0xe1, 0x2f, 0xe0, 0x14, 0x04, 0x5b, 0xc3, 0xe4, + 0xe1, 0xc0, 0x73, 0xcf, 0x41, 0x2f, 0xe0, 0x14, 0xc3, 0x6f, 0xea, 0x8c, 0x07, 0x8b, 0xc5, 0x6a, + 0xc2, 0x4b, 0xc2, 0xa0, 0x07, 0xf4, 0x07, 0x8c, 0x00, 0x08, 0xc0, 0xbd, 0xc3, 0xa0, 0x07, 0xea, + 0xc3, 0xe0, 0x07, 0xec, 0x06, 0xa0, 0xc7, 0x5e, 0x01, 0xc0, 0x40, 0x00, 0xd8, 0x02, 0x01, 0x17, + 0x02, 0x62, 0xff, 0x80, 0x06, 0xa0, 0xc7, 0xb2, 0xc8, 0x02, 0x01, 0x04, 0x03, 0x90, 0x60, 0x3f, + 0x04, 0x59, 0xc3, 0xc0, 0x73, 0xcf, 0xc3, 0xef, 0xe1, 0xc0, 0x73, 0xcf, 0xc3, 0xaf, 0xea, 0x7e, + 0xc3, 0x9e, 0x02, 0x4e, 0x00, 0x0f, 0x21, 0x2e, 0xe0, 0x14, 0x13, 0x08, 0x40, 0x2f, 0xe0, 0x14, + 0xa3, 0xcf, 0x04, 0x2f, 0xe2, 0xf0, 0x01, 0x40, 0x40, 0x00, 0x13, 0xa4, 0xc3, 0xc4, 0x16, 0xc7, + 0x01, 0x00, 0x00, 0xfe, 0x16, 0xe6, 0x10, 0x9e, 0x01, 0x40, 0x40, 0x00, 0x16, 0x05, 0xe0, 0x20, + 0xe0, 0x14, 0x02, 0x65, 0x58, 0x00, 0x10, 0x96, 0xd8, 0x20, 0x07, 0xde, 0x01, 0x17, 0x07, 0x8f, + 0xff, 0x86, 0xc8, 0x0f, 0x01, 0x04, 0x01, 0xc0, 0x40, 0x00, 0x02, 0x45, 0xa7, 0xff, 0x10, 0x8a, + 0xc3, 0x20, 0x06, 0xfe, 0x27, 0x20, 0xe3, 0x38, 0x13, 0x07, 0x23, 0x20, 0xe0, 0x22, 0x13, 0x1a, + 0x02, 0x65, 0xdf, 0xff, 0x40, 0x20, 0xe0, 0x14, 0xe0, 0x20, 0xe0, 0x16, 0xc8, 0x0c, 0x08, 0xe6, + 0x07, 0x8d, 0x08, 0xe2, 0x04, 0x58, 0x48, 0x20, 0xe0, 0x08, 0x06, 0xfe, 0xc3, 0x20, 0x08, 0xe6, + 0x27, 0x20, 0xe3, 0x38, 0x16, 0x19, 0x03, 0x80, 0xc3, 0x02, 0xc2, 0x6c, 0x00, 0x0a, 0x06, 0x99, + 0x04, 0x60, 0xc5, 0x6a, 0xc2, 0xa0, 0x07, 0xf4, 0x07, 0x8c, 0x00, 0x01, 0x07, 0x8d, 0x06, 0x06, + 0x04, 0xce, 0xc3, 0xe0, 0x06, 0x08, 0x13, 0x01, 0x06, 0x97, 0xd8, 0x20, 0x06, 0x07, 0x01, 0x17, + 0x07, 0x8b, 0xff, 0x82, 0xc8, 0x0b, 0x01, 0x04, 0x06, 0xa0, 0xcb, 0xe4, 0x04, 0x60, 0xc5, 0x6a, + 0xc2, 0xa0, 0x07, 0xee, 0x07, 0x8c, 0x00, 0x06, 0x07, 0x8d, 0x08, 0xee, 0xc3, 0xa0, 0x07, 0xe6, + 0xc3, 0xe0, 0x07, 0xe8, 0x06, 0x97, 0xc2, 0xa0, 0x07, 0xf4, 0x07, 0x8d, 0x08, 0xf4, 0x04, 0xdd, + 0x07, 0x8c, 0x00, 0x02, 0x06, 0x97, 0x07, 0x8d, 0x80, 0x00, 0xc2, 0xa0, 0x08, 0xee, 0x88, 0x0a, + 0x06, 0x0c, 0x1b, 0x14, 0x07, 0x82, 0xc7, 0x2e, 0xc3, 0xa0, 0x08, 0xf0, 0xc3, 0xe0, 0x08, 0xf2, + 0x07, 0x8b, 0xe3, 0x0c, 0x02, 0x8a, 0x00, 0x14, 0x1a, 0x04, 0x07, 0x8b, 0xea, 0x7a, 0x02, 0x2a, + 0xff, 0xec, 0xa2, 0x8a, 0xa2, 0xca, 0xc2, 0xdb, 0x13, 0x01, 0x06, 0x9b, 0xc8, 0x20, 0x08, 0xee, + 0x08, 0xf2, 0xc8, 0x20, 0xe0, 0x20, 0x08, 0xee, 0xc8, 0x0d, 0x08, 0xf0, 0x07, 0x8d, 0x08, 0xec, + 0xe0, 0x20, 0xe0, 0x18, 0x02, 0x65, 0x58, 0x00, 0x04, 0x58, 0x02, 0x45, 0xa7, 0xff, 0x03, 0x80, + 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06, 0x16, 0x07, + 0x88, 0x01, 0x05, 0xee, 0x16, 0xf9, 0x10, 0x39, 0xd0, 0x60, 0x01, 0x03, 0x13, 0xf1, 0x02, 0x01, + 0x01, 0x0a, 0xcc, 0x4c, 0xcc, 0x4c, 0xcc, 0x4e, 0xcc, 0x4f, 0x07, 0xb1, 0x00, 0x40, 0xcc, 0x4d, + 0xc8, 0x0a, 0x01, 0x00, 0x04, 0x5b, 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, + 0x01, 0x02, 0x00, 0x06, 0x16, 0x07, 0x88, 0x01, 0x05, 0xee, 0x16, 0xf9, 0x10, 0x1e, 0xd0, 0x60, + 0x01, 0x03, 0x13, 0xf1, 0x02, 0x01, 0x01, 0x0a, 0xcc, 0x4c, 0xcc, 0x4c, 0xcc, 0x4e, 0xcc, 0x4f, + 0x07, 0xb1, 0x00, 0x40, 0xcc, 0x4d, 0xc8, 0x0a, 0x01, 0x00, 0x03, 0xa0, 0xd0, 0x60, 0x01, 0x03, + 0x13, 0x01, 0x04, 0x5b, 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, + 0x00, 0x06, 0x16, 0xf7, 0x88, 0x01, 0x05, 0xee, 0x16, 0xf9, 0x04, 0xcd, 0x07, 0x8a, 0x40, 0x00, + 0xc3, 0x20, 0x01, 0x00, 0x01, 0x0c, 0x80, 0x00, 0x13, 0x02, 0x07, 0x8a, 0x20, 0x00, 0xc3, 0xa0, + 0x01, 0x0e, 0xc3, 0xe0, 0x01, 0x10, 0x03, 0xb0, 0xc3, 0x20, 0x07, 0x58, 0x23, 0x20, 0xe0, 0x04, + 0x13, 0x02, 0x04, 0x60, 0xc4, 0xec, 0x04, 0x60, 0xb3, 0x8a, 0x07, 0x8d, 0x20, 0x00, 0x20, 0x20, + 0xe0, 0x0a, 0x16, 0x01, 0x04, 0x5b, 0x02, 0x0d, 0x0c, 0x32, 0xc2, 0x5d, 0x11, 0x01, 0x04, 0xdd, + 0x05, 0xcd, 0x88, 0x0d, 0x0c, 0x30, 0x16, 0xf9, 0xc2, 0x60, 0x06, 0x0a, 0x07, 0x8d, 0x09, 0x6a, + 0x06, 0xa0, 0xcc, 0x24, 0x02, 0x09, 0x00, 0x6e, 0xc3, 0xe0, 0x09, 0x30, 0x16, 0x03, 0x01, 0xe0, + 0x09, 0x6a, 0x00, 0x10, 0xc2, 0xe0, 0x09, 0x6a, 0x02, 0x0f, 0x01, 0x00, 0x26, 0xc9, 0x13, 0x02, + 0x04, 0x60, 0xca, 0xb6, 0x02, 0x09, 0x12, 0x00, 0x01, 0x4b, 0x00, 0x10, 0x13, 0x02, 0x02, 0x09, + 0x13, 0x00, 0xd8, 0x09, 0x09, 0x2e, 0x07, 0x8f, 0x40, 0x00, 0x07, 0x89, 0x09, 0x6c, 0x04, 0xcb, + 0xe2, 0xf9, 0xe2, 0xf9, 0xe2, 0xf9, 0x16, 0x07, 0x07, 0x8b, 0x09, 0x34, 0x07, 0x8c, 0x09, 0x6c, + 0xcf, 0x3b, 0xcf, 0x3b, 0xc7, 0x1b, 0xc3, 0x20, 0x09, 0x6c, 0x11, 0x19, 0x07, 0x8f, 0x20, 0x00, + 0x07, 0x89, 0x09, 0x7a, 0x06, 0xa0, 0xc8, 0x98, 0x06, 0xa0, 0xc8, 0x98, 0x10, 0x12, 0xce, 0x4c, + 0x04, 0x5b, 0xc3, 0x19, 0x16, 0x02, 0x07, 0x8c, 0x00, 0x1a, 0xc3, 0x4c, 0x02, 0x2d, 0xff, 0xf8, + 0x02, 0x0a, 0x00, 0x09, 0x02, 0x2d, 0xff, 0xfa, 0x13, 0xf2, 0x06, 0x0a, 0x16, 0xfb, 0x04, 0x60, + 0xca, 0xb6, 0x07, 0x8f, 0x10, 0x00, 0xc2, 0xd9, 0x11, 0xfa, 0x16, 0x02, 0x07, 0x8b, 0x04, 0x00, + 0xc3, 0x4b, 0x02, 0x8d, 0x00, 0x20, 0x14, 0x02, 0x02, 0x0d, 0x00, 0x20, 0x02, 0x8d, 0x04, 0x00, + 0x12, 0x02, 0x02, 0x0d, 0x04, 0x00, 0x02, 0x2d, 0xff, 0xf8, 0xc8, 0x0d, 0x09, 0x2c, 0x02, 0x2b, + 0x03, 0xff, 0x01, 0x8b, 0x03, 0xff, 0xce, 0x4b, 0x04, 0xcb, 0x04, 0xe0, 0x05, 0xf8, 0x04, 0xe0, + 0x09, 0x66, 0xc8, 0x20, 0x0c, 0x30, 0x09, 0x80, 0x07, 0xa0, 0x09, 0x82, 0xdf, 0xfe, 0x07, 0x8d, + 0xdf, 0xfe, 0xc3, 0xe0, 0x07, 0xd8, 0x23, 0xe0, 0xe0, 0x16, 0x16, 0x24, 0xc3, 0xe0, 0x0c, 0x30, + 0x63, 0x4f, 0x04, 0xff, 0x04, 0xff, 0x06, 0x4d, 0x16, 0xfd, 0x07, 0x8d, 0xdf, 0xfe, 0x04, 0x20, + 0xea, 0x62, 0xc3, 0xa0, 0xea, 0x62, 0xc3, 0xee, 0x00, 0x12, 0x16, 0xc1, 0xc3, 0x6e, 0x00, 0x18, + 0x09, 0xad, 0x07, 0x8c, 0xe0, 0x00, 0x09, 0xac, 0x63, 0x0d, 0x13, 0x0c, 0xc3, 0x6e, 0x00, 0x18, + 0x09, 0xad, 0x02, 0x2d, 0x00, 0x40, 0x0a, 0x1d, 0x02, 0x2d, 0x0c, 0x32, 0x07, 0xbd, 0x7f, 0xff, + 0x06, 0x0c, 0x16, 0xfc, 0xc3, 0x20, 0x04, 0x46, 0x02, 0x8c, 0x00, 0x80, 0x1a, 0x13, 0x02, 0xac, + 0xc8, 0x0c, 0x00, 0x9a, 0x02, 0xe0, 0x00, 0x80, 0x07, 0x88, 0x00, 0x80, 0xc2, 0x60, 0x04, 0x46, + 0x06, 0xa0, 0xf4, 0xd2, 0x10, 0x02, 0x00, 0x9d, 0x10, 0x05, 0x00, 0x9d, 0x07, 0x8f, 0x08, 0x00, + 0x04, 0x60, 0xca, 0xb6, 0x2d, 0x4b, 0xc3, 0x81, 0x05, 0xc9, 0x07, 0x8f, 0x10, 0x00, 0x02, 0x8e, + 0x00, 0x02, 0x11, 0xf6, 0x07, 0x8f, 0x04, 0x00, 0x05, 0xc9, 0xc2, 0xd9, 0x26, 0xe0, 0xe0, 0x26, + 0x16, 0x02, 0x02, 0x2b, 0x00, 0x06, 0xc6, 0x4b, 0xc3, 0x4b, 0x72, 0xcb, 0x02, 0x2e, 0xff, 0xfe, + 0x83, 0x8b, 0x1b, 0xe6, 0x06, 0xcd, 0x73, 0x4d, 0x82, 0xcd, 0x1b, 0xe2, 0x04, 0xe0, 0x09, 0x1a, + 0x04, 0xe0, 0x09, 0x1c, 0xc3, 0x4d, 0x13, 0x02, 0x66, 0x60, 0xe0, 0x12, 0x05, 0xc9, 0x04, 0xcf, + 0x2d, 0x81, 0xc8, 0x01, 0x01, 0x6c, 0x13, 0xd4, 0xc8, 0x0f, 0xfc, 0x00, 0xc3, 0xc1, 0x06, 0x0d, + 0x15, 0xf7, 0x02, 0x0d, 0x07, 0x36, 0x02, 0x0e, 0x08, 0x98, 0x02, 0x0c, 0x00, 0x03, 0xcb, 0x8d, + 0x00, 0x02, 0x2d, 0x81, 0xcb, 0x81, 0x00, 0x06, 0x13, 0xc3, 0x04, 0xee, 0x00, 0x0c, 0x02, 0x2e, + 0x00, 0x18, 0x06, 0x0c, 0x16, 0xf4, 0x04, 0xe0, 0x08, 0x96, 0x2e, 0x1f, 0xc3, 0xb9, 0xc3, 0xd9, + 0x07, 0x89, 0x00, 0x12, 0x07, 0x8d, 0x09, 0x3a, 0x06, 0xa0, 0xcc, 0x24, 0xc3, 0x60, 0x07, 0xd8, + 0x23, 0x60, 0xe0, 0x16, 0x16, 0x09, 0xe8, 0x20, 0xe0, 0x10, 0x09, 0x6a, 0xe8, 0x20, 0xe0, 0x18, + 0x07, 0x98, 0xe8, 0x20, 0xe0, 0x12, 0x07, 0x78, 0xc3, 0x60, 0x09, 0x6a, 0x23, 0x60, 0xe0, 0x1e, + 0x16, 0x03, 0x48, 0x20, 0xe3, 0xa4, 0x09, 0x6a, 0x23, 0x60, 0xe0, 0x22, 0x13, 0x06, 0x27, 0x60, + 0xe3, 0xa6, 0x13, 0x03, 0xe8, 0x20, 0xe0, 0x10, 0x09, 0x6a, 0x2d, 0x20, 0x00, 0x00, 0x07, 0x8e, + 0x00, 0x00, 0x06, 0xa0, 0xcc, 0x04, 0x05, 0x4e, 0x2c, 0x0e, 0xc0, 0xa0, 0x08, 0x04, 0xc3, 0xef, + 0x00, 0x06, 0x16, 0x1b, 0xc3, 0xa0, 0x09, 0x72, 0xc3, 0xe0, 0x09, 0x74, 0x06, 0xa0, 0xca, 0xf2, + 0xc3, 0xa0, 0x09, 0x76, 0xc3, 0xe0, 0x09, 0x78, 0x06, 0xa0, 0xcb, 0x10, 0xe0, 0x20, 0xe0, 0x0a, + 0xc3, 0x60, 0x07, 0xd8, 0x23, 0x60, 0xe0, 0x16, 0x16, 0x05, 0x04, 0xe0, 0x06, 0x2e, 0x41, 0x60, + 0xe0, 0x04, 0x2e, 0x4d, 0x07, 0x8d, 0x80, 0x00, 0x04, 0x52, 0x73, 0xcf, 0x02, 0x2f, 0x02, 0x00, + 0xc3, 0x4f, 0x04, 0x52, 0x20, 0x20, 0xe0, 0x0a, 0x13, 0x03, 0x07, 0x8d, 0x10, 0x00, 0x04, 0x5b, + 0x40, 0x20, 0xe0, 0x0a, 0x02, 0x40, 0xf0, 0xff, 0x07, 0x8e, 0x00, 0x02, 0x06, 0xa0, 0xcc, 0x04, + 0x05, 0x4e, 0x2c, 0x0e, 0xc0, 0xa0, 0x08, 0x04, 0x06, 0xa0, 0xcb, 0xe4, 0xc3, 0x60, 0x07, 0xd8, + 0x23, 0x60, 0xe0, 0x16, 0x16, 0x66, 0x04, 0x20, 0xea, 0x76, 0x10, 0x63, 0x02, 0x6e, 0x80, 0x00, + 0x07, 0x8d, 0xc0, 0x00, 0xc8, 0x0d, 0x01, 0xa6, 0xc8, 0x0e, 0x09, 0x72, 0xc8, 0x0f, 0x09, 0x74, + 0xc8, 0x0e, 0x01, 0xa8, 0xc8, 0x0f, 0x01, 0xaa, 0x10, 0x12, 0x01, 0x8f, 0x00, 0x01, 0x07, 0x8a, + 0x09, 0x76, 0xe3, 0xa0, 0x09, 0x4e, 0xce, 0x8e, 0x01, 0x9a, 0xff, 0xfe, 0xe3, 0xe0, 0x09, 0x50, + 0xe6, 0x8f, 0x07, 0x8a, 0x01, 0xac, 0xce, 0x8e, 0x01, 0x9a, 0xff, 0xfe, 0xe6, 0x8f, 0x20, 0x20, + 0xe0, 0x0a, 0x13, 0x3f, 0x07, 0x8d, 0x10, 0x00, 0x04, 0x5b, 0x20, 0x20, 0xe0, 0x0a, 0x13, 0x03, + 0x02, 0x0d, 0x10, 0x00, 0x04, 0x5b, 0xc3, 0x8e, 0x13, 0x04, 0x01, 0xe0, 0x09, 0x50, 0x01, 0x00, + 0x10, 0x06, 0x01, 0xa0, 0x09, 0x50, 0x01, 0x00, 0x01, 0xa0, 0x09, 0x78, 0x01, 0x00, 0xc3, 0xa0, + 0x09, 0x76, 0xc3, 0xe0, 0x09, 0x78, 0xe3, 0xa0, 0x09, 0x4e, 0xe3, 0xe0, 0x09, 0x50, 0xc8, 0x0e, + 0x01, 0xac, 0xc8, 0x0f, 0x01, 0xae, 0xc8, 0x0e, 0x09, 0x76, 0xc8, 0x0f, 0x09, 0x78, 0x10, 0x19, + 0x02, 0x6e, 0x80, 0x00, 0xc8, 0x0e, 0x01, 0xa6, 0x20, 0x20, 0xe0, 0x0a, 0x13, 0x12, 0x02, 0x0d, + 0x10, 0x00, 0x04, 0x5b, 0x07, 0x8d, 0x07, 0x28, 0x07, 0x89, 0x00, 0x0e, 0x06, 0xa0, 0xcc, 0x2a, + 0x07, 0x8d, 0x07, 0x28, 0x04, 0xfd, 0x02, 0x8d, 0x07, 0x36, 0x16, 0xfc, 0x48, 0x20, 0xe0, 0x14, + 0x06, 0xfe, 0x07, 0x8d, 0x80, 0x00, 0x04, 0x52, 0xc2, 0xa0, 0x07, 0xee, 0x07, 0x8c, 0x00, 0x04, + 0x07, 0x8d, 0x08, 0xf0, 0x06, 0x97, 0xc2, 0x7d, 0xc3, 0x5d, 0x43, 0x60, 0xe0, 0x22, 0x06, 0xa0, + 0xcc, 0x2a, 0x10, 0xef, 0xc8, 0x0e, 0x06, 0x06, 0xc8, 0x0f, 0x06, 0x08, 0x10, 0xea, 0x03, 0xb0, + 0x01, 0xa0, 0x07, 0x60, 0x00, 0x26, 0x02, 0x40, 0xc0, 0x00, 0x04, 0xe0, 0x06, 0x06, 0x07, 0x8c, + 0x40, 0x10, 0x44, 0xcc, 0x04, 0xe0, 0x06, 0xfe, 0x07, 0x85, 0x80, 0x40, 0x04, 0x5b, 0xc8, 0x02, + 0x08, 0x04, 0x07, 0x8f, 0x07, 0xfa, 0xcb, 0xce, 0x00, 0x02, 0x07, 0x8e, 0x07, 0x36, 0xcb, 0xce, + 0x00, 0x04, 0x07, 0x8d, 0x06, 0x30, 0x07, 0x8e, 0x00, 0x10, 0x2c, 0x4d, 0x04, 0x5b, 0xc2, 0xa0, + 0x07, 0xf2, 0x10, 0x02, 0xc2, 0xa0, 0x07, 0xf8, 0xc8, 0x0b, 0x08, 0xea, 0xc3, 0x09, 0x13, 0x0a, + 0x06, 0xa0, 0xc7, 0x94, 0xc2, 0xa0, 0x01, 0x00, 0xe2, 0xa0, 0xe0, 0x06, 0xa3, 0x4c, 0xa3, 0xcc, + 0x17, 0x01, 0x05, 0x8e, 0x62, 0x4c, 0xc2, 0xe0, 0x08, 0xea, 0x04, 0x5b, 0x07, 0x8d, 0x10, 0x00, + 0x20, 0x20, 0xe0, 0x0a, 0x13, 0x01, 0x04, 0x5b, 0x02, 0x0d, 0x00, 0x6e, 0xc3, 0xe0, 0x09, 0x30, + 0x16, 0x02, 0x01, 0xce, 0x00, 0x10, 0x27, 0x8d, 0x13, 0x03, 0x02, 0x0d, 0x01, 0x00, 0x04, 0x52, + 0x03, 0x00, 0x00, 0x02, 0xc3, 0x60, 0x09, 0x6a, 0x02, 0x4d, 0x80, 0x08, 0x02, 0x4e, 0x7f, 0xf7, + 0xe3, 0x8d, 0xc3, 0xe0, 0x07, 0xd8, 0x23, 0xe0, 0xe0, 0x16, 0x13, 0x04, 0x07, 0x8d, 0x00, 0x06, + 0x27, 0x8d, 0x13, 0x02, 0xe3, 0xa0, 0xe0, 0x10, 0xc8, 0x0e, 0x09, 0x6a, 0x02, 0x0d, 0x12, 0x00, + 0x01, 0x4e, 0x00, 0x10, 0x13, 0x02, 0x02, 0x0d, 0x13, 0x00, 0xd8, 0x0d, 0x09, 0x2e, 0xc3, 0x60, + 0x01, 0x80, 0x02, 0x4e, 0x00, 0x01, 0x02, 0x4d, 0xff, 0xfe, 0xe3, 0x4e, 0xc8, 0x0d, 0x01, 0x80, + 0xd8, 0x20, 0xe2, 0x40, 0x09, 0x2f, 0x01, 0x20, 0x09, 0x6a, 0x00, 0x06, 0x13, 0x03, 0xd8, 0x20, + 0xe1, 0xd0, 0x09, 0x2f, 0x98, 0x20, 0x01, 0x83, 0xe2, 0x00, 0x13, 0x03, 0xd8, 0x20, 0x09, 0x2f, + 0x01, 0x83, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60, 0xcb, 0xb8, 0x20, 0x20, 0xe0, 0x0a, 0x13, 0x03, + 0x02, 0x0d, 0x10, 0x00, 0x04, 0x5b, 0x02, 0x09, 0x00, 0x08, 0x02, 0x0d, 0x09, 0x58, 0x06, 0xa0, + 0xcc, 0x24, 0x07, 0xa0, 0x02, 0x02, 0x00, 0x00, 0x02, 0x0d, 0x04, 0x00, 0xc3, 0xe0, 0x09, 0x58, + 0x01, 0x0f, 0x7c, 0x00, 0x13, 0x01, 0x04, 0x52, 0xc3, 0x8f, 0x02, 0x4e, 0x00, 0x0f, 0x13, 0xfb, + 0x02, 0x8e, 0x00, 0x0f, 0x13, 0xf8, 0x02, 0x0d, 0x40, 0x00, 0xc2, 0x4f, 0x09, 0x49, 0x02, 0x49, + 0x00, 0x3f, 0x01, 0x09, 0x00, 0x01, 0x16, 0xef, 0x02, 0x89, 0x00, 0x06, 0x1a, 0xec, 0x02, 0x89, + 0x00, 0x20, 0x14, 0xe9, 0x06, 0xc9, 0x09, 0x1f, 0x02, 0x4f, 0x40, 0x00, 0xe2, 0x4f, 0x02, 0x69, + 0x80, 0x00, 0xc8, 0x09, 0x09, 0x58, 0x02, 0x0f, 0xff, 0xff, 0xc2, 0x4e, 0x09, 0x1f, 0x06, 0x09, + 0x16, 0xfd, 0x05, 0x4f, 0x02, 0x0d, 0x20, 0x00, 0xc2, 0x60, 0x09, 0x5a, 0x13, 0xd4, 0x26, 0x4f, + 0x16, 0xd2, 0x02, 0x0d, 0x10, 0x00, 0xc2, 0x60, 0x09, 0x5c, 0x13, 0xcd, 0x26, 0x4f, 0x16, 0xcb, + 0x02, 0x0d, 0x30, 0x00, 0x88, 0x20, 0x09, 0x5a, 0x09, 0x5c, 0x13, 0xc5, 0xc3, 0xe0, 0x09, 0x5a, + 0xc2, 0x4e, 0x0a, 0x1f, 0x06, 0x09, 0x16, 0xfd, 0xe3, 0xe0, 0x09, 0x5e, 0xc8, 0x0f, 0x09, 0x5a, + 0xc3, 0xe0, 0x09, 0x5c, 0xc2, 0x4e, 0x0a, 0x1f, 0x06, 0x09, 0x16, 0xfd, 0xe3, 0xe0, 0x09, 0x5e, + 0xc8, 0x0f, 0x09, 0x5c, 0x02, 0x0f, 0xff, 0xff, 0xc2, 0x4e, 0x0a, 0x1f, 0x06, 0x09, 0x16, 0xfd, + 0x02, 0x0d, 0x08, 0x00, 0xc2, 0x60, 0x09, 0x5e, 0x26, 0x4f, 0x16, 0xa5, 0x05, 0x4f, 0xc8, 0x0f, + 0x09, 0x5e, 0x02, 0x0f, 0x02, 0x02, 0x02, 0x0e, 0x00, 0x03, 0xc3, 0x60, 0x01, 0x40, 0x02, 0x0c, + 0xce, 0x26, 0x01, 0xa0, 0x01, 0x40, 0x04, 0x00, 0x05, 0xcf, 0x02, 0x09, 0x55, 0x55, 0x06, 0x9c, + 0x05, 0x49, 0x06, 0x9c, 0x07, 0x09, 0x06, 0x9c, 0x05, 0x49, 0x06, 0x9c, 0x06, 0x0e, 0x16, 0xf4, + 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0xc8, 0x0d, 0x01, 0x40, 0x02, 0x09, 0x00, 0x08, 0x02, 0x0e, + 0x09, 0x58, 0x02, 0x0f, 0x02, 0x02, 0xcf, 0xfe, 0x06, 0x49, 0x16, 0xfd, 0x04, 0x60, 0xcb, 0xb8, + 0xc7, 0xc9, 0x82, 0x5f, 0x16, 0x01, 0x04, 0x5b, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0xc8, 0x0d, + 0x01, 0x40, 0x02, 0x0d, 0x01, 0x00, 0x04, 0x52, 0x00, 0x00, 0xd8, 0xee, 0x00, 0x92, 0xc2, 0xad, + 0x00, 0x02, 0xc2, 0x6d, 0x00, 0x00, 0x16, 0x05, 0x07, 0xaa, 0x00, 0x02, 0x07, 0x36, 0x2c, 0x9a, + 0x03, 0x80, 0x2c, 0xea, 0x00, 0x02, 0xcb, 0x41, 0x00, 0x00, 0x03, 0x80, 0xc3, 0x2d, 0x00, 0x18, + 0x07, 0xac, 0x00, 0x02, 0x07, 0x36, 0x4b, 0x20, 0xea, 0xa6, 0x00, 0x0a, 0xeb, 0x20, 0xea, 0xa0, + 0x00, 0x0a, 0x2e, 0x9c, 0x03, 0x80, 0xc2, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0xb3, 0x8a, 0xc0, 0xed, + 0x00, 0x18, 0x06, 0xa0, 0xd9, 0x5e, 0x03, 0x80, 0xc2, 0x44, 0xc0, 0xc3, 0x13, 0x02, 0x06, 0xa0, + 0xd9, 0x5e, 0xc3, 0x19, 0xcb, 0x09, 0x00, 0x18, 0x05, 0xc9, 0xcb, 0x19, 0x00, 0x16, 0xc2, 0x4c, + 0x02, 0x2c, 0x00, 0x1a, 0xcf, 0x0d, 0xcf, 0x0e, 0xc7, 0x0f, 0x00, 0x99, 0x04, 0x5b, 0x07, 0x8c, + 0x09, 0x0a, 0xc2, 0x9c, 0x22, 0xa0, 0xe0, 0x14, 0x13, 0x06, 0xc2, 0xa0, 0x07, 0x58, 0x22, 0xa0, + 0xe0, 0x20, 0x16, 0x01, 0x03, 0x80, 0xc1, 0x03, 0x04, 0xc3, 0x07, 0x8a, 0x00, 0x04, 0xa2, 0x84, + 0x00, 0x00, 0xd9, 0x80, 0x00, 0x0b, 0xcf, 0x3a, 0x00, 0x00, 0xd9, 0x8a, 0x00, 0xb2, 0x02, 0xe0, + 0x07, 0x58, 0x07, 0x8d, 0x09, 0x0a, 0xc8, 0x0b, 0x07, 0xc2, 0x06, 0xa0, 0xc5, 0xa2, 0xc2, 0xe0, + 0x07, 0xc2, 0xe0, 0x20, 0xe0, 0x20, 0x02, 0xe0, 0x07, 0xb8, 0x04, 0x5b, 0xc3, 0x2d, 0x00, 0x18, + 0xc2, 0x8c, 0xc2, 0x60, 0x01, 0x6c, 0xc8, 0x0a, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x00, 0x13, 0x02, + 0xc2, 0x8b, 0x10, 0xf9, 0xc8, 0x09, 0x01, 0x6c, 0x07, 0x8b, 0x05, 0xf8, 0xc2, 0x5b, 0x13, 0x0c, + 0x05, 0xcb, 0xc2, 0x5b, 0xc6, 0xca, 0xc2, 0xe0, 0x01, 0x6c, 0xc8, 0x09, 0x01, 0x6c, 0xc8, 0x0c, + 0xfc, 0x00, 0xc8, 0x0b, 0x01, 0x6c, 0x10, 0x02, 0xce, 0xcc, 0xc6, 0xca, 0xc2, 0xa0, 0x00, 0xe0, + 0x22, 0xa0, 0xe0, 0x1a, 0x16, 0x06, 0xe8, 0x20, 0xe0, 0x04, 0x07, 0x3a, 0x48, 0x20, 0xe0, 0x1a, + 0x00, 0xe0, 0x03, 0x80, 0xd3, 0xe0, 0xe3, 0xab, 0xc1, 0xe0, 0x06, 0xa8, 0x16, 0x05, 0x02, 0x07, + 0x06, 0xa2, 0x06, 0xa0, 0xc2, 0x96, 0x16, 0x0b, 0xc1, 0xe0, 0x06, 0xba, 0x16, 0x20, 0x02, 0x07, + 0x06, 0xb4, 0x06, 0xa0, 0xc2, 0x96, 0x13, 0x1b, 0x02, 0x07, 0x06, 0xb8, 0x10, 0x02, 0x02, 0x07, + 0x06, 0xa6, 0xc1, 0x60, 0xfc, 0x02, 0xc8, 0x25, 0x00, 0x0c, 0xfc, 0x02, 0xc9, 0xc5, 0x00, 0x0c, + 0x00, 0x00, 0xda, 0x3c, 0x00, 0x0b, 0xcd, 0xf5, 0x00, 0x00, 0xda, 0x46, 0x19, 0x3a, 0xc5, 0xf5, + 0x01, 0xb7, 0x00, 0x28, 0x02, 0x27, 0xff, 0xf4, 0x07, 0xa7, 0x00, 0x04, 0xdb, 0x48, 0x2e, 0x97, + 0x10, 0xd5, 0x03, 0x00, 0x00, 0x02, 0x06, 0xa0, 0xc2, 0xae, 0x03, 0x00, 0x00, 0x0f, 0x2c, 0x20, + 0xed, 0x48, 0x93, 0xe0, 0xe3, 0xab, 0x16, 0x03, 0x02, 0x81, 0x00, 0x16, 0x16, 0xc7, 0xc1, 0x21, + 0xea, 0xb0, 0x04, 0x54, 0x93, 0xe0, 0xe0, 0x10, 0x16, 0x03, 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0x0b, + 0xd3, 0xcf, 0x16, 0x09, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x06, 0x07, 0x84, 0x00, 0x20, 0xe8, 0x04, + 0x06, 0xd2, 0xd2, 0xa0, 0xe0, 0x0c, 0x04, 0x60, 0xdb, 0xc0, 0x04, 0x60, 0xde, 0x34, 0x10, 0x7b, + 0xc1, 0x22, 0x00, 0x04, 0x04, 0xe2, 0x00, 0x02, 0x04, 0x54, 0xc8, 0x02, 0x01, 0x6c, 0xa0, 0x82, + 0xc8, 0x22, 0x0c, 0x32, 0xfc, 0x00, 0x02, 0x02, 0xfc, 0x00, 0x93, 0xe0, 0xe3, 0xaa, 0x13, 0x70, + 0x06, 0xa0, 0xdc, 0xc6, 0x48, 0xa0, 0xe0, 0x04, 0x00, 0x0e, 0x02, 0x85, 0x00, 0x07, 0x13, 0x0e, + 0x01, 0x0e, 0x00, 0x03, 0x13, 0x0b, 0x23, 0xa0, 0xe0, 0x22, 0x16, 0x03, 0xd2, 0xa0, 0xe0, 0x0e, + 0x10, 0x02, 0xd2, 0xa0, 0xe3, 0xa8, 0x01, 0x8e, 0x00, 0x03, 0x10, 0x5a, 0xc8, 0x05, 0x06, 0xfc, + 0xc0, 0xc3, 0x16, 0x53, 0x43, 0xa0, 0xe0, 0x10, 0x88, 0x22, 0x00, 0x0e, 0x09, 0x6c, 0x16, 0x0a, + 0x88, 0x22, 0x00, 0x10, 0x09, 0x6e, 0x16, 0x06, 0x88, 0x22, 0x00, 0x12, 0x09, 0x70, 0x16, 0x02, + 0xe3, 0xa0, 0xe0, 0x10, 0x02, 0x85, 0x00, 0x09, 0x13, 0x02, 0x06, 0xa0, 0xe2, 0xe4, 0xa1, 0x45, + 0xc1, 0x65, 0xe3, 0xac, 0x04, 0x55, 0xc0, 0x62, 0x00, 0x04, 0xc8, 0x22, 0x00, 0x06, 0x01, 0x6c, + 0x02, 0x82, 0x04, 0x48, 0x1b, 0x02, 0x43, 0xa0, 0xe0, 0x0c, 0xc1, 0x22, 0x00, 0x0e, 0x04, 0x51, + 0xc0, 0x42, 0x04, 0xe1, 0x00, 0x02, 0xc0, 0xa2, 0x00, 0x0c, 0xc1, 0x22, 0x00, 0x0a, 0x21, 0x20, + 0xe0, 0x18, 0x13, 0x07, 0xc8, 0xa1, 0x00, 0x0a, 0x00, 0x0a, 0xc8, 0xa1, 0x00, 0x08, 0x00, 0x08, + 0x10, 0xe2, 0xc8, 0x22, 0x00, 0x06, 0x01, 0x6c, 0x06, 0xa0, 0xe1, 0xa2, 0x04, 0x60, 0xdb, 0x9e, + 0xc8, 0x02, 0x06, 0xd4, 0xc1, 0x62, 0x00, 0x02, 0xc1, 0x65, 0xe3, 0xce, 0x04, 0x55, 0x10, 0x0b, + 0x07, 0x85, 0x03, 0xf4, 0x04, 0xf5, 0xcd, 0x60, 0xed, 0x26, 0x06, 0xa0, 0xe3, 0xce, 0xe3, 0xa0, + 0xe0, 0x0c, 0x2e, 0xa0, 0x03, 0xf4, 0x04, 0x60, 0xda, 0x04, 0x06, 0xa0, 0xe0, 0x6e, 0x10, 0x0c, + 0x06, 0xa0, 0xe1, 0xa2, 0x10, 0x09, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x06, 0x06, 0xa0, 0xe1, 0xa2, + 0xc8, 0x03, 0x09, 0x2a, 0xd2, 0xa0, 0xe3, 0xaa, 0x06, 0xa0, 0xdc, 0x32, 0x92, 0xa0, 0xe0, 0x26, + 0x16, 0x0c, 0xd3, 0xe0, 0xe0, 0x26, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x0a, 0xc1, 0x0a, 0x83, 0xc4, + 0x13, 0x07, 0xc3, 0xc4, 0xc1, 0x24, 0xe3, 0xd2, 0x04, 0x54, 0x93, 0xca, 0x13, 0xdc, 0xd3, 0xca, + 0x03, 0xb0, 0xd8, 0x0f, 0x06, 0x59, 0x71, 0x04, 0xc1, 0x24, 0xe3, 0xde, 0x04, 0x54, 0x23, 0xa0, + 0xe0, 0x0c, 0x13, 0xd1, 0xc3, 0x4d, 0x13, 0xcf, 0x07, 0x86, 0x00, 0x02, 0x07, 0x84, 0x00, 0x26, + 0x23, 0x46, 0x13, 0x03, 0x06, 0x44, 0xa1, 0x86, 0x10, 0xfb, 0x43, 0x46, 0x10, 0xb9, 0x07, 0x85, + 0x07, 0x1c, 0x07, 0x86, 0x04, 0x1a, 0x6d, 0x76, 0x6d, 0x76, 0x6d, 0x76, 0x05, 0xc6, 0x6d, 0x76, + 0x6d, 0x76, 0x6d, 0x76, 0x07, 0x83, 0x90, 0x00, 0x10, 0xbe, 0xc3, 0x0b, 0x07, 0x86, 0x01, 0x00, + 0x07, 0x85, 0x80, 0x00, 0xc1, 0x20, 0x06, 0xd2, 0x13, 0x37, 0x04, 0xc4, 0xc0, 0x60, 0x06, 0xd2, + 0x20, 0x45, 0x13, 0x04, 0x05, 0x84, 0x09, 0x15, 0x16, 0xf9, 0x10, 0x2e, 0xd3, 0xcf, 0x16, 0x06, + 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x03, 0x01, 0x0e, 0x00, 0x03, 0x13, 0x03, 0x04, 0xe0, 0x06, 0xd2, + 0x10, 0x23, 0xd0, 0x64, 0x07, 0x1c, 0xb0, 0x46, 0x18, 0x10, 0xd9, 0x01, 0x07, 0x1c, 0x23, 0x60, + 0xe0, 0x20, 0x13, 0x0b, 0x07, 0x81, 0x00, 0x18, 0xc0, 0x61, 0xe3, 0xee, 0x88, 0x11, 0xed, 0x26, + 0x13, 0x04, 0x02, 0x08, 0x80, 0x18, 0x06, 0xa0, 0xe0, 0x22, 0xd0, 0x64, 0x07, 0x28, 0xb0, 0x46, + 0x18, 0x08, 0xd9, 0x01, 0x07, 0x28, 0xb0, 0x46, 0x17, 0x04, 0x07, 0x83, 0x80, 0x40, 0x06, 0xa0, + 0xe3, 0x56, 0x48, 0x05, 0x06, 0xd2, 0x16, 0xca, 0xc1, 0x20, 0x09, 0x32, 0x16, 0x01, 0x04, 0x5c, + 0x02, 0x04, 0x00, 0x07, 0x06, 0x20, 0x09, 0x32, 0x02, 0x05, 0x01, 0x00, 0x10, 0xc7, 0xc3, 0x0b, + 0x04, 0xc5, 0xc0, 0x42, 0x04, 0xc7, 0xc2, 0x20, 0x01, 0x6c, 0xa1, 0xe1, 0x00, 0x04, 0xc8, 0x11, + 0x01, 0x6c, 0x16, 0xfb, 0xc8, 0x08, 0x01, 0x6c, 0x04, 0xc8, 0x43, 0xa0, 0xe0, 0x1a, 0xc1, 0x22, + 0x00, 0x0e, 0x15, 0x0d, 0x13, 0x0c, 0xe3, 0xa0, 0xe0, 0x1a, 0x06, 0xa0, 0xe3, 0x40, 0xc2, 0x08, + 0x13, 0x48, 0x02, 0x88, 0x00, 0x12, 0x1b, 0x45, 0x22, 0x20, 0xe0, 0x22, 0x13, 0x42, 0xc1, 0x02, + 0xa1, 0x08, 0x05, 0x08, 0x02, 0x28, 0xff, 0xf2, 0xa2, 0x07, 0x07, 0x83, 0x80, 0x01, 0x02, 0x88, + 0x00, 0x04, 0x11, 0x6e, 0xc2, 0x64, 0x00, 0x16, 0xd2, 0x49, 0x16, 0x02, 0x81, 0x02, 0x16, 0x31, + 0x01, 0x09, 0xf0, 0x00, 0x16, 0x28, 0xc1, 0x49, 0x71, 0x45, 0x04, 0xc3, 0x02, 0x85, 0x00, 0x09, + 0x13, 0x7c, 0x07, 0x83, 0x80, 0x02, 0xc1, 0xa4, 0x00, 0x14, 0x81, 0x88, 0x16, 0x76, 0x05, 0x83, + 0x02, 0x85, 0x00, 0x10, 0x1b, 0x13, 0x05, 0x83, 0x99, 0x49, 0xea, 0xd0, 0x13, 0x0a, 0x98, 0x09, + 0xe0, 0x0e, 0x16, 0x6b, 0x98, 0x25, 0xea, 0xd0, 0xe0, 0x0c, 0x16, 0x67, 0xc1, 0xe0, 0x06, 0xec, + 0x16, 0x64, 0x04, 0xc3, 0xc2, 0x52, 0x13, 0x0f, 0x07, 0x83, 0x80, 0x09, 0xc1, 0xe0, 0x09, 0x6a, + 0x01, 0x47, 0x10, 0x00, 0x16, 0x5a, 0xc0, 0xa0, 0x01, 0x6c, 0x06, 0xa0, 0xe1, 0xfa, 0x04, 0x60, + 0xdb, 0x9e, 0x04, 0x60, 0xdb, 0xa8, 0x07, 0x89, 0x07, 0x0e, 0x04, 0xc7, 0xd1, 0xe5, 0xea, 0xe1, + 0x13, 0x05, 0x06, 0xc7, 0x02, 0x27, 0xea, 0xf2, 0xce, 0x77, 0x15, 0xfe, 0xc0, 0x44, 0x02, 0x21, + 0x00, 0x18, 0x02, 0x28, 0xff, 0xfc, 0x13, 0x36, 0xc1, 0x91, 0xd1, 0x86, 0x13, 0x1f, 0x06, 0xc6, + 0x07, 0x87, 0x07, 0x0e, 0xc0, 0xf7, 0x02, 0x46, 0xbf, 0xff, 0x02, 0x43, 0x3f, 0xff, 0x91, 0xa0, + 0xed, 0x4d, 0x16, 0x09, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x0e, 0x06, 0x5d, 0x16, 0x0f, 0xc8, 0x21, + 0x00, 0x02, 0x07, 0x0c, 0x10, 0x17, 0x82, 0x47, 0x1b, 0x0c, 0x90, 0xc6, 0x16, 0xeb, 0x06, 0x47, + 0x04, 0xf7, 0x03, 0xb0, 0x98, 0x20, 0x06, 0x5d, 0x06, 0x57, 0x13, 0x0c, 0x07, 0x83, 0x80, 0x05, + 0x10, 0x1c, 0xc0, 0xd1, 0x20, 0xe0, 0xe0, 0x16, 0x16, 0x03, 0x07, 0x83, 0x80, 0x08, 0x10, 0x15, + 0x44, 0x60, 0xe0, 0x26, 0x71, 0x86, 0xa0, 0x46, 0x62, 0x06, 0x07, 0x83, 0x80, 0x05, 0xc2, 0x08, + 0x15, 0xcb, 0x16, 0x0b, 0x04, 0xc3, 0x07, 0x87, 0x07, 0x0e, 0xc0, 0x77, 0x82, 0x47, 0x1b, 0x05, + 0x20, 0x60, 0xe0, 0x06, 0x16, 0xfa, 0x07, 0x83, 0x80, 0x07, 0x04, 0x5c, 0x92, 0xa0, 0xe0, 0x0e, + 0x16, 0x11, 0xc8, 0x20, 0xe0, 0x20, 0x07, 0x08, 0x04, 0xe0, 0x01, 0x84, 0x05, 0x60, 0x07, 0x02, + 0x13, 0x3f, 0x48, 0x20, 0xe0, 0x06, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18, 0x07, 0x83, 0xc0, 0x00, + 0x06, 0xa0, 0xe3, 0x56, 0xc8, 0x20, 0xe0, 0x1e, 0x07, 0x02, 0xe3, 0xa0, 0xe0, 0x04, 0x02, 0x08, + 0x80, 0x24, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x36, 0xc1, 0x20, 0x01, 0x84, 0x02, 0x44, 0x88, 0x00, + 0x13, 0x1e, 0x48, 0x04, 0x01, 0x84, 0x06, 0x20, 0x07, 0x02, 0x16, 0xf1, 0x23, 0xa0, 0xe0, 0x22, + 0x16, 0x05, 0x43, 0xa0, 0xe0, 0x22, 0xd2, 0xa0, 0xe0, 0x0e, 0x10, 0xd3, 0x23, 0xe0, 0xe0, 0x14, + 0x13, 0x04, 0x98, 0x20, 0xe3, 0xa9, 0x06, 0x65, 0x16, 0x06, 0x92, 0xa0, 0xe0, 0x0e, 0x13, 0xc9, + 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0xd7, 0x07, 0x83, 0x00, 0x02, 0x04, 0x60, 0xdb, 0xb8, 0xe8, 0x20, + 0xe0, 0x06, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18, 0x07, 0x20, 0x07, 0x02, 0x43, 0xa0, 0xe0, 0x04, + 0xc8, 0x20, 0xe4, 0x6e, 0x01, 0x86, 0x88, 0x20, 0xe0, 0x20, 0x07, 0x08, 0x16, 0x03, 0xc8, 0x20, + 0xeb, 0x0a, 0x07, 0x08, 0x04, 0x60, 0xdb, 0xc0, 0x01, 0x0e, 0x00, 0x03, 0x13, 0x16, 0xd3, 0xcf, + 0x16, 0x08, 0x23, 0xa0, 0xe0, 0x20, 0x16, 0x03, 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0x02, 0xd2, 0xa0, + 0xe0, 0x0e, 0x01, 0x8e, 0x00, 0x03, 0x10, 0x09, 0xc1, 0x60, 0x01, 0x84, 0x21, 0x60, 0xe0, 0x0a, + 0x16, 0x04, 0x07, 0x83, 0x84, 0x00, 0x04, 0x60, 0xdb, 0xb8, 0xc8, 0x20, 0xe0, 0x2e, 0x01, 0x84, + 0x02, 0x08, 0x80, 0x06, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0xdb, 0xc0, 0xe3, 0x60, 0xe0, 0x20, + 0x04, 0x60, 0xdb, 0xc0, 0x93, 0xe0, 0xe0, 0x26, 0x16, 0x10, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x0d, + 0x23, 0xa0, 0xe0, 0x06, 0x13, 0x02, 0xe3, 0x60, 0xe0, 0x1c, 0xe3, 0x60, 0xe0, 0x18, 0x43, 0xa0, + 0xe0, 0x06, 0x02, 0x08, 0x80, 0x3c, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0xdb, 0xc0, 0x92, 0xa0, + 0xe3, 0xa8, 0x13, 0x03, 0x92, 0xa0, 0xe3, 0xa9, 0x16, 0x1e, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x08, + 0x98, 0x20, 0xe3, 0xa9, 0x06, 0x65, 0x13, 0x04, 0x07, 0x83, 0x00, 0x07, 0x04, 0x60, 0xdb, 0xb8, + 0xd2, 0xa0, 0xe0, 0x0e, 0xc8, 0x20, 0xe0, 0x20, 0x07, 0x08, 0x27, 0xa0, 0xe0, 0x04, 0x16, 0x0b, + 0xc8, 0x20, 0xe0, 0x1e, 0x07, 0x08, 0x93, 0xe0, 0xe3, 0xa8, 0x16, 0x05, 0x23, 0xa0, 0xe0, 0x12, + 0x13, 0x02, 0x06, 0x20, 0x07, 0x08, 0x04, 0x60, 0xdb, 0xc0, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x36, + 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x0e, 0x06, 0x6f, 0x16, 0x0f, 0xd3, 0xcf, 0x16, 0x2f, 0xd2, 0xa0, + 0xe3, 0xa8, 0x04, 0x60, 0xdb, 0xc0, 0x92, 0xa0, 0xe0, 0x0c, 0x16, 0x28, 0x23, 0xe0, 0xe0, 0x14, + 0x13, 0xf6, 0x07, 0x83, 0x00, 0x06, 0x10, 0x07, 0x07, 0x83, 0x00, 0x05, 0x93, 0xe0, 0xe0, 0x0e, + 0x16, 0x02, 0x07, 0x83, 0x00, 0x07, 0x04, 0x60, 0xdb, 0xb8, 0xe3, 0x60, 0xe0, 0x12, 0x23, 0xe0, + 0xe0, 0x14, 0x13, 0x0d, 0x98, 0x20, 0xe0, 0x0c, 0x06, 0x65, 0x16, 0x03, 0xd8, 0x20, 0xe3, 0xa9, + 0x06, 0x65, 0x10, 0x0c, 0xc1, 0x20, 0x01, 0x84, 0x21, 0x20, 0xe0, 0x06, 0x16, 0xd6, 0x48, 0x20, + 0xe0, 0x06, 0x01, 0x84, 0x02, 0x08, 0x80, 0x30, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0xdb, 0xc0, + 0x02, 0x04, 0x00, 0x64, 0x06, 0x04, 0x16, 0xfe, 0x04, 0x5b, 0xe3, 0xa0, 0xe0, 0x0a, 0xc2, 0x08, + 0x11, 0x02, 0x43, 0xa0, 0xe0, 0x0a, 0x42, 0x20, 0xe0, 0x04, 0x02, 0x28, 0xe3, 0xee, 0xc0, 0x58, + 0xc0, 0x02, 0x88, 0x11, 0xed, 0x26, 0x16, 0x03, 0x2c, 0xd1, 0xc0, 0x58, 0x04, 0xd1, 0xc0, 0x80, + 0x01, 0x0e, 0x10, 0x00, 0x13, 0x0f, 0xcc, 0x60, 0xed, 0x26, 0x05, 0xc8, 0xcc, 0x78, 0x16, 0x03, + 0x06, 0x41, 0xcc, 0x60, 0x06, 0xd6, 0xc4, 0x58, 0x16, 0x02, 0xc4, 0x60, 0x07, 0x00, 0x02, 0x21, + 0xff, 0xfa, 0x2c, 0x91, 0x04, 0x5b, 0xc3, 0x0b, 0x06, 0xa0, 0xe1, 0x0a, 0x06, 0xa0, 0xe0, 0xe4, + 0xc2, 0x08, 0x16, 0x05, 0xc2, 0x62, 0x00, 0x02, 0x26, 0x60, 0xe4, 0x68, 0x16, 0x0d, 0xc2, 0x42, + 0x05, 0xc9, 0xce, 0x60, 0xed, 0x4a, 0xc6, 0x60, 0xeb, 0x0c, 0x06, 0xa0, 0xe1, 0x4c, 0xca, 0x18, + 0x00, 0x0a, 0x46, 0x20, 0xe0, 0x26, 0x16, 0x04, 0xc0, 0xa0, 0x01, 0x6c, 0x2e, 0x12, 0x10, 0x1d, + 0xc1, 0x12, 0x13, 0x05, 0xc1, 0x60, 0x01, 0x6c, 0x2e, 0x14, 0xc8, 0x05, 0x01, 0x6c, 0x04, 0xd2, + 0x06, 0x48, 0x07, 0x84, 0x00, 0x02, 0xc1, 0x48, 0xc0, 0xa0, 0x01, 0x6c, 0xc0, 0x02, 0x06, 0xa0, + 0xe3, 0xce, 0xc5, 0x60, 0xfc, 0x02, 0x02, 0x07, 0x06, 0xa2, 0x02, 0x25, 0xff, 0xf4, 0xc8, 0x05, + 0xfc, 0x02, 0xc2, 0x20, 0x01, 0x6c, 0x06, 0xa0, 0xc2, 0x5a, 0x04, 0x5c, 0xc2, 0x42, 0x02, 0x29, + 0x00, 0x08, 0xc2, 0x39, 0x02, 0x48, 0xc0, 0x00, 0x02, 0x88, 0xc0, 0x00, 0x16, 0x08, 0x8e, 0x60, + 0xe0, 0x2e, 0x16, 0x05, 0x86, 0x60, 0xe0, 0x2e, 0x16, 0x02, 0x04, 0xc8, 0x04, 0x5b, 0x07, 0x08, + 0x04, 0x5b, 0x88, 0x20, 0xe1, 0x8e, 0x01, 0x6c, 0x16, 0x02, 0x04, 0x60, 0xdb, 0xa8, 0x04, 0x5b, + 0x07, 0x88, 0x01, 0xae, 0xe8, 0x20, 0xe0, 0x0e, 0x01, 0x80, 0x06, 0x08, 0x16, 0xfe, 0x48, 0x20, + 0xe0, 0x0e, 0x01, 0x80, 0x04, 0x5b, 0x04, 0xc2, 0x23, 0xa0, 0xe0, 0x0c, 0x16, 0x0a, 0x2f, 0x20, + 0x06, 0x30, 0x07, 0x82, 0xff, 0xdf, 0x2c, 0x02, 0x02, 0x82, 0x03, 0xf4, 0x16, 0xfa, 0x43, 0xa0, + 0xe0, 0x0c, 0x04, 0x5b, 0xc2, 0x42, 0x07, 0x88, 0x00, 0x0e, 0xa2, 0x09, 0x02, 0x29, 0x00, 0x08, + 0xce, 0x78, 0xce, 0x78, 0xce, 0x78, 0xce, 0x60, 0x09, 0x6c, 0xce, 0x60, 0x09, 0x6e, 0xce, 0x60, + 0x09, 0x70, 0x23, 0xa0, 0xe0, 0x1a, 0x16, 0x0f, 0xc2, 0x58, 0x02, 0x49, 0x1f, 0x80, 0x2a, 0x60, + 0xe0, 0x14, 0xe8, 0xa0, 0xe0, 0x04, 0x00, 0x0e, 0xc6, 0x09, 0x02, 0x49, 0x1f, 0x00, 0x06, 0xc9, + 0xa2, 0x09, 0xa8, 0x89, 0x00, 0x04, 0x02, 0x28, 0x00, 0x02, 0xc2, 0x58, 0x0a, 0x49, 0x02, 0x49, + 0xf0, 0x00, 0xd6, 0x09, 0x04, 0xe2, 0x00, 0x06, 0x04, 0x5b, 0x07, 0x00, 0xc0, 0x82, 0x13, 0x53, + 0xc0, 0xa0, 0x01, 0x6c, 0xc1, 0xa0, 0xfc, 0x06, 0x02, 0x46, 0x00, 0x0f, 0x02, 0x86, 0x00, 0x01, + 0x12, 0x3d, 0x88, 0x06, 0x06, 0xf2, 0x16, 0x12, 0x02, 0x01, 0xfc, 0x0e, 0x88, 0x31, 0x06, 0xf4, + 0x16, 0x0d, 0x88, 0x31, 0x06, 0xf6, 0x16, 0x0a, 0x88, 0x31, 0x06, 0xf8, 0x16, 0x07, 0x02, 0x86, + 0x00, 0x02, 0x16, 0x2c, 0x88, 0x20, 0x07, 0x0a, 0x06, 0xfa, 0x13, 0x28, 0xc1, 0x20, 0x09, 0x6a, + 0x01, 0x44, 0x08, 0x00, 0x13, 0x06, 0x02, 0x86, 0x00, 0x02, 0x16, 0x20, 0x01, 0x44, 0x00, 0x80, + 0x16, 0x1d, 0x07, 0x00, 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x19, 0x02, 0x82, 0x00, 0x43, 0x13, 0x16, + 0x02, 0x00, 0xfc, 0x02, 0xc0, 0x40, 0x01, 0xb0, 0x00, 0x20, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x01, + 0x16, 0x07, 0xa0, 0x60, 0x09, 0x2c, 0xcc, 0x60, 0x05, 0xee, 0xc4, 0x50, 0xc4, 0x20, 0x09, 0x2c, + 0x07, 0x80, 0x07, 0x36, 0x07, 0x81, 0x00, 0x40, 0x2c, 0x40, 0x04, 0xc0, 0x07, 0x84, 0x06, 0xf2, + 0xcd, 0x06, 0x02, 0x01, 0xfc, 0x0e, 0xcd, 0x31, 0xcd, 0x31, 0xcd, 0x31, 0xc5, 0x20, 0x07, 0x0a, + 0xc0, 0x00, 0x13, 0x01, 0x2e, 0x12, 0x04, 0xe0, 0x01, 0x6c, 0x04, 0x5b, 0xc8, 0x0b, 0x09, 0x22, + 0x06, 0xa0, 0xe2, 0x72, 0x02, 0x08, 0x80, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0x80, 0x30, + 0x06, 0xa0, 0xe0, 0x22, 0xc2, 0xe0, 0x09, 0x22, 0x04, 0x5b, 0xc3, 0x0b, 0x48, 0x20, 0xeb, 0x0e, + 0x01, 0x82, 0x48, 0x20, 0xe4, 0x6c, 0x01, 0x80, 0x48, 0x20, 0xe0, 0x22, 0x01, 0xae, 0x48, 0x20, + 0xe0, 0x22, 0x09, 0x78, 0x43, 0x60, 0xe0, 0x18, 0x43, 0xa0, 0xe0, 0x08, 0x02, 0x08, 0x00, 0x42, + 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x5c, 0xc3, 0x0b, 0xe8, 0x20, 0xe0, 0x0e, 0x01, 0x82, 0xe8, 0x20, + 0xe0, 0x22, 0x01, 0xae, 0xe8, 0x20, 0xe0, 0x22, 0x09, 0x78, 0xe3, 0xa0, 0xe0, 0x08, 0xe3, 0x60, + 0xe0, 0x18, 0x43, 0xa0, 0xe0, 0x06, 0x02, 0x08, 0x80, 0x3c, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, + 0x80, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x5c, 0xc3, 0x0b, 0x07, 0x83, 0x68, 0x00, 0x06, 0xa0, + 0xe3, 0x56, 0x07, 0x83, 0x80, 0x10, 0x06, 0xa0, 0xe3, 0x56, 0x04, 0x5c, 0xc3, 0x0b, 0x06, 0xa0, + 0xe3, 0x40, 0xa2, 0x02, 0xc2, 0x68, 0x00, 0x14, 0x02, 0x29, 0xff, 0xfc, 0x13, 0x24, 0x02, 0x28, + 0x00, 0x18, 0x07, 0x87, 0x00, 0x0e, 0x07, 0x81, 0x07, 0x0e, 0x04, 0xf1, 0x06, 0x47, 0x15, 0xfd, + 0xc0, 0x58, 0x03, 0xb0, 0x78, 0x01, 0x06, 0x63, 0x02, 0x41, 0x00, 0x3f, 0x13, 0x0e, 0x02, 0x81, + 0x00, 0x1f, 0x1b, 0x0b, 0xa0, 0x41, 0xc0, 0x61, 0xe4, 0x4e, 0xc1, 0xf8, 0x06, 0xc7, 0x71, 0xc7, + 0x06, 0x47, 0xcc, 0x78, 0x06, 0x47, 0x15, 0xfd, 0x10, 0x04, 0xc0, 0x58, 0x06, 0xc1, 0x70, 0x41, + 0xa2, 0x01, 0xc2, 0x49, 0x15, 0xe5, 0x04, 0x5c, 0x23, 0xa0, 0xe0, 0x1a, 0x13, 0x02, 0x04, 0xc8, + 0x04, 0x5b, 0xc2, 0x22, 0x00, 0x14, 0x02, 0x48, 0x1f, 0x00, 0x06, 0xc8, 0x04, 0x5b, 0x02, 0x83, + 0x00, 0x0f, 0x1b, 0x17, 0xc1, 0xa0, 0x06, 0xd4, 0x13, 0x35, 0x02, 0x26, 0x00, 0x04, 0xcd, 0xa0, + 0xed, 0x26, 0xc5, 0x83, 0x13, 0x04, 0xc2, 0x4a, 0x0a, 0x39, 0xe0, 0xc9, 0xc5, 0x83, 0x07, 0x86, + 0x07, 0x36, 0x07, 0x87, 0x00, 0x10, 0xc2, 0x20, 0x06, 0xd4, 0x04, 0xe0, 0x06, 0xd4, 0x2c, 0x46, + 0x04, 0x5b, 0xc0, 0x60, 0x06, 0xfe, 0xc2, 0x20, 0x09, 0x6a, 0x02, 0x48, 0x60, 0x00, 0x22, 0x20, + 0xe0, 0x06, 0x16, 0x04, 0xe2, 0x20, 0xe0, 0x0a, 0xe2, 0x20, 0xe0, 0x18, 0x0a, 0x13, 0x18, 0x04, + 0x05, 0x41, 0x48, 0x03, 0x06, 0xfe, 0x10, 0x06, 0x02, 0x83, 0x00, 0x02, 0x16, 0x01, 0x09, 0x13, + 0xe8, 0x03, 0x06, 0xfe, 0x40, 0xc8, 0x40, 0xc1, 0x13, 0x05, 0x07, 0x88, 0x07, 0x36, 0x07, 0x89, + 0x40, 0x00, 0x2c, 0x48, 0x04, 0x5b, 0x04, 0xc9, 0xc1, 0x24, 0xeb, 0x24, 0xc1, 0x84, 0x71, 0x86, + 0x02, 0x26, 0xeb, 0xd6, 0x06, 0xc4, 0x71, 0x04, 0x02, 0x24, 0xeb, 0x4c, 0xd2, 0x14, 0x09, 0xc8, + 0xa2, 0x08, 0x03, 0xb0, 0xd8, 0x34, 0x06, 0x5f, 0x02, 0x47, 0x00, 0x0f, 0xa1, 0xc7, 0xc2, 0x28, + 0xeb, 0x12, 0x04, 0x58, 0xcd, 0x76, 0x06, 0x47, 0x16, 0xfd, 0x10, 0x32, 0xc2, 0x36, 0x10, 0x26, + 0x09, 0x17, 0xa1, 0x47, 0x10, 0x2d, 0x09, 0x17, 0x61, 0x47, 0x10, 0x2a, 0x43, 0xa0, 0xe0, 0x16, + 0x04, 0x5b, 0x43, 0xa0, 0xe0, 0x16, 0xc2, 0x49, 0x16, 0x03, 0xc2, 0x44, 0xc8, 0x06, 0x09, 0x22, + 0xc1, 0x27, 0xec, 0xe6, 0xc1, 0x84, 0x71, 0x86, 0x02, 0x26, 0xed, 0x1c, 0x06, 0xc4, 0x71, 0x04, + 0x02, 0x24, 0xed, 0x02, 0x10, 0xd3, 0xc1, 0x09, 0xc1, 0xa0, 0x09, 0x22, 0x04, 0xc9, 0x10, 0x10, + 0xc2, 0x36, 0xd5, 0x78, 0x41, 0x60, 0xe0, 0x22, 0x05, 0xc5, 0x10, 0x0a, 0xcd, 0x78, 0x06, 0x47, + 0x15, 0xfd, 0x10, 0x06, 0x23, 0xa0, 0xe0, 0x16, 0x16, 0xcd, 0xc2, 0x49, 0x16, 0xec, 0x10, 0xd6, + 0xe3, 0xa0, 0xe0, 0x16, 0x10, 0xbb, 0x02, 0x08, 0x80, 0x5a, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x3e, + 0x92, 0xa0, 0xe0, 0x0c, 0x16, 0x15, 0x02, 0x44, 0x5e, 0x00, 0x16, 0x14, 0x48, 0x20, 0xe4, 0x6c, + 0x01, 0x80, 0x06, 0xa0, 0xe2, 0x9e, 0xc8, 0x20, 0x01, 0x9e, 0x01, 0x9e, 0x2e, 0xe0, 0x00, 0x01, + 0x43, 0xa0, 0xe0, 0x18, 0xd2, 0xa0, 0xe0, 0x26, 0x07, 0x83, 0x00, 0x10, 0x06, 0xa0, 0xe3, 0x56, + 0x04, 0x60, 0xdb, 0xc0, 0x07, 0x84, 0x00, 0x08, 0x04, 0x60, 0xdb, 0x88, 0x07, 0x85, 0x02, 0x03, + 0xc8, 0x05, 0x06, 0xce, 0x43, 0xa0, 0xe0, 0x12, 0x04, 0xe0, 0x06, 0xfa, 0x06, 0xa0, 0xe2, 0xd0, + 0x02, 0x08, 0x80, 0x48, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x11, 0x27, 0xa0, 0xe0, 0x2c, 0x16, 0x04, + 0x02, 0x08, 0x80, 0x54, 0x06, 0xa0, 0xe0, 0x22, 0x07, 0x83, 0xa8, 0x00, 0x88, 0x20, 0x07, 0x08, + 0xe0, 0x20, 0x16, 0x02, 0x07, 0x83, 0xe8, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0x02, 0x08, 0x00, 0x36, + 0x06, 0xa0, 0xe0, 0x22, 0xe8, 0x20, 0xe0, 0x0c, 0x01, 0x82, 0x23, 0xa0, 0xe0, 0x18, 0x13, 0x06, + 0xe3, 0xa0, 0xe0, 0x18, 0x2e, 0xe0, 0x00, 0x00, 0xc0, 0x41, 0x16, 0xfa, 0x06, 0xa0, 0xe1, 0x2e, + 0xc0, 0x82, 0x13, 0x02, 0x02, 0x4f, 0xff, 0x80, 0x04, 0xc4, 0xd1, 0x0f, 0x06, 0xc4, 0x04, 0x60, + 0xdb, 0x88, 0x06, 0xa0, 0xe5, 0x50, 0x02, 0x08, 0x80, 0x36, 0x07, 0xa0, 0x06, 0xd6, 0xe5, 0x3e, + 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x10, 0x06, 0xa0, 0xe5, 0x50, 0xd1, 0x20, 0x06, 0xce, 0x13, 0xe6, + 0x78, 0x20, 0xe0, 0x12, 0x06, 0xce, 0x10, 0xe2, 0xc1, 0x20, 0x04, 0x16, 0x0a, 0x14, 0x06, 0xc4, + 0x91, 0x0a, 0x16, 0x01, 0x04, 0x5b, 0x04, 0x60, 0xdb, 0xc0, 0x04, 0xca, 0x04, 0xcd, 0x04, 0xce, + 0x04, 0xcf, 0x04, 0xe0, 0x06, 0xa8, 0x04, 0xe0, 0x06, 0xba, 0x07, 0x84, 0x01, 0xa0, 0x07, 0x85, + 0x00, 0x10, 0x04, 0xf4, 0x06, 0x45, 0x15, 0xfd, 0x07, 0x84, 0x06, 0xd8, 0x07, 0x85, 0x07, 0x34, + 0x61, 0x44, 0x04, 0xf4, 0x06, 0x45, 0x15, 0xfd, 0x07, 0x84, 0x00, 0xc8, 0xc8, 0x04, 0x07, 0x00, + 0x07, 0x84, 0x7f, 0xff, 0xc8, 0x04, 0x06, 0xf0, 0x07, 0x84, 0x00, 0x06, 0xc8, 0x04, 0x06, 0xee, + 0x03, 0xb0, 0xd8, 0x20, 0xe0, 0x10, 0x06, 0x65, 0x04, 0x60, 0xdb, 0xc0, 0xf8, 0x20, 0xed, 0x71, + 0x01, 0x82, 0xc8, 0x20, 0xe0, 0x10, 0x06, 0xc6, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xc8, 0x2e, 0xe0, + 0x00, 0x00, 0x06, 0xa0, 0xe1, 0x2e, 0xc8, 0x20, 0x09, 0x6c, 0x01, 0xa0, 0xc8, 0x20, 0x09, 0x6e, + 0x01, 0xa2, 0xc8, 0x20, 0x09, 0x70, 0x01, 0xa4, 0xc8, 0x20, 0x09, 0x6e, 0x01, 0xb0, 0xc8, 0x20, + 0x09, 0x70, 0x01, 0xb2, 0xc8, 0x20, 0x09, 0x70, 0x06, 0xcc, 0xf8, 0x20, 0xed, 0x70, 0x01, 0x80, + 0x06, 0xa0, 0xe1, 0x18, 0x48, 0x20, 0xe0, 0x04, 0x01, 0x80, 0x04, 0xe0, 0x01, 0x9e, 0x02, 0x08, + 0x80, 0x12, 0x06, 0xa0, 0xe0, 0x22, 0x07, 0x84, 0x00, 0x0a, 0x07, 0x85, 0x03, 0xf4, 0x88, 0x20, + 0x06, 0xc6, 0xe0, 0x20, 0x1b, 0x04, 0x07, 0x84, 0x00, 0x1c, 0x07, 0x85, 0x03, 0xf8, 0x06, 0xa0, + 0xe3, 0xce, 0x07, 0x85, 0xe6, 0x42, 0xc8, 0x05, 0x03, 0xf8, 0x23, 0xa0, 0xe0, 0x0c, 0x13, 0x23, + 0xe3, 0xa0, 0xe0, 0x0c, 0x2e, 0xa0, 0x03, 0xf4, 0x10, 0x1e, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x10, + 0x06, 0x65, 0x16, 0x19, 0x02, 0x44, 0x5e, 0x00, 0x16, 0x04, 0x06, 0x20, 0x06, 0xc6, 0x16, 0xd7, + 0x10, 0x08, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x10, 0x06, 0x65, 0x16, 0x0d, 0x06, 0x20, 0x06, 0xc8, + 0x16, 0xc4, 0x01, 0x0e, 0x00, 0x03, 0x13, 0x03, 0x07, 0x83, 0x82, 0x00, 0x10, 0x02, 0x07, 0x83, + 0x00, 0x01, 0x04, 0x60, 0xdb, 0xb8, 0x04, 0x60, 0xdb, 0x9e, 0x01, 0x0e, 0x00, 0x03, 0x13, 0x0a, + 0x02, 0x08, 0x80, 0x0c, 0x06, 0xa0, 0xe0, 0x22, 0xe3, 0xe0, 0xe0, 0x14, 0xc8, 0x20, 0xe4, 0x6e, + 0x01, 0x86, 0x10, 0x26, 0x48, 0x20, 0xe0, 0x0c, 0x01, 0x82, 0x2e, 0xe0, 0x00, 0x01, 0xc1, 0x60, + 0x09, 0x1e, 0x0a, 0x35, 0xe8, 0x05, 0x01, 0x82, 0xc1, 0x20, 0x09, 0x6a, 0x01, 0x04, 0x00, 0x06, + 0x13, 0x06, 0xd8, 0x20, 0xe1, 0xd0, 0x09, 0x2f, 0xd8, 0x20, 0xe1, 0xd0, 0x01, 0x83, 0x21, 0x20, + 0xe0, 0x22, 0x16, 0x03, 0xe8, 0x20, 0xe0, 0x22, 0x01, 0x80, 0x21, 0x20, 0xe0, 0x04, 0x16, 0x04, + 0xe3, 0xa0, 0xe0, 0x14, 0x04, 0x60, 0xdf, 0xb6, 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22, + 0xe8, 0x20, 0xe0, 0x08, 0x01, 0x82, 0x04, 0x60, 0xdb, 0x9e, 0xc8, 0x20, 0xe4, 0x6e, 0x01, 0x86, + 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22, 0xc2, 0x20, 0x09, 0x1e, 0xa2, 0x08, 0x05, 0x08, + 0xc8, 0x28, 0xe0, 0x22, 0x06, 0xca, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xc6, 0xc8, 0x20, 0xe0, 0x20, + 0x06, 0xc8, 0xe3, 0x60, 0xe0, 0x16, 0x04, 0x60, 0xdb, 0xc0, 0xc1, 0x44, 0x02, 0x44, 0x5e, 0x00, + 0x16, 0xf8, 0x25, 0x60, 0xe4, 0x68, 0x16, 0x0f, 0x06, 0x20, 0x06, 0xc6, 0x16, 0xf2, 0x06, 0x20, + 0x06, 0xca, 0x13, 0x03, 0x05, 0xa0, 0x06, 0xcc, 0x10, 0xe6, 0x03, 0xb0, 0xd8, 0x20, 0xe0, 0x0c, + 0x06, 0x65, 0x04, 0x60, 0xdb, 0xc0, 0x06, 0x20, 0x06, 0xc8, 0x16, 0xe3, 0x88, 0x20, 0x09, 0x70, + 0x06, 0xcc, 0x16, 0x03, 0x07, 0x83, 0x00, 0x08, 0x10, 0x02, 0x07, 0x83, 0x00, 0x0c, 0x04, 0x60, + 0xdb, 0xb8, 0x04, 0x60, 0xdb, 0xc0, 0x23, 0xa0, 0xe0, 0x08, 0x13, 0x03, 0x23, 0x60, 0xe0, 0x12, + 0x16, 0x06, 0x03, 0xb0, 0xd8, 0x20, 0xe3, 0xa9, 0x06, 0x65, 0x04, 0x60, 0xdb, 0xc0, 0x02, 0x08, + 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0xdb, 0x9e, 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, + 0xe0, 0x22, 0xc8, 0x20, 0xe0, 0x1e, 0x06, 0xc6, 0xc8, 0x20, 0xe0, 0x1e, 0x06, 0xc8, 0xe3, 0x60, + 0xe0, 0x10, 0x04, 0x60, 0xdb, 0xc0, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x19, 0xc1, 0x44, 0x02, 0x44, + 0x1e, 0x00, 0x16, 0xf5, 0x25, 0x60, 0xe4, 0x68, 0x16, 0x06, 0x06, 0x20, 0x06, 0xc8, 0x16, 0xef, + 0x04, 0xc2, 0x04, 0x60, 0xec, 0x20, 0x02, 0x08, 0x80, 0x1e, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x07, + 0x06, 0x20, 0x06, 0xc6, 0x16, 0xe4, 0x07, 0x83, 0x00, 0x09, 0x06, 0xa0, 0xdb, 0xb8, 0x04, 0x60, + 0xdb, 0x9e, 0x04, 0xce, 0x04, 0xe0, 0x09, 0x2a, 0xd3, 0xe0, 0xe3, 0xaa, 0xc2, 0x8f, 0xc8, 0x20, + 0xe4, 0x70, 0x01, 0x86, 0x48, 0x20, 0xe0, 0x08, 0x01, 0x82, 0x07, 0x86, 0x00, 0x05, 0x07, 0x84, + 0x06, 0x72, 0xc1, 0x54, 0x13, 0x01, 0x2c, 0xd4, 0x02, 0x24, 0x00, 0x0a, 0x06, 0x06, 0x16, 0xf9, + 0x02, 0x08, 0x80, 0x2a, 0x06, 0xa0, 0xe0, 0x22, 0x2c, 0x20, 0xe0, 0x1a, 0x04, 0x60, 0xda, 0x6a, + 0x06, 0xa0, 0xe2, 0x72, 0x04, 0xcd, 0x23, 0xa0, 0xe0, 0x1c, 0x13, 0x0d, 0x01, 0x0e, 0x00, 0x03, + 0x13, 0x0a, 0xe3, 0xa0, 0xe0, 0x1c, 0x03, 0xb0, 0xd8, 0x20, 0xe0, 0x10, 0x06, 0x65, 0xd2, 0xa0, + 0xe0, 0x26, 0x04, 0xcf, 0x10, 0x08, 0x2d, 0x20, 0x00, 0x01, 0xc0, 0xe0, 0x09, 0x2a, 0x06, 0xa0, + 0xe3, 0x56, 0xd2, 0xa0, 0xe3, 0xab, 0x04, 0x60, 0xdb, 0xc0, 0x06, 0xa0, 0xe0, 0xe4, 0xc2, 0x08, + 0x13, 0x19, 0x07, 0x83, 0x80, 0x80, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x02, 0x07, 0x83, 0x00, 0x0a, + 0x04, 0x60, 0xdb, 0xb4, 0xc1, 0x20, 0x06, 0x06, 0x13, 0x0d, 0x06, 0xa0, 0xe0, 0xe4, 0xc2, 0x08, + 0x13, 0x09, 0x07, 0x83, 0x00, 0x0b, 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x02, 0x07, 0x83, 0x80, 0x01, + 0x04, 0x60, 0xdb, 0xb4, 0x07, 0x83, 0x80, 0x0a, 0x04, 0x60, 0xdb, 0xa2, 0x93, 0xe0, 0xe0, 0x0e, + 0x13, 0x5e, 0x93, 0xe0, 0xe0, 0x10, 0x13, 0x17, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x04, 0x07, 0x83, + 0x00, 0x07, 0x04, 0x60, 0xdb, 0xb4, 0x07, 0x83, 0xa0, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0x07, 0x83, + 0x48, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0xd2, 0xa0, 0xe0, 0x10, 0xc8, 0x20, 0xe0, 0x1c, 0x06, 0xca, + 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xcc, 0x06, 0xa0, 0xe2, 0x72, 0x02, 0x08, 0x80, 0x4e, 0x06, 0xa0, + 0xe0, 0x22, 0x23, 0xa0, 0xe0, 0x1c, 0x13, 0x20, 0x88, 0x20, 0x09, 0x6c, 0x07, 0x0e, 0x16, 0x1c, + 0x88, 0x20, 0x09, 0x6e, 0x07, 0x10, 0x16, 0x18, 0x88, 0x20, 0x09, 0x70, 0x07, 0x12, 0x16, 0x14, + 0x88, 0x20, 0x07, 0x0a, 0xe0, 0x22, 0x13, 0x10, 0x06, 0x20, 0x06, 0xca, 0x16, 0x38, 0xe3, 0xa0, + 0xe0, 0x20, 0x10, 0x06, 0x23, 0xe0, 0xe0, 0x14, 0x16, 0xca, 0xe3, 0xa0, 0xe0, 0x22, 0x04, 0xc2, + 0xd2, 0xa0, 0xe3, 0xaa, 0x04, 0x60, 0xdb, 0xa8, 0xc8, 0x20, 0xe0, 0x1c, 0x06, 0xca, 0x88, 0xa0, + 0x06, 0xdc, 0x00, 0x0e, 0x16, 0x10, 0x88, 0xa0, 0x06, 0xde, 0x00, 0x10, 0x16, 0x0c, 0x88, 0xa0, + 0x06, 0xe0, 0x00, 0x12, 0x16, 0x08, 0x06, 0x20, 0x06, 0xcc, 0x16, 0x19, 0xe8, 0x20, 0xe0, 0x0e, + 0x01, 0x82, 0xe3, 0xa0, 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xcc, 0x10, 0x10, 0x23, 0xa0, + 0xe0, 0x10, 0x16, 0x08, 0xc1, 0x64, 0x00, 0x06, 0x21, 0x60, 0xe0, 0x0c, 0x13, 0x08, 0xd2, 0xa0, + 0xe3, 0xa8, 0x10, 0x05, 0x88, 0x20, 0x07, 0x0a, 0x07, 0x08, 0x12, 0x96, 0x10, 0x00, 0x04, 0x60, + 0xdb, 0xa8, 0x93, 0xe0, 0xe0, 0x0e, 0x13, 0x50, 0x93, 0xe0, 0xe3, 0xa9, 0x13, 0x4d, 0x93, 0xe0, + 0xe3, 0xa8, 0x13, 0x1c, 0x06, 0xa0, 0xe2, 0xd0, 0x23, 0xa0, 0xe0, 0x10, 0x13, 0x45, 0x23, 0xa0, + 0xe0, 0x08, 0x16, 0x06, 0xe3, 0x60, 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x22, 0x07, 0x06, 0x10, 0x34, + 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x31, 0xc1, 0x60, 0x09, 0x6a, 0x21, 0x60, 0xe0, 0x12, 0x16, 0x2c, + 0x06, 0xa0, 0xea, 0x34, 0x10, 0x31, 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0x2e, 0xe3, 0xa0, 0xe0, 0x12, + 0x06, 0xa0, 0xea, 0x34, 0xc1, 0x64, 0x00, 0x06, 0x21, 0x60, 0xe0, 0x0c, 0x13, 0x25, 0x88, 0x20, + 0x07, 0x0e, 0x06, 0xdc, 0x16, 0x14, 0x88, 0x20, 0x07, 0x10, 0x06, 0xde, 0x16, 0x10, 0x88, 0x20, + 0x07, 0x12, 0x06, 0xe0, 0x16, 0x0c, 0x98, 0x20, 0x06, 0xce, 0x06, 0xcf, 0x13, 0x15, 0x06, 0x20, + 0x06, 0xce, 0x16, 0x12, 0xe3, 0x60, 0xe0, 0x1a, 0xd2, 0xa0, 0xe0, 0x0c, 0x10, 0x0d, 0xe3, 0x60, + 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x32, 0x07, 0x06, 0x06, 0xa0, 0xe2, 0x72, 0x02, 0x08, 0x80, 0x48, + 0x06, 0xa0, 0xe0, 0x22, 0xd2, 0xa0, 0xe3, 0xa9, 0x04, 0x60, 0xdb, 0xa8, 0x88, 0x22, 0x00, 0x0e, + 0x09, 0x6c, 0x1a, 0xc9, 0x1b, 0x0b, 0x88, 0x22, 0x00, 0x10, 0x09, 0x6e, 0x1a, 0xc4, 0x1b, 0x06, + 0x88, 0x22, 0x00, 0x12, 0x09, 0x70, 0x1a, 0xbf, 0x1b, 0x01, 0x04, 0x5b, 0xc1, 0x60, 0x01, 0x6c, + 0x02, 0x85, 0x00, 0x43, 0x13, 0xe1, 0x93, 0xe0, 0xe3, 0xa8, 0x16, 0xde, 0xc8, 0xa0, 0xed, 0x58, + 0x00, 0x02, 0x07, 0x84, 0x00, 0x0e, 0xc1, 0x42, 0xc0, 0xa0, 0x01, 0x6c, 0xc0, 0x02, 0x02, 0x25, + 0x00, 0x48, 0x07, 0x81, 0xea, 0x86, 0x07, 0x83, 0xae, 0x14, 0x04, 0x60, 0xed, 0x92, 0x02, 0x02, + 0xfc, 0x00, 0x10, 0xca, 0x98, 0x20, 0xe0, 0x0e, 0x06, 0x65, 0x16, 0x03, 0xd8, 0x20, 0xe3, 0xa8, + 0x06, 0x65, 0x93, 0xe0, 0xe3, 0xa9, 0x13, 0x0d, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x19, 0x23, 0xa0, + 0xe0, 0x10, 0x13, 0x16, 0xe3, 0x60, 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x20, 0x07, 0x06, 0x06, 0xa0, + 0xe2, 0x72, 0x43, 0xa0, 0xe0, 0x18, 0x2e, 0xe0, 0x00, 0x01, 0xd2, 0xa0, 0xe0, 0x26, 0x07, 0x83, + 0x00, 0x10, 0x06, 0xa0, 0xe3, 0x56, 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x02, 0x06, 0xa0, 0xe2, 0x54, + 0x43, 0xa0, 0xe0, 0x2c, 0xc8, 0x20, 0xe0, 0x20, 0x09, 0x24, 0x04, 0x60, 0xdb, 0xa8, 0x43, 0xa0, + 0xe0, 0x0e, 0xc1, 0xa0, 0x09, 0x24, 0x13, 0x02, 0x06, 0x20, 0x09, 0x24, 0x23, 0xe0, 0xe0, 0x14, + 0x13, 0x03, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x26, 0x02, 0x08, 0x80, 0x42, 0x06, 0xa0, 0xe0, 0x22, + 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x1f, 0x23, 0xa0, 0xe0, 0x10, 0x16, 0x0a, 0xc1, 0x22, 0x00, 0x02, + 0x25, 0x20, 0xe4, 0x68, 0x16, 0x23, 0x07, 0x83, 0x80, 0x20, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x12, + 0x06, 0xa0, 0xe2, 0x72, 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x02, 0x06, 0xa0, 0xe2, 0x54, 0xe3, 0x60, + 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x20, 0x07, 0x06, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x03, 0x23, 0xa0, + 0xe0, 0x06, 0x13, 0x51, 0x98, 0x20, 0xe0, 0x0e, 0x06, 0x65, 0x16, 0x03, 0xd8, 0x20, 0xe3, 0xa8, + 0x06, 0x65, 0xc1, 0x22, 0x00, 0x02, 0x25, 0x20, 0xe4, 0x68, 0x13, 0x0e, 0x07, 0x83, 0x00, 0x20, + 0x06, 0xa0, 0xe3, 0x56, 0xc8, 0x22, 0x00, 0x0e, 0x06, 0xe6, 0xc8, 0x22, 0x00, 0x10, 0x06, 0xe8, + 0xc8, 0x22, 0x00, 0x12, 0x06, 0xea, 0x10, 0x37, 0x88, 0x22, 0x00, 0x0e, 0x06, 0xdc, 0x16, 0x08, + 0x88, 0x22, 0x00, 0x10, 0x06, 0xde, 0x16, 0x04, 0x88, 0x22, 0x00, 0x12, 0x06, 0xe0, 0x13, 0x0b, + 0xc8, 0x22, 0x00, 0x0e, 0x06, 0xdc, 0xc8, 0x22, 0x00, 0x10, 0x06, 0xde, 0xc8, 0x22, 0x00, 0x12, + 0x06, 0xe0, 0xe3, 0x60, 0xe0, 0x14, 0x23, 0xa0, 0xe0, 0x0e, 0x16, 0x08, 0xc1, 0xa0, 0x09, 0x24, + 0x16, 0x1a, 0x07, 0x86, 0x10, 0x00, 0xe8, 0x06, 0x06, 0xd2, 0x10, 0x15, 0xe3, 0xa0, 0xe0, 0x0e, + 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x09, 0xe3, 0xa0, 0xe0, 0x06, 0x04, 0xe0, 0x06, 0xe6, 0x04, 0xe0, + 0x06, 0xe8, 0x04, 0xe0, 0x06, 0xea, 0x10, 0x07, 0x02, 0x08, 0x80, 0x36, 0x07, 0xa0, 0x06, 0xd6, + 0xdf, 0xe2, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0xdb, 0xa8, 0x98, 0x20, 0x06, 0x65, 0xe0, 0x10, + 0x16, 0x03, 0xd8, 0x20, 0xe0, 0x0e, 0x06, 0x65, 0x04, 0x60, 0xdb, 0xa8, 0x23, 0xe0, 0xe0, 0x14, + 0x13, 0x02, 0x04, 0x60, 0xdb, 0xa8, 0x10, 0x2e, 0x03, 0xb0, 0x98, 0x20, 0xe3, 0xa9, 0x06, 0x6f, + 0x16, 0x19, 0xc2, 0x24, 0x00, 0x08, 0x11, 0x16, 0xe3, 0xe0, 0xe0, 0x14, 0x07, 0x83, 0x00, 0x00, + 0x06, 0xa0, 0xe3, 0x56, 0x23, 0xa0, 0xe0, 0x14, 0x13, 0x04, 0x02, 0x08, 0x80, 0x06, 0x06, 0xa0, + 0xe0, 0x22, 0x02, 0x08, 0x00, 0x1e, 0x06, 0xa0, 0xe0, 0x22, 0x23, 0xa0, 0xe0, 0x08, 0x13, 0x02, + 0x06, 0xa0, 0xe2, 0x54, 0xc0, 0x82, 0x16, 0x02, 0x04, 0x60, 0xdb, 0xc0, 0xe8, 0x20, 0xed, 0x74, + 0x06, 0xf0, 0x99, 0x20, 0xe0, 0x0e, 0x00, 0x16, 0x16, 0x05, 0x04, 0xe0, 0x06, 0xec, 0x48, 0x20, + 0xe0, 0x14, 0x06, 0xf0, 0x07, 0x83, 0x00, 0x01, 0x04, 0x60, 0xdb, 0xa2, 0xc2, 0x64, 0x00, 0x14, + 0x02, 0x24, 0x00, 0x18, 0xc1, 0xc4, 0x61, 0xc2, 0x02, 0x27, 0xff, 0xfc, 0xc1, 0x74, 0xc1, 0x85, + 0x71, 0x45, 0x02, 0x85, 0x00, 0x27, 0x16, 0x46, 0xc1, 0x54, 0x02, 0x45, 0xff, 0xcf, 0x16, 0x42, + 0x04, 0xc8, 0xc1, 0x64, 0x00, 0x08, 0x15, 0x06, 0x13, 0x05, 0xc2, 0x24, 0x00, 0x0e, 0x02, 0x48, + 0x1f, 0x00, 0x06, 0xc8, 0x02, 0x28, 0x00, 0x11, 0xa2, 0x04, 0x98, 0x18, 0xed, 0x79, 0x16, 0x32, + 0xc1, 0x42, 0x02, 0x25, 0x00, 0x04, 0x65, 0x47, 0xc2, 0x35, 0xcd, 0x74, 0x06, 0x48, 0x15, 0xfd, + 0xc0, 0xa0, 0x01, 0x6c, 0xc1, 0x02, 0xc8, 0x04, 0x01, 0x6c, 0xc1, 0xa0, 0xfc, 0x00, 0x13, 0x05, + 0xc8, 0x20, 0xeb, 0x10, 0xfc, 0x02, 0xc1, 0x06, 0x10, 0xf6, 0xc8, 0x02, 0x01, 0x6c, 0xc8, 0x20, + 0xed, 0x58, 0xfc, 0x02, 0x07, 0x81, 0xec, 0xfc, 0xc0, 0x04, 0x07, 0x83, 0x02, 0x10, 0x07, 0x84, + 0x00, 0x0e, 0x10, 0x3b, 0x07, 0x84, 0x00, 0x0c, 0xc0, 0xe2, 0x00, 0x08, 0x02, 0x05, 0xfc, 0x00, + 0xc0, 0xa0, 0x01, 0x6c, 0xc0, 0x02, 0xc1, 0xa0, 0xfc, 0x00, 0x13, 0x2f, 0x04, 0xe0, 0xfc, 0x00, + 0x2e, 0x16, 0x10, 0x2b, 0xc8, 0xa0, 0xed, 0x7a, 0x00, 0x0e, 0xc8, 0xa0, 0xed, 0x7c, 0x00, 0x10, + 0xc8, 0xa0, 0xed, 0x7e, 0x00, 0x12, 0x07, 0x83, 0x80, 0x06, 0x04, 0x60, 0xdb, 0xa2, 0x04, 0x60, + 0xdb, 0xc0, 0x07, 0x84, 0x00, 0x10, 0x07, 0x85, 0x00, 0x34, 0x10, 0x09, 0x07, 0x84, 0x00, 0x12, + 0x07, 0x85, 0x00, 0x32, 0x10, 0x04, 0x07, 0x84, 0x00, 0x14, 0x07, 0x85, 0x00, 0x38, 0x06, 0xa0, + 0xe1, 0x0a, 0xc8, 0x85, 0x00, 0x04, 0x06, 0xa0, 0xe1, 0x4c, 0xc8, 0xa0, 0xed, 0x58, 0x00, 0x02, + 0xc0, 0xa0, 0x01, 0x6c, 0xc0, 0x02, 0x06, 0x48, 0xc1, 0x48, 0x06, 0xa0, 0xe3, 0xce, 0x02, 0x07, + 0x06, 0xa2, 0xc5, 0x60, 0xfc, 0x02, 0x02, 0x25, 0xff, 0xf4, 0xc8, 0x05, 0xfc, 0x02, 0xc2, 0x20, + 0x01, 0x6c, 0x06, 0xa0, 0xc2, 0x5a, 0x04, 0x60, 0xdb, 0x9e, 0x06, 0xa0, 0xe3, 0xce, 0x02, 0x07, + 0x06, 0xb4, 0x10, 0xef, 0xc3, 0x0b, 0x03, 0x00, 0x00, 0x02, 0x07, 0x82, 0x00, 0xc0, 0xc8, 0x20, + 0x00, 0x0c, 0x00, 0xc0, 0xc8, 0x20, 0x00, 0x0e, 0x00, 0xc2, 0xc8, 0x20, 0x00, 0x10, 0x00, 0xc4, + 0xc8, 0x20, 0x00, 0x12, 0x00, 0xc6, 0xc8, 0x20, 0x00, 0x14, 0x00, 0xc8, 0xc8, 0x20, 0x00, 0x16, + 0x00, 0xca, 0xc8, 0x20, 0x00, 0x04, 0x00, 0xcc, 0xc8, 0x20, 0x00, 0x06, 0x00, 0xce, 0xc8, 0x02, + 0x00, 0x0c, 0x07, 0xa0, 0x00, 0x0e, 0xee, 0x3c, 0xc8, 0x02, 0x00, 0x10, 0x07, 0xa0, 0x00, 0x12, + 0xee, 0x46, 0xc8, 0x02, 0x00, 0x14, 0x07, 0xa0, 0x00, 0x16, 0xee, 0x76, 0xc8, 0x02, 0x00, 0x04, + 0x07, 0xa0, 0x00, 0x06, 0xee, 0x8c, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04, 0x16, 0x09, 0x01, 0xe0, + 0x01, 0x40, 0x08, 0x00, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0x01, 0xe0, 0x01, 0x40, 0x04, 0x00, + 0x06, 0xa0, 0xf1, 0x4c, 0x02, 0x05, 0x80, 0x00, 0xd8, 0x05, 0x04, 0x80, 0x04, 0xc7, 0x03, 0x00, + 0x00, 0x0f, 0x07, 0x88, 0x10, 0x00, 0x02, 0x09, 0x20, 0x00, 0x07, 0x8a, 0xee, 0xa4, 0x02, 0x03, + 0xe5, 0xfe, 0x04, 0x5a, 0x03, 0x00, 0x00, 0x00, 0xd2, 0x20, 0x01, 0x87, 0x10, 0x06, 0x03, 0x00, + 0x00, 0x00, 0xc2, 0x20, 0x01, 0x8a, 0x02, 0x08, 0x1a, 0x00, 0xc2, 0x60, 0x00, 0xae, 0xda, 0x48, + 0x04, 0x80, 0x05, 0x89, 0x02, 0x89, 0x00, 0x06, 0x15, 0x07, 0x07, 0x88, 0x80, 0x00, 0xda, 0x48, + 0x04, 0x80, 0xc8, 0x09, 0x00, 0xae, 0x03, 0x80, 0x02, 0xe0, 0x00, 0xa0, 0x04, 0x5c, 0x03, 0x00, + 0x00, 0x00, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x20, 0x13, 0xe2, 0xc2, 0x20, 0x01, 0x8c, 0x02, 0x08, + 0x1c, 0x00, 0x10, 0xe3, 0x03, 0x00, 0x00, 0x00, 0x01, 0x60, 0x01, 0x40, 0x40, 0x00, 0x16, 0xec, + 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0x02, 0x08, 0x02, 0x00, 0x10, 0xd7, 0xc0, 0xb3, 0x06, 0x92, + 0x10, 0xfd, 0xc0, 0xb3, 0xc0, 0x48, 0xcc, 0x72, 0xcc, 0x72, 0xc1, 0x32, 0xcc, 0x44, 0xdc, 0x72, + 0x06, 0x04, 0x16, 0xfd, 0x04, 0x5b, 0xc0, 0x48, 0x02, 0x02, 0xe9, 0x90, 0x07, 0x84, 0x00, 0x06, + 0x10, 0xf6, 0x02, 0x02, 0xe5, 0xde, 0xc0, 0x49, 0x07, 0x84, 0x00, 0x06, 0x10, 0xf0, 0xc0, 0xb3, + 0xc1, 0x32, 0x02, 0x01, 0x00, 0x01, 0xd0, 0x44, 0x06, 0xc1, 0x02, 0x44, 0x00, 0xff, 0x10, 0xe7, + 0xc1, 0x33, 0xc0, 0x73, 0xd1, 0x44, 0x02, 0x44, 0x00, 0xff, 0xdc, 0x45, 0x06, 0x04, 0x16, 0xfd, + 0x04, 0x5a, 0x06, 0xa0, 0xf0, 0xcc, 0xc8, 0x33, 0x01, 0x9e, 0x04, 0x5a, 0x06, 0xa0, 0xee, 0xca, + 0xc1, 0x89, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8a, 0xc1, 0x88, 0x09, 0xa6, + 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8c, 0x04, 0xc2, 0xc1, 0xc7, 0x16, 0x03, 0x06, 0x02, + 0x16, 0xfc, 0x10, 0x4d, 0x04, 0x5a, 0x06, 0xa0, 0xf0, 0x16, 0xc1, 0x89, 0x09, 0xa6, 0x02, 0x66, + 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8a, 0xc1, 0x88, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, + 0x01, 0x8c, 0xc8, 0x33, 0x01, 0x9e, 0x10, 0xe8, 0x8a, 0x33, 0x00, 0x02, 0x16, 0x38, 0x8a, 0x73, + 0x00, 0x02, 0x16, 0x35, 0x04, 0x5a, 0x8a, 0x20, 0xe9, 0x8a, 0x00, 0x02, 0x16, 0x30, 0x8a, 0x60, + 0xe9, 0x8e, 0x00, 0x02, 0x16, 0x2c, 0x07, 0x82, 0xea, 0x34, 0x10, 0x01, 0xc0, 0xb3, 0x02, 0x04, + 0x04, 0x80, 0xd1, 0x52, 0x13, 0x03, 0x9d, 0x32, 0x16, 0x22, 0x10, 0xfb, 0x07, 0x85, 0x80, 0x00, + 0xd8, 0x05, 0x04, 0x80, 0x04, 0xc7, 0x04, 0x5a, 0xc8, 0x20, 0x00, 0xc0, 0x00, 0x0c, 0xc8, 0x20, + 0x00, 0xc2, 0x00, 0x0e, 0xc8, 0x20, 0x00, 0xc4, 0x00, 0x10, 0xc8, 0x20, 0x00, 0xc6, 0x00, 0x12, + 0xc8, 0x20, 0x00, 0xc8, 0x00, 0x14, 0xc8, 0x20, 0x00, 0xca, 0x00, 0x16, 0xc8, 0x20, 0x00, 0xcc, + 0x00, 0x04, 0xc8, 0x20, 0x00, 0xce, 0x00, 0x06, 0x03, 0x00, 0x00, 0x0f, 0x05, 0xcc, 0x04, 0x5c, + 0x04, 0xe0, 0x01, 0x82, 0x02, 0x02, 0xe5, 0xd8, 0xc8, 0x32, 0x01, 0x82, 0xc8, 0x32, 0x01, 0x80, + 0x06, 0xa0, 0xef, 0xe2, 0xc8, 0x12, 0x01, 0x82, 0xc2, 0xca, 0x07, 0x84, 0x07, 0xd0, 0x04, 0xe0, + 0x01, 0x84, 0x06, 0x04, 0x16, 0xfc, 0xc1, 0x20, 0x01, 0x84, 0x16, 0xe9, 0x02, 0x04, 0x00, 0x32, + 0x07, 0x85, 0x80, 0x00, 0xd8, 0x05, 0x04, 0x80, 0x04, 0xc7, 0xc1, 0x60, 0x01, 0x86, 0x06, 0x04, + 0x16, 0xfc, 0xc1, 0x20, 0x01, 0x84, 0x04, 0x5b, 0xc0, 0xb3, 0xc4, 0xb3, 0x04, 0x5b, 0xc0, 0x48, + 0xc0, 0xb3, 0xa0, 0x73, 0xc4, 0x42, 0x04, 0x5b, 0x88, 0x33, 0x01, 0x84, 0x16, 0xe6, 0x04, 0x5a, + 0xc1, 0x89, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8a, 0x04, 0x5b, 0x04, 0xc5, + 0x07, 0xa0, 0x01, 0x9c, 0x00, 0x40, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x13, 0x03, 0x06, 0x05, + 0x16, 0xf7, 0x04, 0x5c, 0x04, 0x5b, 0x06, 0xa0, 0xf0, 0x6a, 0xc0, 0x60, 0x01, 0x40, 0xc8, 0x05, + 0x01, 0x40, 0xc5, 0x02, 0xc8, 0x01, 0x01, 0x40, 0x04, 0x5a, 0x06, 0xa0, 0xf0, 0x6a, 0xa1, 0x08, + 0x10, 0xf4, 0xc0, 0xb3, 0xc1, 0x33, 0xc1, 0x60, 0x01, 0x40, 0x01, 0x85, 0x04, 0x00, 0x01, 0xc5, + 0x10, 0x00, 0x04, 0x5b, 0xc1, 0x08, 0xc2, 0x09, 0xc2, 0x44, 0x04, 0x5b, 0x02, 0x05, 0x00, 0xc8, + 0x06, 0x05, 0x16, 0xfe, 0x04, 0x5b, 0xc1, 0x33, 0xc0, 0x03, 0xc0, 0xc4, 0x04, 0x5b, 0xc0, 0xc0, + 0x04, 0x5b, 0x94, 0xe0, 0x01, 0x9e, 0x16, 0xc2, 0x05, 0xc3, 0x04, 0x5b, 0xc0, 0x73, 0x06, 0xa0, + 0xf0, 0xe4, 0x02, 0x2d, 0x00, 0x08, 0x07, 0x85, 0x00, 0x08, 0x9f, 0x71, 0x16, 0xb7, 0x06, 0x05, + 0x16, 0xfc, 0x04, 0x5a, 0x02, 0x02, 0xe5, 0xe4, 0x04, 0x60, 0xee, 0xce, 0x8c, 0xe9, 0x00, 0x04, + 0x16, 0xad, 0x04, 0x5b, 0xc1, 0x20, 0x01, 0x80, 0x07, 0x85, 0x07, 0xd0, 0x01, 0xe0, 0x01, 0x80, + 0x04, 0x00, 0x06, 0x45, 0x16, 0xfe, 0xc8, 0x04, 0x01, 0x80, 0x04, 0x5b, 0xc1, 0x33, 0xc3, 0x48, + 0xc1, 0x04, 0x13, 0x04, 0x02, 0x2d, 0x04, 0x00, 0x06, 0x04, 0x16, 0xfc, 0x04, 0x5b, 0xc3, 0x8d, + 0x06, 0xa0, 0xf0, 0xe4, 0xc1, 0x8d, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc7, 0x86, 0x04, 0x5a, + 0xc1, 0x8d, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8a, 0x04, 0x5b, 0xc1, 0x8d, + 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8c, 0x04, 0x5b, 0xc0, 0x4d, 0x02, 0x04, + 0x00, 0x28, 0x07, 0x85, 0x55, 0x00, 0x04, 0x60, 0xee, 0xf2, 0xc0, 0x4d, 0xc0, 0xb3, 0xc1, 0x32, + 0x04, 0x60, 0xee, 0xb6, 0xc1, 0x33, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04, 0x16, 0x01, 0x04, 0x5b, + 0xc0, 0xc4, 0x04, 0x5b, 0x07, 0x89, 0xe5, 0x26, 0xc2, 0x39, 0x13, 0x07, 0xc6, 0x39, 0x86, 0x39, + 0x16, 0x25, 0xc6, 0x39, 0x86, 0x39, 0x16, 0x22, 0x10, 0xf7, 0x02, 0x02, 0xf1, 0x6a, 0x04, 0xc4, + 0x04, 0xc5, 0xc2, 0x39, 0x13, 0x02, 0x04, 0x60, 0xf1, 0xa6, 0x02, 0x02, 0xf1, 0x78, 0x04, 0xc4, + 0xc2, 0x39, 0x13, 0x03, 0xc1, 0x79, 0x04, 0x60, 0xf1, 0xa6, 0x02, 0x02, 0xf1, 0x88, 0x04, 0xc5, + 0xc2, 0x39, 0x13, 0x03, 0xc1, 0x39, 0x04, 0x60, 0xf1, 0xa6, 0xc0, 0x79, 0xc0, 0xb9, 0x60, 0x81, + 0x05, 0xc2, 0x09, 0x12, 0x04, 0xf1, 0x06, 0x02, 0x16, 0xfd, 0x04, 0x5b, 0x04, 0x5c, 0x02, 0x01, + 0xaa, 0xaa, 0xc6, 0x01, 0xe0, 0x44, 0x40, 0x45, 0x80, 0x58, 0x16, 0xf8, 0x02, 0x01, 0x00, 0x14, + 0x06, 0x01, 0x16, 0xfe, 0x02, 0x01, 0x55, 0x55, 0xc6, 0x01, 0xe0, 0x44, 0x40, 0x45, 0x80, 0x58, + 0x16, 0xed, 0x04, 0x52, 0x02, 0xe0, 0x00, 0xa0, 0x07, 0x88, 0x00, 0xc0, 0x02, 0x09, 0xf2, 0x20, + 0x07, 0x84, 0xe5, 0xea, 0x02, 0x05, 0x00, 0x01, 0xc2, 0x8b, 0x04, 0xcc, 0x06, 0xa0, 0xf2, 0x2a, + 0x2c, 0x60, 0x00, 0x01, 0x06, 0x99, 0x2c, 0xa0, 0x00, 0x02, 0x06, 0x99, 0x2d, 0x20, 0x00, 0x04, + 0x06, 0x99, 0x2e, 0x20, 0x00, 0x08, 0x06, 0x99, 0x2f, 0xa0, 0x00, 0x10, 0x05, 0x8c, 0x16, 0x09, + 0xcc, 0x80, 0xc4, 0x81, 0x07, 0x83, 0xf2, 0x6e, 0xc0, 0x88, 0x04, 0x02, 0x05, 0x8c, 0x16, 0x01, + 0x10, 0x33, 0x02, 0xe0, 0x00, 0xa0, 0x04, 0x5a, 0x05, 0x8c, 0x16, 0xfb, 0xcc, 0x80, 0xc4, 0x81, + 0x0a, 0x15, 0xc0, 0xb4, 0xc0, 0x12, 0xcc, 0x88, 0xc0, 0x52, 0xc4, 0xb4, 0x06, 0x42, 0x04, 0x5b, + 0x07, 0x2d, 0x00, 0x18, 0x8b, 0x41, 0x00, 0x0a, 0x16, 0xec, 0x82, 0xc1, 0x16, 0xea, 0x02, 0xc2, + 0x02, 0x42, 0x02, 0x00, 0x16, 0xe6, 0x03, 0x80, 0x07, 0x81, 0x00, 0x01, 0x10, 0xf1, 0x02, 0x01, + 0x00, 0x02, 0x10, 0xee, 0x02, 0x01, 0x00, 0x04, 0x10, 0xeb, 0x02, 0x01, 0x00, 0x08, 0x10, 0xe8, + 0x02, 0x01, 0x00, 0x10, 0x10, 0xe5, 0x02, 0xa1, 0x8b, 0x41, 0x00, 0x10, 0x13, 0x02, 0x04, 0x60, + 0xf2, 0x1a, 0x07, 0x2d, 0x00, 0x18, 0x03, 0x80, 0x02, 0x09, 0x08, 0x00, 0x02, 0x03, 0x00, 0x04, + 0x04, 0xc7, 0x06, 0xa0, 0xf3, 0x9a, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04, 0x16, 0x1c, 0x01, 0xa0, + 0x01, 0x40, 0x08, 0x00, 0x01, 0xe0, 0x01, 0x40, 0x10, 0x00, 0x02, 0x04, 0x00, 0x01, 0xce, 0x44, + 0x06, 0xc4, 0xc6, 0x44, 0x01, 0xa0, 0x01, 0x40, 0x10, 0x00, 0x06, 0x49, 0x01, 0xa0, 0x01, 0x40, + 0x40, 0x00, 0x01, 0xe0, 0x01, 0x40, 0x04, 0x00, 0x01, 0xe0, 0x01, 0x40, 0x08, 0x00, 0x06, 0xa0, + 0xf4, 0x38, 0x06, 0xa0, 0xf4, 0x38, 0x05, 0xc7, 0x02, 0x04, 0xe4, 0xa4, 0x04, 0xe0, 0x03, 0xd0, + 0xc1, 0x74, 0xc1, 0xb4, 0x05, 0x86, 0x13, 0x1c, 0x02, 0xe0, 0x00, 0xc0, 0x02, 0x00, 0x00, 0x00, + 0xc0, 0x40, 0xc0, 0x80, 0xc0, 0xc0, 0xc1, 0x00, 0xc1, 0x40, 0xc1, 0x80, 0xc1, 0xc0, 0xc2, 0x00, + 0xc2, 0x40, 0xc2, 0x80, 0xc2, 0xc0, 0xc3, 0x00, 0xc3, 0x40, 0xc3, 0x80, 0xc3, 0xc0, 0x04, 0xa0, + 0x00, 0xaa, 0x03, 0xd0, 0x03, 0xd0, 0x10, 0x3f, 0x05, 0x85, 0x81, 0x85, 0x13, 0xe1, 0x10, 0xe4, + 0x05, 0xc7, 0x02, 0x05, 0x7f, 0xff, 0xa1, 0x45, 0x03, 0xd0, 0x03, 0xd0, 0x10, 0x34, 0xcc, 0xc0, + 0xc4, 0xc1, 0x02, 0x03, 0x00, 0x28, 0x06, 0xa0, 0xf3, 0x9a, 0x01, 0xe0, 0x01, 0x42, 0x10, 0x00, + 0x05, 0xc7, 0x03, 0xd0, 0x03, 0xd0, 0x10, 0x27, 0x05, 0xc7, 0xc1, 0xa0, 0x01, 0x4a, 0x07, 0xa0, + 0x01, 0x4a, 0x0e, 0x00, 0x01, 0xa0, 0x01, 0x40, 0x02, 0x00, 0x07, 0x20, 0x01, 0x44, 0xc1, 0x60, + 0x01, 0x44, 0x02, 0x85, 0xff, 0x00, 0x16, 0x17, 0x01, 0xe0, 0x01, 0x40, 0x22, 0x00, 0x02, 0x05, + 0x00, 0xc0, 0x06, 0x05, 0x03, 0xd0, 0x16, 0xfd, 0xc1, 0x60, 0x01, 0x46, 0x02, 0x85, 0xff, 0x00, + 0x13, 0x0a, 0x02, 0x05, 0x33, 0x93, 0x06, 0x05, 0x00, 0x00, 0xf3, 0x80, 0x00, 0x0b, 0x10, 0x00, + 0x00, 0x00, 0xf3, 0x8a, 0x04, 0x9c, 0x03, 0xd0, 0x16, 0xf8, 0x10, 0x51, 0xc8, 0x06, 0x01, 0x4a, + 0xcc, 0xc0, 0xc4, 0xc1, 0x10, 0x4b, 0xc0, 0x13, 0xcc, 0xc8, 0xc0, 0x53, 0x02, 0x02, 0xf3, 0xaa, + 0xc4, 0xc2, 0x06, 0x43, 0x04, 0x5b, 0xc0, 0x60, 0x00, 0xae, 0x02, 0xc4, 0x02, 0x44, 0x00, 0x0f, + 0x88, 0x44, 0xe4, 0x8a, 0x16, 0x3c, 0x02, 0x81, 0x00, 0x08, 0x13, 0x27, 0xc1, 0x21, 0xe4, 0x9c, + 0xc1, 0x14, 0x21, 0x21, 0xe4, 0x7a, 0x16, 0x33, 0xc1, 0x21, 0xe4, 0x82, 0x02, 0x81, 0x00, 0x00, + 0x13, 0x0b, 0x02, 0x0d, 0x00, 0xa0, 0x83, 0x84, 0x13, 0x09, 0x05, 0xc4, 0x83, 0x84, 0x13, 0x06, + 0x05, 0xc4, 0x83, 0x84, 0x13, 0x03, 0x10, 0x23, 0x81, 0x0e, 0x16, 0x21, 0xc1, 0x21, 0xe4, 0x9c, + 0x45, 0x21, 0xe4, 0x7a, 0x01, 0xe0, 0x01, 0x42, 0x10, 0x00, 0x01, 0xa0, 0x01, 0x42, 0x10, 0x00, + 0xc3, 0xa1, 0xe4, 0x94, 0x02, 0x0f, 0x00, 0x2f, 0x03, 0x80, 0x01, 0xa0, 0x01, 0x40, 0x02, 0x00, + 0x01, 0xa0, 0x01, 0x40, 0x80, 0x00, 0xc0, 0x6d, 0x00, 0x0a, 0x13, 0x09, 0x02, 0x81, 0x12, 0x5c, + 0x1b, 0x06, 0x02, 0x0e, 0xf3, 0x90, 0x02, 0x0f, 0x00, 0x0f, 0x03, 0x80, 0x05, 0xca, 0x02, 0xe0, + 0x00, 0xa0, 0x04, 0x5a, 0xce, 0x59, 0x88, 0x20, 0xe4, 0xa4, 0xe4, 0xa4, 0x10, 0xf8, 0x04, 0xc1, + 0x62, 0x48, 0x05, 0x89, 0xc0, 0xa0, 0x01, 0x6c, 0xc8, 0x08, 0x01, 0x6c, 0x02, 0x03, 0xfc, 0x00, + 0x02, 0x04, 0x02, 0x00, 0xa0, 0x73, 0x06, 0x04, 0x16, 0xfd, 0x05, 0x88, 0x06, 0x09, 0x16, 0xf4, + 0xc8, 0x02, 0x01, 0x6c, 0x86, 0x81, 0x16, 0x02, 0x03, 0xd0, 0x05, 0xcb, 0x04, 0x5b, 0xc0, 0x48, + 0xc0, 0x89, 0x60, 0x81, 0x05, 0xc2, 0x04, 0x5b, 0xc3, 0x0b, 0x06, 0xa0, 0xf4, 0x72, 0xcc, 0x41, + 0x06, 0x42, 0x16, 0xfd, 0x06, 0xa0, 0xf4, 0x72, 0xc1, 0x01, 0x8c, 0x44, 0x16, 0x12, 0x05, 0xc4, + 0x06, 0x42, 0x16, 0xfb, 0x02, 0x04, 0xf4, 0xb8, 0x02, 0x03, 0x01, 0x01, 0x06, 0x94, 0x02, 0x03, + 0x5a, 0x5a, 0x06, 0x94, 0x05, 0x43, 0x06, 0x94, 0x07, 0x03, 0x06, 0x94, 0x04, 0xc3, 0x06, 0x94, + 0x05, 0xcc, 0x04, 0x5c, 0xc1, 0xcb, 0x06, 0xa0, 0xf4, 0x72, 0xcc, 0x43, 0x06, 0x42, 0x16, 0xfd, + 0x06, 0xa0, 0xf4, 0x72, 0x8c, 0x43, 0x16, 0xf5, 0x06, 0x42, 0x16, 0xfc, 0x04, 0x57, 0xc2, 0x8b, + 0xc0, 0x08, 0xc1, 0x49, 0x05, 0x85, 0x02, 0x80, 0x00, 0x40, 0x11, 0x03, 0x02, 0x80, 0x00, 0x4f, + 0x12, 0x45, 0x02, 0x01, 0xf4, 0x72, 0x09, 0xa1, 0x80, 0x01, 0x13, 0x40, 0x02, 0x01, 0xf5, 0xa2, + 0x09, 0xa1, 0x80, 0x01, 0x13, 0x3b, 0xc0, 0x60, 0x00, 0x06, 0x09, 0xa1, 0x80, 0x01, 0x13, 0x36, + 0x05, 0x81, 0x80, 0x01, 0x13, 0x33, 0xc0, 0x4a, 0x09, 0xa1, 0x80, 0x01, 0x13, 0x2f, 0xc8, 0x00, + 0x01, 0x6a, 0x02, 0x80, 0x00, 0x80, 0x14, 0x17, 0x02, 0x01, 0xf8, 0x00, 0xc1, 0xa0, 0x01, 0x40, + 0x01, 0xa0, 0x01, 0x40, 0x04, 0x00, 0x02, 0x02, 0x10, 0x00, 0x02, 0x03, 0x04, 0x00, 0xcc, 0xb1, + 0x06, 0x43, 0x16, 0xfd, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0x02, 0x08, 0xf8, 0x10, 0xc8, 0x06, + 0x01, 0x40, 0xc0, 0x00, 0x13, 0x02, 0x02, 0x08, 0xf8, 0x00, 0x02, 0x09, 0xfb, 0xfe, 0x06, 0xa0, + 0xf4, 0x7c, 0x10, 0x25, 0x02, 0x80, 0x00, 0x80, 0x14, 0x09, 0x02, 0x01, 0xf8, 0x00, 0x02, 0x02, + 0x10, 0x00, 0x02, 0x03, 0x04, 0x00, 0xcc, 0x72, 0x06, 0x43, 0x16, 0xfd, 0x05, 0x80, 0x02, 0x80, + 0x00, 0x80, 0x12, 0x04, 0x01, 0x60, 0x01, 0x04, 0x00, 0x20, 0x13, 0x05, 0x81, 0x40, 0x16, 0xab, + 0x02, 0x80, 0x00, 0x80, 0x14, 0x0b, 0x07, 0xa0, 0x01, 0x6a, 0x00, 0x7e, 0x02, 0x02, 0x10, 0x00, + 0x02, 0x03, 0x04, 0x00, 0x04, 0xc1, 0xcc, 0x81, 0x06, 0x43, 0x16, 0xfd, 0x05, 0xca, 0x04, 0x5a, + 0x02, 0x00, 0xf5, 0x94, 0x02, 0x01, 0xf6, 0xc4, 0x02, 0x40, 0xfc, 0x00, 0x02, 0x41, 0xfc, 0x00, + 0x80, 0x40, 0x13, 0x04, 0x07, 0xa0, 0x01, 0x04, 0x00, 0x3c, 0x04, 0x5b, 0x04, 0xc0, 0x02, 0x01, + 0x00, 0x08, 0x02, 0x02, 0x12, 0x00, 0xc1, 0xe0, 0x01, 0x40, 0x01, 0xa0, 0x01, 0x40, 0x04, 0x00, + 0x02, 0x03, 0x01, 0x00, 0xc8, 0x00, 0x01, 0x6a, 0xcc, 0xa0, 0xf8, 0x10, 0x05, 0x80, 0x06, 0x03, + 0x16, 0xf9, 0x02, 0x22, 0x02, 0x00, 0x06, 0x01, 0x16, 0xf3, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, + 0xc8, 0x07, 0x01, 0x40, 0x02, 0x00, 0x08, 0x00, 0xc0, 0x40, 0x06, 0x01, 0xc8, 0x01, 0x01, 0x6a, + 0x02, 0x61, 0x80, 0x00, 0xc8, 0x01, 0xf8, 0x10, 0x06, 0x00, 0x16, 0xf6, 0x04, 0xc0, 0x04, 0xc8, + 0x04, 0xc9, 0x02, 0x03, 0x08, 0x00, 0xc8, 0x00, 0x01, 0x6a, 0xc1, 0x80, 0x02, 0x66, 0x80, 0x00, + 0xc1, 0x20, 0xf8, 0x10, 0x81, 0x06, 0x16, 0x15, 0xc2, 0x08, 0x13, 0x06, 0x05, 0x80, 0x06, 0x03, + 0x16, 0xf2, 0xc2, 0x08, 0x13, 0x0d, 0x10, 0x19, 0x07, 0xa0, 0xf8, 0x10, 0x55, 0x55, 0xc1, 0x20, + 0xf8, 0x10, 0x02, 0x84, 0x55, 0x55, 0x16, 0x02, 0xc2, 0x06, 0x10, 0xf0, 0x81, 0x06, 0x13, 0xee, + 0x04, 0x5b, 0x07, 0xa0, 0xf8, 0x10, 0x55, 0x55, 0xc1, 0x60, 0xf8, 0x10, 0x81, 0x05, 0x13, 0x03, + 0x02, 0x85, 0x55, 0x55, 0x16, 0xf5, 0xc2, 0x08, 0x13, 0xe1, 0xc2, 0x40, 0x06, 0x09, 0x02, 0x48, + 0x07, 0xff, 0x04, 0xc0, 0x02, 0x01, 0x00, 0x08, 0x02, 0x02, 0x12, 0x00, 0x02, 0x03, 0x01, 0x00, + 0xc8, 0x00, 0x01, 0x6a, 0xc8, 0x32, 0xf8, 0x10, 0x05, 0x80, 0x06, 0x03, 0x16, 0xf9, 0x02, 0x22, + 0x02, 0x00, 0x06, 0x01, 0x16, 0xf3, 0x02, 0x88, 0x00, 0x40, 0x15, 0x13, 0x02, 0x89, 0x00, 0x4f, + 0x11, 0x10, 0x04, 0xc0, 0x02, 0x02, 0x12, 0x00, 0x02, 0x01, 0x00, 0x08, 0x02, 0x03, 0x01, 0x00, + 0xcc, 0x80, 0x06, 0x03, 0x16, 0xfd, 0x02, 0x22, 0x02, 0x00, 0x06, 0x01, 0x16, 0xf7, 0x05, 0xcb, + 0x04, 0x5b, 0x07, 0xa0, 0x01, 0x04, 0x00, 0x37, 0x04, 0x5b, 0x28, 0x43, 0x29, 0x31, 0x39, 0x38, + 0x33, 0x2d, 0x38, 0x38, 0x20, 0x42, 0x59, 0x20, 0x54, 0x49, 0xc2, 0x4b, 0x02, 0xa8, 0x00, 0x98, + 0x07, 0x83, 0x00, 0x02, 0x02, 0x28, 0x00, 0x08, 0xc6, 0x23, 0xe4, 0xf6, 0x06, 0x48, 0xc0, 0xc4, + 0x0a, 0x73, 0x17, 0x65, 0x06, 0xa0, 0xf7, 0xc4, 0xc1, 0xc8, 0x05, 0xc7, 0x02, 0x03, 0x00, 0xa5, + 0x03, 0xb0, 0xcd, 0xf8, 0xcd, 0xf8, 0x02, 0xa6, 0x62, 0x06, 0x02, 0x88, 0x00, 0x0a, 0x16, 0x57, + 0x29, 0x03, 0x16, 0x55, 0x29, 0x05, 0x80, 0xc4, 0x16, 0x52, 0x09, 0x15, 0x17, 0x50, 0x09, 0x15, + 0x18, 0x4e, 0x02, 0x85, 0x00, 0x29, 0x16, 0x4b, 0x05, 0xc6, 0x00, 0x96, 0x07, 0x03, 0x04, 0xc4, + 0x06, 0x45, 0x00, 0x95, 0x05, 0x44, 0x16, 0x43, 0x81, 0x44, 0x16, 0x41, 0x03, 0x00, 0x00, 0x05, + 0x02, 0xc4, 0x03, 0x00, 0x00, 0x0a, 0x02, 0x44, 0x00, 0x0f, 0x02, 0x84, 0x00, 0x05, 0x16, 0x37, + 0x02, 0xc4, 0x03, 0x00, 0x00, 0x0f, 0x02, 0x44, 0x00, 0x0f, 0x02, 0x84, 0x00, 0x0a, 0x16, 0x2f, + 0x02, 0x04, 0xff, 0xfe, 0x13, 0x2c, 0x15, 0x2b, 0x1a, 0x2a, 0x05, 0x84, 0x12, 0x28, 0x15, 0x27, + 0x1a, 0x26, 0x18, 0x25, 0x05, 0x84, 0x16, 0x23, 0x1b, 0x22, 0x17, 0x21, 0x05, 0x84, 0x13, 0x1f, + 0x1a, 0x1e, 0x11, 0x1d, 0x06, 0x04, 0x16, 0x1b, 0x02, 0xa5, 0xc1, 0xc5, 0x02, 0x25, 0x00, 0x06, + 0x02, 0x03, 0xa5, 0xa5, 0xc1, 0x83, 0x00, 0x95, 0x38, 0x03, 0x00, 0x94, 0x02, 0x83, 0x6b, 0x2e, + 0x16, 0x0e, 0x02, 0x84, 0x1c, 0x59, 0x16, 0x0b, 0x02, 0x24, 0x00, 0x69, 0x00, 0x95, 0x3c, 0x03, + 0x00, 0x94, 0x81, 0x83, 0x16, 0x04, 0x02, 0x84, 0x00, 0x69, 0x16, 0x01, 0x05, 0xc9, 0x04, 0x59, + 0xd0, 0xc3, 0x13, 0xfd, 0x1c, 0x01, 0x10, 0xfb, 0x90, 0xe0, 0xe4, 0xfd, 0x16, 0xf8, 0x06, 0xc3, + 0xd0, 0xc3, 0x1c, 0xf5, 0x16, 0xf4, 0x90, 0xe0, 0xe4, 0xfa, 0x16, 0xf1, 0x04, 0x5b, 0xc3, 0x0b, + 0x02, 0x09, 0xe4, 0xfe, 0x06, 0xa0, 0xf1, 0x50, 0x05, 0xcc, 0x04, 0x5c, 0x07, 0x88, 0xb0, 0x00, + 0x07, 0x89, 0xff, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a, 0xe0, 0x02, 0x06, 0xa0, 0xf4, 0x42, + 0x00, 0x00, 0x07, 0x88, 0xa0, 0x00, 0x07, 0x89, 0xaf, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a, + 0xe0, 0x78, 0x06, 0xa0, 0xf4, 0x42, 0x00, 0x00, 0x06, 0xa0, 0xf6, 0xde, 0x00, 0x00, 0x10, 0xe6, + 0x10, 0xe5, 0x00, 0x00, 0xf8, 0x26, 0x07, 0x93, 0x00, 0x00, 0x00, 0x00, 0xff, 0xb8, 0x00, 0x48, + 0x28, 0x43, 0x29, 0x31, 0x39, 0x38, 0x33, 0x2d, 0x38, 0x39, 0x2c, 0x39, 0x30, 0x2d, 0x39, 0x34, + 0x20, 0x54, 0x65, 0x78, 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x0a, 0x28, 0x43, 0x29, 0x31, 0x39, 0x38, 0x33, 0x2c, 0x34, 0x2c, 0x35, 0x2c, 0x36, + 0x20, 0x49, 0x42, 0x4d, 0x20, 0x43, 0x6f, 0x72, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0x34, 0xff, 0xb8, 0x00, 0x80, 0xb0, 0x3e, 0x20, 0x00, 0x90, 0x00, 0x0d, 0xd2, 0x45, 0x4f, + 0x20, 0x56, 0x32, 0x32, 0x38, 0x2e, 0x31, 0x30, 0x2e, 0x31, 0x38, 0x20, 0x20, 0x28, 0x43, 0x29, + 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4f, 0x6c, 0x69, 0x63, 0x6f, + 0x6d, 0x20, 0x31, 0x39, 0x39, 0x38, 0x2e, 0x00, 0x03, 0x00, 0x00, 0x02, 0xc0, 0xa0, 0x01, 0x6a, + 0xc3, 0x0e, 0x09, 0xac, 0xc8, 0x0c, 0x01, 0x6a, 0xc3, 0x0e, 0x02, 0x4c, 0x03, 0xff, 0xd8, 0xec, + 0xf8, 0x00, 0x13, 0xc0, 0x05, 0x83, 0x02, 0x43, 0x00, 0x3f, 0xd8, 0xec, 0xf8, 0x01, 0x13, 0xc0, + 0xc8, 0x02, 0x01, 0x6a, 0x05, 0xce, 0x03, 0x90, 0xef, 0xff, 0x03, 0x80, 0x11, 0x08, 0xc3, 0xbc, + 0xdf, 0xbc, 0x06, 0x0d, 0x16, 0xfd, 0x05, 0x8c, 0x01, 0x8c, 0x00, 0x01, 0x10, 0x12, 0xc3, 0xbc, + 0xc3, 0xfc, 0x01, 0x8d, 0x80, 0x00, 0x13, 0x0d, 0x01, 0x0d, 0x40, 0x00, 0x16, 0x04, 0xdf, 0x8f, + 0x06, 0x0d, 0x16, 0xfd, 0x10, 0x06, 0x01, 0x8d, 0x40, 0x01, 0x13, 0x03, 0xcf, 0x8f, 0x06, 0x4d, + 0x16, 0xfd, 0xc3, 0x7c, 0x16, 0xe3, 0x04, 0x5b, 0xc1, 0x60, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, + 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x0e, + 0xc8, 0x0d, 0x01, 0x6c, 0x07, 0x0f, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, + 0x88, 0x0f, 0xfc, 0x06, 0x13, 0xf8, 0xd8, 0x20, 0xe0, 0x0a, 0xfc, 0x06, 0xc8, 0x05, 0x01, 0x6c, + 0x07, 0x8f, 0xfc, 0x00, 0xc1, 0x5f, 0x13, 0xe0, 0x04, 0xff, 0x07, 0xbf, 0x81, 0x00, 0x07, 0x20, + 0xff, 0xfe, 0xc7, 0xc2, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, + 0x01, 0x03, 0x13, 0xf8, 0xc2, 0x8a, 0x16, 0x23, 0xc8, 0x0d, 0x01, 0x8c, 0xc2, 0xcd, 0xc3, 0x20, + 0x01, 0x6c, 0x07, 0x8a, 0x00, 0x01, 0xd2, 0x8e, 0x15, 0x2d, 0x05, 0xa0, 0x10, 0x84, 0x07, 0x8d, + 0x01, 0x04, 0x01, 0x5d, 0x21, 0x00, 0x16, 0x03, 0x07, 0x9d, 0xde, 0x8c, 0x10, 0x25, 0x01, 0x5d, + 0x01, 0x00, 0x16, 0x22, 0xc3, 0xdd, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x4f, + 0x01, 0x5d, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xe0, 0x07, 0x78, 0x80, 0x00, 0x10, 0x15, 0xc3, 0xe0, + 0x01, 0x6c, 0xc8, 0x09, 0x01, 0x6c, 0x13, 0x08, 0xc8, 0x0d, 0xfc, 0x00, 0xc2, 0x4f, 0x05, 0x87, + 0xf1, 0xce, 0xc3, 0x8e, 0x11, 0xda, 0x10, 0x06, 0xc2, 0x0d, 0xc2, 0x4f, 0x07, 0x87, 0x00, 0x01, + 0xd1, 0xce, 0x11, 0xd3, 0x05, 0xa0, 0x10, 0x84, 0xc8, 0x06, 0x07, 0x92, 0x07, 0x81, 0x01, 0x0a, + 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x04, 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x20, 0xfc, 0x06, + 0x03, 0x90, 0xa0, 0x07, 0x02, 0xe0, 0x07, 0x78, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0xcc, 0x66, + 0x00, 0x04, 0xcc, 0x43, 0xcc, 0x76, 0xcc, 0x76, 0xc8, 0x44, 0x00, 0x02, 0xc4, 0x45, 0x07, 0xa1, + 0xff, 0xee, 0x60, 0x81, 0xc3, 0x45, 0xc0, 0xb6, 0x80, 0xc2, 0x1b, 0x63, 0xc3, 0x96, 0x04, 0xf6, + 0x02, 0x46, 0xfe, 0xf8, 0x01, 0x4e, 0x40, 0x00, 0x16, 0x02, 0x04, 0x60, 0x90, 0xaa, 0x07, 0x81, + 0x01, 0x0a, 0xa1, 0x02, 0xc0, 0x83, 0x02, 0x22, 0x00, 0x06, 0x60, 0x84, 0x15, 0x25, 0x07, 0x84, + 0x00, 0x06, 0xc0, 0x83, 0xc8, 0x05, 0x01, 0x6c, 0xc8, 0x02, 0xfc, 0x04, 0x07, 0xa0, 0xfc, 0x02, + 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0xc1, 0x60, 0x01, 0x6c, 0xc8, 0x06, 0x07, 0x92, 0x02, 0xe0, + 0x07, 0x78, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0xc8, 0x05, 0x01, 0x6c, 0xc1, 0x60, 0xfc, 0x00, + 0x16, 0x16, 0x10, 0xf1, 0xc8, 0x06, 0x07, 0x92, 0x03, 0x90, 0x80, 0x03, 0x02, 0xe0, 0x07, 0x78, + 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0x10, 0x0b, 0xc3, 0xe6, 0x00, 0x06, 0x13, 0xf3, 0x03, 0x00, + 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0xcc, 0x66, + 0x00, 0x04, 0xcc, 0x42, 0xcc, 0x76, 0xcc, 0x76, 0xc8, 0x44, 0x00, 0x02, 0xc4, 0x45, 0x07, 0xa1, + 0xff, 0xee, 0x60, 0x81, 0x05, 0xa0, 0x10, 0x84, 0x65, 0x82, 0x15, 0x0e, 0xa0, 0xb6, 0xc3, 0x96, + 0x04, 0xf6, 0x02, 0x46, 0xfe, 0xf8, 0x01, 0x4e, 0x40, 0x00, 0x16, 0xb1, 0xa0, 0x84, 0x07, 0x84, + 0x00, 0x06, 0x60, 0x84, 0x04, 0x60, 0x90, 0xaa, 0x02, 0x26, 0xff, 0xfc, 0xc0, 0x36, 0xc0, 0x76, + 0x10, 0x06, 0x02, 0x26, 0xff, 0xfa, 0xc0, 0x36, 0xc0, 0x76, 0xc0, 0x83, 0x65, 0x82, 0x07, 0x84, + 0x00, 0x06, 0xa0, 0x42, 0x17, 0x01, 0x05, 0x80, 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x8f, 0xfc, 0x00, + 0xc1, 0x7f, 0x16, 0x09, 0xc1, 0x60, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, + 0x02, 0xe0, 0x08, 0x5c, 0x10, 0xf1, 0x07, 0xbf, 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0xc7, 0xc3, + 0xc0, 0xb6, 0xc3, 0x96, 0x04, 0xf6, 0x02, 0x46, 0xfe, 0xf8, 0x27, 0xa0, 0x08, 0x98, 0x13, 0x0d, + 0xc3, 0xc5, 0xc8, 0x0e, 0x08, 0x8e, 0xc3, 0xa0, 0x08, 0x90, 0xc0, 0xee, 0xff, 0xfe, 0x05, 0xa0, + 0x08, 0xa0, 0x16, 0x32, 0x05, 0xa0, 0x08, 0x9e, 0x10, 0x2f, 0x07, 0x83, 0x03, 0xf8, 0x06, 0x20, + 0x08, 0x9c, 0x13, 0x02, 0x04, 0x60, 0x95, 0x0c, 0xc3, 0xe0, 0x08, 0x9a, 0x83, 0xe0, 0x08, 0x98, + 0x13, 0x08, 0xc8, 0x0f, 0x08, 0x98, 0x04, 0xe0, 0x08, 0x9e, 0x04, 0xe0, 0x08, 0xa0, 0x27, 0x8f, + 0x16, 0xdf, 0x04, 0x60, 0x95, 0x0c, 0xc8, 0x0f, 0x01, 0x6c, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, + 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0, 0xfc, 0x04, 0xc8, 0x3e, 0xfc, 0x06, 0xc3, 0xe0, 0xfc, 0x00, + 0x16, 0x0b, 0xc3, 0xe0, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0, + 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c, 0x10, 0xf2, 0x60, 0x9e, 0x87, 0x82, 0x15, 0xe4, 0xa0, 0x9e, + 0x02, 0x82, 0x00, 0xe0, 0x15, 0x1b, 0x02, 0x82, 0x00, 0x70, 0x15, 0x35, 0xc3, 0xa0, 0x08, 0x8e, + 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, + 0x07, 0x8f, 0x01, 0x0a, 0xcf, 0xc2, 0x07, 0x3f, 0xcf, 0xc0, 0xcf, 0xc1, 0xcb, 0xc4, 0x00, 0x02, + 0xc7, 0xc5, 0x07, 0xaf, 0xff, 0xee, 0x60, 0x81, 0x04, 0x60, 0x90, 0xaa, 0xc8, 0x0f, 0x01, 0x6c, + 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0, 0xfc, 0x04, 0xc3, 0xc2, + 0x09, 0x2f, 0xa3, 0xcf, 0xc8, 0x0f, 0xfc, 0x06, 0x60, 0x8f, 0xc3, 0xe0, 0xfc, 0x00, 0x16, 0x0b, + 0xc3, 0xe0, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, + 0xc8, 0x0f, 0x01, 0x6c, 0x10, 0xf2, 0xc8, 0x0f, 0x01, 0x6c, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, + 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0, 0xfc, 0x04, 0x01, 0xc2, 0x80, 0x00, 0xc8, 0x02, 0xfc, 0x06, + 0xc3, 0xe0, 0xfc, 0x00, 0x16, 0x0b, 0xc3, 0xe0, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, + 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c, 0x10, 0xf2, 0xc8, 0x0f, 0x01, 0x6c, + 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0, 0xfc, 0x04, 0xc3, 0x8f, + 0xc3, 0xe0, 0xfc, 0x00, 0x16, 0x0b, 0xc3, 0xe0, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, + 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c, 0x10, 0xf2, 0xc8, 0x05, 0x01, 0x6c, + 0xc0, 0xa0, 0xfc, 0x06, 0x15, 0x0f, 0x01, 0x82, 0x80, 0x00, 0xc3, 0xc2, 0x06, 0x0f, 0x01, 0x8f, + 0x00, 0x01, 0xc8, 0x0f, 0x08, 0x5a, 0xc8, 0x0f, 0xfc, 0x04, 0x63, 0xc2, 0x05, 0x0f, 0xc8, 0x0f, + 0x08, 0x58, 0x10, 0x05, 0x07, 0xa0, 0x00, 0x1a, 0x95, 0x3e, 0xc8, 0x02, 0xfc, 0x04, 0x03, 0x00, + 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x04, 0xe0, + 0x01, 0x02, 0x07, 0x8f, 0x01, 0x0a, 0x07, 0x3f, 0xcf, 0xc2, 0xcf, 0xc0, 0xcf, 0xc1, 0xcb, 0xc4, + 0x00, 0x02, 0xc7, 0xc5, 0x07, 0xaf, 0xff, 0xee, 0x68, 0x81, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, + 0x16, 0x05, 0xc8, 0x0d, 0x01, 0x6c, 0xd8, 0x20, 0xe0, 0x0a, 0xfc, 0x06, 0xc2, 0x8a, 0x16, 0x13, + 0xc8, 0x0d, 0x01, 0x8c, 0xc2, 0xcd, 0xc3, 0x0e, 0x07, 0x8a, 0x00, 0x01, 0xc3, 0xa0, 0x08, 0x8e, + 0xd2, 0x8e, 0x03, 0x00, 0x00, 0x0f, 0x01, 0x60, 0x01, 0x00, 0x08, 0x00, 0x13, 0xfc, 0x03, 0x00, + 0x00, 0x02, 0x04, 0x60, 0x91, 0x54, 0xc8, 0x09, 0x01, 0x6c, 0x13, 0x08, 0xc8, 0x0d, 0xfc, 0x00, + 0xc2, 0x4e, 0x05, 0x87, 0xc3, 0xa0, 0x08, 0x8e, 0xf1, 0xce, 0x10, 0xeb, 0xc2, 0x0d, 0xc2, 0x4e, + 0x07, 0x87, 0x00, 0x01, 0xc3, 0xa0, 0x08, 0x8e, 0xd1, 0xce, 0x10, 0xe3, 0xa0, 0x43, 0x17, 0x01, + 0x05, 0x80, 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x8f, 0xfc, 0x00, 0xc1, 0x7f, 0x16, 0x09, 0xc1, 0x60, + 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0x10, 0xf1, + 0x07, 0xbf, 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0xc7, 0xc3, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, + 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x07, 0x8f, 0x01, 0x0a, 0xcf, 0xc2, + 0xcf, 0xc3, 0xcf, 0xc0, 0xcf, 0xc1, 0xcb, 0xc4, 0x00, 0x02, 0xc7, 0xc5, 0x07, 0xaf, 0xff, 0xee, + 0x60, 0x81, 0x60, 0x83, 0x15, 0xd3, 0xa0, 0x83, 0x04, 0x60, 0x91, 0xb6, 0x03, 0x00, 0x00, 0x02, + 0xc8, 0x0c, 0x01, 0x6a, 0xc3, 0x20, 0xf8, 0x00, 0xc8, 0x0c, 0x01, 0x6a, 0xc1, 0xa0, 0xf8, 0x06, + 0x11, 0x10, 0xc8, 0x06, 0xf8, 0x04, 0x04, 0xe4, 0xff, 0xf6, 0xcd, 0x06, 0x02, 0x24, 0x00, 0x04, + 0xc9, 0x0b, 0x00, 0x02, 0xc5, 0x0c, 0x07, 0xa4, 0xff, 0xee, 0x68, 0x81, 0x03, 0x90, 0x0a, 0x07, + 0x03, 0x80, 0x01, 0x86, 0x80, 0x00, 0xc1, 0x46, 0x06, 0x06, 0x01, 0x86, 0x00, 0x01, 0xc8, 0x06, + 0xf8, 0x04, 0x04, 0xe4, 0xff, 0xf6, 0xcd, 0x05, 0x02, 0x24, 0x00, 0x04, 0xc9, 0x0b, 0x00, 0x02, + 0xc5, 0x0c, 0x07, 0xa4, 0xff, 0xee, 0x68, 0x81, 0x61, 0x46, 0x07, 0xa0, 0x00, 0x1a, 0x95, 0xa8, + 0x03, 0x90, 0x08, 0x07, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc8, 0x0c, 0x01, 0x6a, 0xc1, 0xa6, + 0xf8, 0x06, 0xc3, 0x20, 0xf8, 0x00, 0xc8, 0x0c, 0x01, 0x6a, 0xc8, 0x06, 0xf8, 0x06, 0xc8, 0x05, + 0xf8, 0x04, 0xc3, 0x20, 0xf8, 0x00, 0x04, 0xe0, 0xf8, 0x00, 0x07, 0xa0, 0xf8, 0x02, 0x81, 0x00, + 0x07, 0x20, 0xfb, 0xfe, 0x07, 0xa0, 0x01, 0x00, 0x20, 0x81, 0x03, 0x90, 0x02, 0x07, 0x03, 0x80, + 0xc2, 0x84, 0xc3, 0x0a, 0xc8, 0x0a, 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x02, 0x81, 0x00, 0x13, 0x09, + 0x01, 0x20, 0xf8, 0x02, 0xfe, 0x00, 0x16, 0x0a, 0xc2, 0xa0, 0xf8, 0x00, 0x16, 0xf2, 0x06, 0xa0, + 0x97, 0xb6, 0xc2, 0xa0, 0xf8, 0x00, 0x16, 0xee, 0x06, 0xa0, 0x97, 0xb6, 0xc2, 0xa0, 0xf8, 0x02, + 0x11, 0x09, 0x01, 0x0a, 0x02, 0x00, 0x16, 0x55, 0x01, 0x0a, 0x14, 0x00, 0x13, 0x5f, 0x01, 0x4a, + 0x10, 0x00, 0x16, 0x33, 0x07, 0x0a, 0x26, 0xa0, 0x08, 0x9e, 0x16, 0x02, 0xc2, 0xa0, 0x08, 0xa0, + 0x09, 0x5a, 0x05, 0x0a, 0x02, 0x2a, 0x08, 0x10, 0xc8, 0x0a, 0x08, 0x9c, 0x04, 0xe0, 0x08, 0x98, + 0x07, 0x8a, 0x7f, 0xfe, 0x98, 0x0a, 0x07, 0x2c, 0x13, 0x0a, 0x98, 0x0a, 0x07, 0x20, 0x13, 0x07, + 0x06, 0xca, 0x98, 0x0a, 0x07, 0x2c, 0x13, 0x03, 0x98, 0x0a, 0x07, 0x20, 0x16, 0x0a, 0x01, 0xe0, + 0x06, 0xd2, 0x08, 0x00, 0x01, 0xe0, 0x06, 0x34, 0x08, 0x00, 0x04, 0xe0, 0x06, 0x30, 0x04, 0xcb, + 0x10, 0x0c, 0x07, 0x8a, 0x01, 0x00, 0xb8, 0x0a, 0x07, 0x2c, 0x17, 0x02, 0x78, 0x0a, 0x07, 0x2c, + 0xb8, 0x0a, 0x07, 0x20, 0x17, 0x02, 0x78, 0x0a, 0x07, 0x20, 0xc2, 0xa0, 0xfb, 0xfe, 0x02, 0x4a, + 0x01, 0x00, 0x01, 0xca, 0x80, 0x00, 0xc8, 0x0a, 0xf8, 0x02, 0xc8, 0x0c, 0x01, 0x6a, 0xc2, 0xa0, + 0xf8, 0x02, 0x11, 0x07, 0x07, 0xa0, 0xf8, 0x02, 0x80, 0x00, 0xc8, 0x20, 0xf8, 0x00, 0x01, 0x6a, + 0x10, 0xf6, 0x07, 0x8a, 0x01, 0x8c, 0xc6, 0x8c, 0xc2, 0xcb, 0x03, 0x90, 0xff, 0xdf, 0x13, 0x32, + 0x03, 0x80, 0x01, 0x4a, 0x06, 0x00, 0x13, 0x0a, 0x01, 0xe0, 0x06, 0xd2, 0x02, 0x00, 0x01, 0xe0, + 0x06, 0x34, 0x08, 0x00, 0x04, 0xe0, 0x06, 0x30, 0x01, 0xcb, 0x00, 0x01, 0x88, 0x05, 0x01, 0x6a, + 0x13, 0x1a, 0xc3, 0x20, 0xfb, 0xfe, 0x16, 0x08, 0x04, 0xe0, 0xf8, 0x02, 0xc8, 0x20, 0xf8, 0x00, + 0x01, 0x6a, 0x16, 0xf4, 0x06, 0xa0, 0x97, 0xb6, 0xd2, 0xa0, 0xe0, 0x12, 0xc8, 0x0a, 0xf8, 0x02, + 0xc3, 0x20, 0xf8, 0x00, 0x13, 0x06, 0xc2, 0xa0, 0xf8, 0x02, 0x11, 0xd3, 0xc2, 0x8c, 0x04, 0x60, + 0x95, 0xe6, 0x06, 0xa0, 0x97, 0xb6, 0xc8, 0x0a, 0xf8, 0x02, 0x07, 0x8a, 0x01, 0x8c, 0x01, 0x4b, + 0x00, 0x01, 0x04, 0x5b, 0x07, 0x8b, 0x00, 0xda, 0xce, 0xcd, 0xce, 0xce, 0xc6, 0xcf, 0x02, 0xe0, + 0x00, 0xc0, 0x04, 0x54, 0x06, 0xa0, 0x95, 0xe2, 0x16, 0x25, 0xc0, 0x82, 0x13, 0x0b, 0xc6, 0x81, + 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0xc1, 0x01, 0xc1, 0x42, 0x04, 0xc2, + 0xc0, 0xc0, 0x10, 0xe8, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x04, 0xc3, + 0x10, 0xe1, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0x86, 0x8a, 0x01, 0x60, + 0x01, 0x9c, 0x40, 0x00, 0x16, 0xf6, 0x86, 0x8a, 0xc8, 0x05, 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x02, + 0xfe, 0x00, 0x16, 0xd8, 0xc0, 0x82, 0x13, 0x0d, 0xc6, 0x81, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, + 0xf8, 0x00, 0xc2, 0x45, 0xc1, 0x01, 0xc1, 0x42, 0x04, 0xc2, 0xc0, 0xc0, 0x03, 0x90, 0x00, 0x1f, + 0x03, 0x80, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x04, 0xc3, 0x03, 0x90, + 0x00, 0x1f, 0x03, 0x80, 0x02, 0xe0, 0x08, 0x6a, 0xc2, 0x8b, 0x02, 0x2a, 0xff, 0xfc, 0x04, 0x60, + 0xb3, 0x8a, 0xc0, 0x82, 0x13, 0x07, 0xc6, 0x81, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, + 0xc2, 0x45, 0x10, 0x06, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x04, 0xc0, + 0x06, 0xa0, 0x99, 0x16, 0xc0, 0xc0, 0xc1, 0x01, 0xc1, 0x42, 0x04, 0xc2, 0x10, 0x9b, 0x03, 0x90, + 0xff, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0x86, 0x8a, 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00, + 0x16, 0xf6, 0x86, 0x8a, 0xc8, 0x05, 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x02, 0xfe, 0x00, 0x13, 0x03, + 0x06, 0xa0, 0x95, 0xe2, 0x13, 0xd6, 0xc0, 0x82, 0x13, 0x07, 0xc6, 0x81, 0xc8, 0x09, 0x01, 0x6a, + 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x10, 0x06, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, + 0xc2, 0x45, 0x04, 0xc0, 0x06, 0xa0, 0x99, 0x16, 0xc0, 0xc0, 0xc1, 0x01, 0xc1, 0x42, 0x04, 0xc2, + 0x03, 0x90, 0x00, 0x1f, 0x03, 0x80, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, + 0x88, 0x08, 0x01, 0x8c, 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00, 0x16, 0xf5, 0x88, 0x08, 0x01, 0x8c, + 0xc0, 0xe0, 0x01, 0x6c, 0xc2, 0x20, 0x05, 0xf4, 0x13, 0x02, 0x04, 0x60, 0xb9, 0x4c, 0x02, 0xe0, + 0x08, 0x6a, 0x01, 0x03, 0x00, 0xff, 0x13, 0x11, 0x01, 0x43, 0x04, 0x00, 0x13, 0x0e, 0xc8, 0x09, + 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0xc1, 0x60, 0x08, 0x96, 0x02, 0x85, 0x97, 0xf6, + 0x16, 0x02, 0x06, 0xa0, 0x99, 0x16, 0x02, 0x43, 0x03, 0x00, 0x02, 0xe0, 0x00, 0xe0, 0x01, 0x20, + 0x08, 0x70, 0x01, 0x00, 0x16, 0x2f, 0xc2, 0x20, 0x05, 0xf4, 0x16, 0x2c, 0xc2, 0x60, 0x05, 0xf0, + 0x13, 0x12, 0xc8, 0x19, 0x05, 0xf0, 0xc2, 0xa9, 0x00, 0x0a, 0x11, 0x02, 0xf2, 0xa0, 0x09, 0x2e, + 0xd8, 0x0a, 0x01, 0x80, 0xc8, 0x29, 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04, + 0xc8, 0x09, 0x05, 0xf4, 0x10, 0x17, 0x02, 0xe0, 0x08, 0x6a, 0x01, 0x83, 0x06, 0x00, 0x16, 0x05, + 0xc1, 0x42, 0x13, 0x08, 0xc0, 0xc0, 0xc1, 0x01, 0x04, 0xc2, 0xd8, 0x20, 0x09, 0x2e, 0x01, 0x80, + 0xc8, 0x04, 0x01, 0x8c, 0x02, 0xe0, 0x00, 0xe0, 0x07, 0xa0, 0x00, 0x14, 0x08, 0x6a, 0xc8, 0x20, + 0x08, 0x96, 0x00, 0x16, 0xc8, 0x03, 0x01, 0x6c, 0x11, 0x03, 0x03, 0x90, 0x11, 0xff, 0x03, 0x80, + 0x04, 0x60, 0xb9, 0xc0, 0xc8, 0x04, 0x01, 0x6a, 0x10, 0x03, 0xc8, 0x20, 0xf8, 0x00, 0x01, 0x6a, + 0xc3, 0x20, 0xf8, 0x02, 0x01, 0x4c, 0x01, 0x00, 0x16, 0xf8, 0xc1, 0x60, 0x10, 0x86, 0x02, 0x45, + 0x00, 0x1f, 0x06, 0xcc, 0xd9, 0x4c, 0x10, 0x88, 0x13, 0x0d, 0x05, 0xa0, 0x10, 0x86, 0x06, 0x03, + 0x01, 0x03, 0x00, 0xff, 0x13, 0x52, 0xc1, 0x20, 0xf8, 0x00, 0xc8, 0x04, 0x01, 0x6a, 0x16, 0xe8, + 0x06, 0xa0, 0x97, 0xb6, 0x01, 0x0c, 0x00, 0xfe, 0x16, 0xf0, 0xc3, 0x20, 0x01, 0x6a, 0xc8, 0x04, + 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x0e, 0x80, 0x00, 0x13, 0x07, 0xc1, 0x20, 0xf8, 0x14, 0x01, 0x84, + 0x60, 0xff, 0x02, 0x84, 0x02, 0x00, 0x1b, 0x33, 0xc1, 0x20, 0xf8, 0x08, 0x11, 0x0c, 0x88, 0x20, + 0xf8, 0x0c, 0x01, 0xa4, 0x16, 0x2f, 0x88, 0x20, 0xf8, 0x0a, 0x01, 0xa2, 0x16, 0x2b, 0x88, 0x04, + 0x01, 0xa0, 0x13, 0x25, 0x10, 0x27, 0xc1, 0x20, 0xf8, 0x0a, 0x11, 0x09, 0x25, 0x20, 0x01, 0xac, + 0x16, 0x1e, 0xc1, 0x20, 0xf8, 0x0c, 0x25, 0x20, 0x01, 0xae, 0x16, 0x19, 0x10, 0x1b, 0x02, 0x84, + 0xff, 0xff, 0x16, 0x0a, 0x88, 0x04, 0xf8, 0x0c, 0x16, 0x07, 0x41, 0x20, 0xf8, 0x08, 0x13, 0x0f, + 0x02, 0x84, 0x3f, 0xff, 0x13, 0x0c, 0x10, 0x0e, 0x88, 0x04, 0x01, 0xa8, 0x16, 0x0b, 0x88, 0x20, + 0xf8, 0x0c, 0x01, 0xaa, 0x16, 0x07, 0x88, 0x20, 0xf8, 0x08, 0x01, 0xa6, 0x16, 0x03, 0xd9, 0x60, + 0xee, 0xa8, 0x10, 0x88, 0xc8, 0x0c, 0x01, 0x6a, 0x10, 0xa8, 0x01, 0x43, 0x20, 0x00, 0x16, 0x07, + 0x07, 0x85, 0x01, 0x04, 0x01, 0x55, 0x21, 0x00, 0x16, 0x03, 0x07, 0x95, 0xde, 0x8c, 0x04, 0x5b, + 0x01, 0x55, 0x01, 0x00, 0x16, 0xfc, 0xc1, 0x15, 0x01, 0xc4, 0xff, 0x00, 0x01, 0x84, 0x04, 0x80, + 0xc5, 0x44, 0x01, 0x55, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xe0, 0x07, 0x78, 0x80, 0x00, 0x04, 0x5b, + 0x03, 0x00, 0x00, 0x02, 0xc2, 0x0b, 0xc3, 0x20, 0x05, 0xf4, 0x16, 0x08, 0xc3, 0x20, 0x08, 0x70, + 0x01, 0x0c, 0x00, 0xff, 0x13, 0x1a, 0x01, 0x4c, 0x04, 0x00, 0x13, 0x17, 0xc2, 0xa8, 0x00, 0x0a, + 0x01, 0x4a, 0x00, 0x10, 0x16, 0x46, 0x01, 0x4a, 0x80, 0x00, 0x16, 0x19, 0xc3, 0x08, 0x06, 0xa0, + 0x9a, 0xf4, 0xc2, 0x0c, 0xc3, 0x20, 0x05, 0xf4, 0x16, 0x12, 0xc3, 0x20, 0x08, 0x70, 0x01, 0x0c, + 0x00, 0xff, 0x13, 0x03, 0x01, 0x4c, 0x04, 0x00, 0x16, 0x0a, 0x01, 0x68, 0x00, 0x0a, 0x00, 0x10, + 0x13, 0x03, 0x01, 0x0c, 0x01, 0x00, 0x16, 0x2d, 0x06, 0xa0, 0xbc, 0x40, 0x10, 0x04, 0x07, 0x87, + 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x8a, 0x01, 0xe0, 0x08, 0x70, 0x02, 0x00, 0x07, 0xa0, 0x00, 0x14, + 0x00, 0xe0, 0x07, 0xa0, 0x00, 0x16, 0x98, 0x4e, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0xa8, 0xc3, + 0xa9, 0xa0, 0xcf, 0xec, 0xe9, 0xe3, 0xef, 0xed, 0xa0, 0xb1, 0xb9, 0xb9, 0xb6, 0x00, 0x03, 0x00, + 0x00, 0x02, 0xc2, 0x20, 0x08, 0x70, 0x16, 0x0c, 0xd8, 0x20, 0x09, 0x2e, 0x01, 0x80, 0xc8, 0x2b, + 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04, 0xc8, 0x0b, 0x05, 0xf4, 0x10, 0x05, + 0xc2, 0x0b, 0x07, 0x87, 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x44, 0x01, 0xe0, 0x08, 0x70, 0x02, 0x00, + 0x07, 0xa0, 0x00, 0x14, 0x00, 0xe0, 0x07, 0xa0, 0x00, 0x16, 0x98, 0x4e, 0x03, 0x90, 0xff, 0xff, + 0x03, 0x80, 0xc2, 0x20, 0x05, 0xf4, 0x13, 0x02, 0x04, 0x60, 0xbc, 0x04, 0x02, 0xa8, 0xc8, 0x08, + 0x08, 0x84, 0x02, 0xe0, 0x08, 0x6a, 0x01, 0x03, 0x00, 0xff, 0x13, 0x22, 0x01, 0x43, 0x04, 0x00, + 0x13, 0x1f, 0x01, 0xe0, 0x01, 0x9c, 0x40, 0x00, 0x0b, 0xab, 0x0b, 0xab, 0x01, 0x60, 0x01, 0x9c, + 0x40, 0x00, 0x16, 0x16, 0xc8, 0x04, 0x01, 0x6a, 0xc2, 0xe0, 0xf8, 0x02, 0x11, 0x0f, 0xc8, 0x09, + 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0xc1, 0x60, 0x08, 0x96, 0x02, 0x85, 0x97, 0xf6, + 0x16, 0x02, 0x06, 0xa0, 0x99, 0x16, 0x02, 0x43, 0x03, 0x00, 0x10, 0x02, 0x01, 0xc3, 0x04, 0x00, + 0x00, 0x9d, 0x04, 0x5b, 0x03, 0x00, 0x00, 0x02, 0x07, 0x87, 0x05, 0xf0, 0xc2, 0xcb, 0x16, 0x0f, + 0x06, 0xa0, 0x9a, 0xf4, 0x01, 0xe0, 0x08, 0x70, 0x01, 0x00, 0x07, 0xa0, 0x00, 0x14, 0x00, 0xe0, + 0x07, 0xa0, 0x00, 0x16, 0x98, 0x4e, 0xcb, 0x60, 0x05, 0xf4, 0x00, 0x02, 0x03, 0x80, 0xc2, 0x20, + 0x08, 0x70, 0x01, 0x88, 0x01, 0x00, 0xc8, 0x08, 0x08, 0x70, 0x01, 0x08, 0x04, 0x00, 0x16, 0x03, + 0x01, 0x08, 0x00, 0xff, 0x16, 0x08, 0xc2, 0x20, 0x05, 0xf4, 0x16, 0x05, 0xc2, 0x17, 0x13, 0x04, + 0xc5, 0xd8, 0x06, 0xa0, 0xbc, 0x40, 0x03, 0x80, 0x02, 0xe0, 0x08, 0x6a, 0x01, 0x83, 0x06, 0x00, + 0x16, 0x05, 0xc1, 0x42, 0x13, 0x08, 0xc0, 0xc0, 0xc1, 0x01, 0x04, 0xc2, 0xd8, 0x20, 0x09, 0x2e, + 0x01, 0x80, 0xc8, 0x04, 0x01, 0x8c, 0x02, 0xe0, 0x00, 0xc0, 0x07, 0xa0, 0x00, 0x14, 0x08, 0x6a, + 0xc8, 0x20, 0x08, 0x96, 0x00, 0x16, 0x03, 0x80, 0xc8, 0x01, 0x01, 0x6a, 0x13, 0x05, 0xc2, 0xe0, + 0xf8, 0x02, 0x11, 0x02, 0x06, 0xa0, 0x97, 0xb6, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x13, 0x01, + 0x03, 0x80, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83, 0xc0, 0x41, 0x13, 0x04, 0xc8, 0x01, 0x01, 0x8a, + 0xc8, 0x01, 0x09, 0x18, 0x07, 0x85, 0x00, 0x43, 0x01, 0x20, 0x0c, 0x06, 0x00, 0xc0, 0x16, 0x20, + 0xc2, 0x20, 0x0c, 0x02, 0x06, 0x08, 0x01, 0x08, 0xfe, 0x03, 0x16, 0x1a, 0x07, 0x8a, 0x00, 0x24, + 0x62, 0xa0, 0x0c, 0x04, 0xc8, 0x0a, 0x0c, 0x04, 0x07, 0x87, 0x06, 0x30, 0x01, 0xe7, 0x00, 0x04, + 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x0c, 0xc2, 0x57, 0x16, 0x04, 0xcd, 0xc5, 0xc5, 0xc5, + 0x04, 0x60, 0xb9, 0xc0, 0x05, 0xc7, 0xc8, 0x17, 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, 0x10, 0xf7, + 0x04, 0x60, 0xf8, 0xfe, 0x03, 0x00, 0x00, 0x02, 0xc3, 0x20, 0x01, 0x8a, 0x98, 0x20, 0xe0, 0x10, + 0x01, 0x83, 0x13, 0xba, 0x01, 0x20, 0x01, 0x9c, 0x00, 0x40, 0x13, 0x02, 0x06, 0xa0, 0xd7, 0xd8, + 0xc1, 0x41, 0x83, 0x05, 0x16, 0x01, 0x03, 0x80, 0xc8, 0x05, 0x01, 0x6a, 0xc2, 0x20, 0xf8, 0x02, + 0x01, 0x40, 0x00, 0x40, 0x16, 0x12, 0x88, 0x01, 0x09, 0x18, 0x16, 0x07, 0xc8, 0x20, 0x09, 0x1a, + 0x09, 0x18, 0x04, 0xe0, 0x09, 0x1a, 0x01, 0xc0, 0x00, 0x04, 0x01, 0x80, 0x40, 0x40, 0x01, 0x20, + 0xf8, 0x06, 0x00, 0xc0, 0x16, 0x02, 0x01, 0xc0, 0x40, 0x00, 0x01, 0x48, 0x01, 0x00, 0x16, 0x55, + 0x01, 0xc0, 0x00, 0x40, 0x01, 0x00, 0x40, 0x04, 0x13, 0x50, 0x01, 0x40, 0x40, 0x00, 0x16, 0x48, + 0x01, 0xa0, 0x07, 0x78, 0x40, 0x00, 0x01, 0x80, 0x40, 0x00, 0x01, 0x48, 0x00, 0x01, 0x16, 0x3d, + 0x01, 0x80, 0x00, 0x04, 0xc1, 0x41, 0xc0, 0x60, 0xf8, 0x00, 0x04, 0xe0, 0xf8, 0x00, 0x07, 0x8b, + 0x03, 0xea, 0x62, 0xe0, 0xf8, 0x04, 0xc8, 0x0b, 0xf8, 0x04, 0x85, 0x05, 0x16, 0x02, 0xc5, 0x01, + 0x10, 0x10, 0xc8, 0x14, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00, 0x13, 0x06, 0xc8, 0x20, 0xf8, 0x00, + 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00, 0x16, 0xfa, 0xc8, 0x01, 0xf8, 0x00, 0x16, 0x02, 0xc0, 0xa0, + 0x01, 0x6a, 0x01, 0x08, 0xfe, 0x00, 0x16, 0x4a, 0xc8, 0x05, 0x01, 0x6a, 0x07, 0x87, 0x06, 0x30, + 0x01, 0xe7, 0x00, 0x04, 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x0c, 0xa1, 0x45, 0xc9, 0x60, + 0xf8, 0x00, 0x0c, 0x32, 0x04, 0xe0, 0xf8, 0x00, 0x09, 0x15, 0xc2, 0x57, 0x16, 0x31, 0xcd, 0xc5, + 0xc5, 0xc5, 0x01, 0xc0, 0x00, 0x20, 0xc1, 0x41, 0x10, 0x0e, 0x01, 0x40, 0x00, 0x04, 0x16, 0x05, + 0x01, 0x80, 0x00, 0x04, 0x01, 0xe0, 0xf8, 0x02, 0x40, 0x00, 0xc1, 0x60, 0xf8, 0x00, 0x01, 0x00, + 0x40, 0x00, 0x16, 0x01, 0xc0, 0x45, 0x83, 0x05, 0x16, 0x87, 0xc2, 0xe0, 0x09, 0x18, 0x16, 0x10, + 0x01, 0x00, 0x00, 0x04, 0x16, 0x0d, 0x98, 0x20, 0xe0, 0x10, 0x01, 0x83, 0x13, 0x09, 0x07, 0x8b, + 0xd7, 0x5e, 0x01, 0x40, 0x00, 0x40, 0x13, 0x02, 0x07, 0x8b, 0xd7, 0xa4, 0xc8, 0x0b, 0x00, 0x12, + 0x01, 0x00, 0x00, 0x20, 0x16, 0x01, 0x03, 0x80, 0x01, 0x80, 0x00, 0x20, 0x04, 0x60, 0xb9, 0xc0, + 0x05, 0xc7, 0xc8, 0x17, 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, 0x10, 0xca, 0xc1, 0x81, 0x06, 0xa0, + 0xf9, 0x32, 0xc1, 0x46, 0x10, 0xd8, 0x05, 0xa0, 0x09, 0x32, 0xc0, 0x41, 0x16, 0x01, 0x03, 0x80, + 0xc3, 0x20, 0x00, 0x12, 0x04, 0x5c, 0x03, 0x00, 0x00, 0x00, 0x03, 0xb0, 0x10, 0xff, 0x03, 0x80, + 0x20, 0x00, 0x9d, 0xd2, 0x02, 0x2f, 0x00, 0x00, 0x20, 0x00, 0xc7, 0x46, 0x00, 0x88, 0xc0, 0x60, + 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06, 0x13, 0x04, 0x01, 0x20, + 0x01, 0x00, 0x08, 0x00, 0x13, 0x04, 0x88, 0x01, 0x05, 0xee, 0x16, 0xf5, 0x10, 0x35, 0x07, 0x81, + 0x01, 0x0a, 0xcc, 0x4c, 0xcc, 0x4c, 0xcc, 0x4e, 0xcc, 0x4f, 0x07, 0xb1, 0x00, 0x40, 0xc4, 0x4d, + 0xc8, 0x0a, 0x01, 0x00, 0x04, 0x5b, 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, + 0x01, 0x02, 0x00, 0x06, 0x13, 0x04, 0x01, 0x20, 0x01, 0x00, 0x08, 0x00, 0x13, 0x04, 0x88, 0x01, + 0x05, 0xee, 0x16, 0xf5, 0x10, 0x19, 0x07, 0x81, 0x01, 0x0a, 0xcc, 0x4c, 0xcc, 0x4c, 0xcc, 0x4e, + 0xcc, 0x4f, 0x07, 0xb1, 0x00, 0x40, 0xc4, 0x4d, 0xc8, 0x0a, 0x01, 0x00, 0xc0, 0x60, 0x05, 0xee, + 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06, 0x13, 0x01, 0x04, 0x5b, 0x88, 0x01, + 0x05, 0xee, 0x16, 0xf8, 0x10, 0x01, 0x20, 0x00, 0xce, 0x3e, 0x0a, 0x32, 0x07, 0x8d, 0x10, 0x00, + 0x20, 0x0d, 0x16, 0x28, 0x07, 0x8d, 0x08, 0x00, 0x01, 0x40, 0x02, 0x00, 0x13, 0x23, 0x01, 0xc0, + 0x02, 0x00, 0x07, 0x8f, 0x97, 0xf6, 0xc3, 0x8e, 0x11, 0x02, 0x07, 0x8f, 0x97, 0x6a, 0xc8, 0x0f, + 0x08, 0x96, 0xc3, 0x60, 0x00, 0x16, 0x02, 0x8d, 0x98, 0x4e, 0x13, 0x02, 0xc8, 0x0f, 0x00, 0x16, + 0x07, 0x8f, 0x03, 0xf8, 0x02, 0x4e, 0x40, 0x00, 0xc8, 0x0e, 0x08, 0x98, 0xc8, 0x0e, 0x08, 0x9a, + 0x13, 0x05, 0x07, 0x8e, 0xee, 0x60, 0xc3, 0xfe, 0xc8, 0x0e, 0x08, 0x90, 0xc8, 0x0f, 0x08, 0x62, + 0x04, 0x20, 0xea, 0x7a, 0x04, 0x5b, 0x07, 0x8d, 0x10, 0x00, 0x20, 0x0d, 0x16, 0xfb, 0x07, 0x8d, + 0x08, 0x00, 0x01, 0x40, 0x04, 0x00, 0x13, 0xf6, 0x07, 0x8d, 0x40, 0x00, 0x01, 0x0e, 0x00, 0x01, + 0x16, 0xf1, 0x01, 0xc0, 0x04, 0x00, 0x06, 0x0f, 0x01, 0x8f, 0x80, 0x00, 0xc8, 0x0f, 0x08, 0x8c, + 0xc3, 0xce, 0x01, 0x8e, 0xe0, 0x00, 0x05, 0x0e, 0xc8, 0x0e, 0x08, 0x4c, 0xa8, 0x0e, 0x08, 0x8c, + 0x09, 0xdf, 0x02, 0x4f, 0x00, 0x04, 0x02, 0x2f, 0x03, 0xf0, 0xc8, 0x0f, 0x08, 0x8a, 0x01, 0x85, + 0x00, 0x40, 0x04, 0x20, 0xea, 0x7a, 0xc0, 0x41, 0x13, 0xfe, 0x03, 0x00, 0x00, 0x02, 0x88, 0x01, + 0x00, 0xe2, 0x13, 0x36, 0xc8, 0x01, 0x01, 0x6c, 0x01, 0x20, 0xfc, 0x06, 0x00, 0xc0, 0x13, 0x30, + 0xc0, 0xe0, 0xfc, 0x02, 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02, 0x07, 0xa0, 0xfc, 0x04, 0x03, 0xee, + 0xc8, 0x04, 0xfc, 0x76, 0xc8, 0x04, 0xfc, 0xe6, 0xc8, 0x04, 0xfd, 0x56, 0xc8, 0x04, 0xfd, 0xc6, + 0xc8, 0x04, 0xfe, 0x36, 0xc8, 0x04, 0xfe, 0xa6, 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04, 0xff, 0x86, + 0x07, 0x8e, 0xfc, 0x00, 0xc0, 0x5e, 0x04, 0xde, 0xc8, 0x20, 0x00, 0xe4, 0x01, 0x6c, 0xc8, 0x06, + 0xfc, 0x00, 0xc8, 0x06, 0x00, 0xe4, 0x01, 0x43, 0x01, 0x00, 0x13, 0x0a, 0x03, 0x00, 0x00, 0x0f, + 0x03, 0x00, 0x00, 0x02, 0x88, 0x01, 0x00, 0xe2, 0x13, 0xf9, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xd0, + 0x03, 0x00, 0x00, 0x0f, 0x01, 0x60, 0x07, 0x58, 0x14, 0x00, 0x16, 0xbf, 0x07, 0x83, 0xfc, 0x76, + 0x02, 0xe0, 0x08, 0x5c, 0x04, 0x60, 0x91, 0x6a, 0x02, 0x2d, 0x00, 0x06, 0xc0, 0xa0, 0x08, 0x4c, + 0x04, 0x60, 0xd3, 0x36, 0x01, 0x00, 0x07, 0xff, 0x16, 0x11, 0x01, 0xc0, 0x07, 0xff, 0x01, 0x00, + 0x20, 0x00, 0x16, 0x29, 0x01, 0xc0, 0x20, 0x00, 0x07, 0x8f, 0x08, 0x92, 0xc7, 0xc1, 0xc8, 0x0f, + 0x00, 0xe8, 0xc0, 0x60, 0x05, 0xf8, 0x04, 0xe0, 0x05, 0xf8, 0x10, 0x1f, 0x01, 0x40, 0x20, 0x00, + 0x16, 0x0b, 0xc0, 0x60, 0x05, 0xf8, 0x16, 0xf7, 0x01, 0x80, 0x20, 0x00, 0x07, 0xa0, 0x00, 0xe8, + 0x07, 0x7a, 0xc0, 0x60, 0x08, 0x92, 0x10, 0x0f, 0xc3, 0xdd, 0x13, 0x05, 0x03, 0x90, 0x00, 0x17, + 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, + 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x24, 0x40, 0x13, 0xcd, 0xc8, 0x01, 0x01, 0x6c, 0x88, 0x01, + 0x00, 0xe2, 0x16, 0x24, 0xc3, 0xdd, 0x16, 0xea, 0x84, 0xc4, 0x13, 0xed, 0x01, 0x20, 0xfc, 0x06, + 0x00, 0xc0, 0x16, 0x53, 0x01, 0xc0, 0x40, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, + 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x01, 0x40, 0x40, 0x00, 0x16, 0xe4, 0xc3, 0xdd, + 0x13, 0xf3, 0x03, 0x90, 0x00, 0x17, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, + 0x10, 0xeb, 0x07, 0x86, 0x03, 0xf4, 0x61, 0x89, 0x04, 0x60, 0xd4, 0x28, 0xc0, 0xe0, 0xfc, 0x02, + 0x13, 0xf8, 0xc1, 0xa0, 0x08, 0x8a, 0x61, 0x89, 0x61, 0xa0, 0xfc, 0x04, 0x15, 0x0a, 0x04, 0x60, + 0xd2, 0x78, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, + 0x13, 0xf8, 0xcd, 0x4a, 0xcd, 0x46, 0xcd, 0x47, 0xcd, 0x48, 0xc9, 0x49, 0x00, 0x02, 0xc5, 0x41, + 0x07, 0xa5, 0xff, 0xee, 0xe0, 0x81, 0x02, 0x25, 0xff, 0xf8, 0x04, 0x60, 0xd2, 0x74, 0x03, 0x90, + 0x00, 0x17, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x03, 0x00, 0x00, 0x0f, + 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x88, 0x01, 0x00, 0xe2, + 0x16, 0xcd, 0xc3, 0xdd, 0x16, 0xec, 0x84, 0xc4, 0x13, 0xf1, 0x61, 0x83, 0x02, 0x23, 0x00, 0x70, + 0x84, 0xc4, 0x16, 0xfc, 0xa1, 0x83, 0xcd, 0x4a, 0xcd, 0x46, 0xcd, 0x47, 0xcd, 0x48, 0xc9, 0x49, + 0x00, 0x02, 0xc5, 0x41, 0x07, 0xa5, 0xff, 0xee, 0xe0, 0x81, 0x02, 0x25, 0xff, 0xf8, 0x62, 0x86, + 0x15, 0x43, 0xa1, 0x8a, 0xa2, 0x46, 0xa0, 0x86, 0x17, 0x21, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, + 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x05, 0xa0, + 0x10, 0x80, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x11, 0x01, 0x5e, + 0x01, 0x00, 0x16, 0x0e, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, + 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xc0, 0x80, 0x00, 0x10, 0x02, 0x05, 0xa0, 0x10, 0x80, + 0xc1, 0x8a, 0x88, 0x02, 0x08, 0x8c, 0x15, 0x3f, 0xc2, 0xac, 0x00, 0x04, 0x13, 0x3e, 0x01, 0x8a, + 0x80, 0x00, 0xc1, 0xfc, 0xc2, 0x3c, 0x04, 0xfc, 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, + 0x11, 0x28, 0x05, 0x06, 0x13, 0xa3, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, + 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x10, 0xaf, 0xa2, 0x46, 0xa2, 0x06, 0x17, 0x01, 0x05, 0x87, + 0xa0, 0x86, 0x04, 0xc6, 0x17, 0x93, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, + 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x03, + 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x8b, 0x01, 0x5e, 0x01, 0x00, 0x16, 0x88, 0xc3, 0xde, 0x01, 0xcf, + 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xc0, + 0x80, 0x00, 0x04, 0x60, 0xd0, 0x9e, 0x04, 0x60, 0xd5, 0xa0, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, + 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0xc2, 0xac, 0x00, 0x04, 0x16, 0xb7, + 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x01, 0xb7, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, + 0x01, 0x6c, 0x10, 0xeb, 0xa1, 0x8a, 0xa2, 0x46, 0xa0, 0x86, 0x17, 0x21, 0x07, 0x8e, 0x01, 0x04, + 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, + 0x05, 0xa0, 0x10, 0x80, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x11, + 0x01, 0x5e, 0x01, 0x00, 0x16, 0x0e, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, + 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xc0, 0x80, 0x00, 0x10, 0x02, 0x05, 0xa0, + 0x10, 0x80, 0xc1, 0x8a, 0x88, 0x02, 0x08, 0x8c, 0x15, 0x15, 0xc2, 0xac, 0x00, 0x04, 0x16, 0x14, + 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, + 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x01, 0xb7, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, + 0x01, 0x6c, 0x10, 0xeb, 0x04, 0x60, 0xd5, 0xa0, 0x01, 0x8a, 0x80, 0x00, 0xc1, 0xfc, 0xc2, 0x3c, + 0x04, 0xfc, 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28, 0x05, 0x06, 0x04, 0x60, + 0xd0, 0x54, 0x62, 0x86, 0x17, 0xaf, 0xa1, 0x82, 0xc0, 0xa0, 0x08, 0x4c, 0x61, 0x82, 0xc3, 0xe0, + 0x10, 0x82, 0x02, 0x4f, 0x00, 0x1f, 0x0a, 0x2f, 0xcb, 0xc6, 0x10, 0xa8, 0xcb, 0xc3, 0x10, 0xaa, + 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02, 0x07, 0xa0, 0xfc, 0x04, 0x03, 0xee, 0x07, 0x83, 0xfc, 0x76, + 0x07, 0x89, 0x00, 0x06, 0xc2, 0xac, 0x00, 0x04, 0x13, 0x08, 0xc1, 0xfc, 0xc2, 0x3c, 0x04, 0xfc, + 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, + 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x05, 0xa0, + 0x10, 0x82, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x3b, 0x07, 0x9e, 0xde, 0x8c, 0x05, 0xa0, 0x10, 0x80, + 0xc4, 0xc4, 0xc8, 0x04, 0xfc, 0xe6, 0xc8, 0x04, 0xfd, 0x56, 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04, + 0xfe, 0x36, 0xc8, 0x04, 0xfe, 0xa6, 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04, 0xff, 0x86, 0x07, 0x8e, + 0xfc, 0x00, 0xc0, 0x5e, 0x04, 0xde, 0xc8, 0x20, 0x00, 0xe4, 0x01, 0x6c, 0xc3, 0xe0, 0x00, 0xe2, + 0x13, 0x40, 0xc7, 0x86, 0xc8, 0x06, 0x00, 0xe4, 0x04, 0xc6, 0xc2, 0x8a, 0x15, 0x31, 0x13, 0x0a, + 0x05, 0xa0, 0x10, 0x80, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, + 0x01, 0x03, 0x13, 0xf8, 0xc2, 0xac, 0x00, 0x04, 0x16, 0x19, 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, + 0x01, 0xb7, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb, 0x01, 0x5e, + 0x01, 0x00, 0x16, 0xc4, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, + 0x01, 0x5e, 0x20, 0x00, 0x13, 0xb9, 0x01, 0xc0, 0x80, 0x00, 0x10, 0xb8, 0xc1, 0xfc, 0xc2, 0x3c, + 0x04, 0xfc, 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28, 0xc2, 0x8a, 0x11, 0xd0, + 0xc3, 0xdd, 0x16, 0x02, 0x04, 0x60, 0xcf, 0xe8, 0x03, 0x90, 0x00, 0x17, 0x06, 0x9b, 0x04, 0x60, + 0xcf, 0xd4, 0x07, 0x8e, 0xd3, 0x1a, 0xc8, 0x20, 0x08, 0x94, 0x01, 0x6a, 0x16, 0x03, 0xc8, 0x06, + 0x08, 0x94, 0x04, 0x5e, 0xc8, 0x06, 0xf8, 0x00, 0xc8, 0x06, 0x00, 0xe4, 0xc1, 0xa0, 0x08, 0x94, + 0x98, 0x20, 0xe0, 0x10, 0x01, 0x83, 0x16, 0x19, 0x01, 0xe0, 0x01, 0x9c, 0x00, 0x40, 0x07, 0x8f, + 0x03, 0xe8, 0x0b, 0x8f, 0x0b, 0x8f, 0x06, 0x0f, 0x13, 0x1a, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, + 0x16, 0xf8, 0x01, 0x60, 0x0c, 0x02, 0x01, 0x00, 0x13, 0x12, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83, + 0x07, 0xa0, 0x0c, 0x02, 0x80, 0x00, 0x0b, 0x8f, 0x0b, 0x8f, 0xc8, 0x06, 0x01, 0x8a, 0xc8, 0x06, + 0x09, 0x18, 0x07, 0xa0, 0x00, 0x12, 0x9c, 0x56, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0x40, 0x04, 0xe0, + 0x08, 0x94, 0xc8, 0x06, 0x00, 0xe2, 0x01, 0x40, 0x20, 0x00, 0x13, 0x07, 0xc0, 0x41, 0x13, 0x03, + 0xc8, 0x06, 0xfc, 0x00, 0x04, 0x5e, 0xc0, 0x46, 0x04, 0x5e, 0xc3, 0xe0, 0x08, 0x92, 0x16, 0xf8, + 0xc8, 0x06, 0x08, 0x92, 0x04, 0x5e, 0xcd, 0x4a, 0xcd, 0x46, 0xcd, 0x47, 0xcd, 0x48, 0xc9, 0x49, + 0x00, 0x02, 0xc5, 0x41, 0x07, 0xa5, 0xff, 0xee, 0xe0, 0x81, 0x02, 0x25, 0xff, 0xf8, 0x62, 0x86, + 0x15, 0x57, 0xa1, 0x8a, 0xa2, 0x46, 0xa0, 0x86, 0x17, 0x21, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, + 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x05, 0xa0, + 0x10, 0x80, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x11, 0x01, 0x5e, + 0x01, 0x00, 0x16, 0x0e, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, + 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xc0, 0x80, 0x00, 0x10, 0x02, 0x05, 0xa0, 0x10, 0x80, + 0xc1, 0x8a, 0x88, 0x02, 0x08, 0x8c, 0x15, 0x15, 0xc2, 0xac, 0x00, 0x04, 0x16, 0x14, 0x03, 0x00, + 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0xc3, 0xdd, + 0x13, 0xf3, 0x03, 0x90, 0x01, 0xb7, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, + 0x10, 0xeb, 0x04, 0x60, 0xd5, 0xa0, 0x01, 0x8a, 0x80, 0x00, 0xc1, 0xfc, 0xc2, 0x3c, 0x04, 0xfc, + 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28, 0x05, 0x06, 0x13, 0x09, 0x03, 0x00, + 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xa0, 0x01, 0x03, 0x13, 0xf8, 0x10, 0x9b, + 0xa2, 0x06, 0x17, 0x01, 0x05, 0x87, 0xa0, 0x86, 0x17, 0x1e, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, + 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x01, 0x5e, + 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x0e, 0x01, 0x5e, 0x01, 0x00, 0x16, 0x0b, + 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, + 0x13, 0xf1, 0x01, 0xc0, 0x80, 0x00, 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02, 0x07, 0x83, 0xfc, 0x76, + 0x07, 0x89, 0x00, 0x06, 0x07, 0x8e, 0xfc, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, + 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0xc4, 0xc4, 0xc8, 0x04, 0xfc, 0xe6, 0xc8, 0x04, + 0xfd, 0x56, 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04, 0xfe, 0x36, 0xc8, 0x04, 0xfe, 0xa6, 0xc8, 0x04, + 0xff, 0x16, 0xc8, 0x04, 0xff, 0x86, 0xc0, 0x5e, 0x04, 0xde, 0xc8, 0x20, 0x00, 0xe4, 0x01, 0x6c, + 0xc3, 0xe0, 0x00, 0xe2, 0x13, 0x08, 0xc7, 0x86, 0xc8, 0x06, 0x00, 0xe4, 0x04, 0xc6, 0xc8, 0x01, + 0x01, 0x6c, 0x04, 0x60, 0xd0, 0x9e, 0x07, 0x8e, 0xd5, 0x8e, 0x04, 0x60, 0xd3, 0x98, 0x62, 0x46, + 0x60, 0x86, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, + 0x13, 0xf8, 0x88, 0x01, 0x00, 0xe2, 0x16, 0x0a, 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x00, 0x17, + 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb, 0xc0, 0xe0, 0xfc, 0x02, + 0x13, 0x09, 0xc1, 0xa0, 0x08, 0x8a, 0x61, 0x89, 0x61, 0xa0, 0xfc, 0x04, 0x06, 0x20, 0x10, 0x80, + 0x04, 0x60, 0xd2, 0x78, 0x07, 0x86, 0x03, 0xf4, 0x61, 0x89, 0xa0, 0x86, 0x15, 0x02, 0x07, 0x82, + 0x7f, 0xff, 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02, 0x07, 0xa0, 0xfc, 0x04, 0x03, 0xee, 0x07, 0x83, + 0xfc, 0x76, 0x07, 0x89, 0x00, 0x06, 0x07, 0x8e, 0xfc, 0x00, 0xc4, 0xc4, 0xc8, 0x04, 0xfc, 0xe6, + 0xc8, 0x04, 0xfd, 0x56, 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04, 0xfe, 0x36, 0xc8, 0x04, 0xfe, 0xa6, + 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04, 0xff, 0x86, 0xc0, 0x5e, 0x04, 0xde, 0xc8, 0x20, 0x00, 0xe4, + 0x01, 0x6c, 0xc3, 0xe0, 0x00, 0xe2, 0x13, 0x07, 0xc7, 0x86, 0xc8, 0x06, 0x00, 0xe4, 0x04, 0xc6, + 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xae, 0x07, 0x8e, 0xd6, 0x40, 0x04, 0x60, 0xd3, 0x98, 0xc1, 0x60, + 0xf8, 0x00, 0x83, 0x05, 0x13, 0x0c, 0xc8, 0x05, 0x01, 0x6a, 0xc2, 0x20, 0xf8, 0x02, 0x13, 0xf7, + 0x15, 0x14, 0x06, 0xa0, 0x97, 0xb6, 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x16, 0x6d, 0x04, 0x60, + 0xb9, 0xc0, 0x06, 0xa0, 0xf9, 0x32, 0x80, 0x45, 0x16, 0x4f, 0x04, 0x60, 0xb9, 0xc0, 0x06, 0xa0, + 0x97, 0xb6, 0xc2, 0x20, 0xf8, 0x02, 0x11, 0xfb, 0x13, 0xe2, 0x01, 0xa0, 0x07, 0x78, 0x40, 0x00, + 0xc1, 0x41, 0xc0, 0x60, 0xf8, 0x00, 0x01, 0x48, 0x00, 0x01, 0x16, 0x3e, 0x04, 0xe0, 0xf8, 0x00, + 0x07, 0x8b, 0x03, 0xea, 0x62, 0xe0, 0xf8, 0x04, 0xc8, 0x0b, 0xf8, 0x04, 0x85, 0x05, 0x16, 0x02, + 0xc5, 0x01, 0x10, 0x10, 0xc8, 0x14, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00, 0x13, 0x06, 0xc8, 0x20, + 0xf8, 0x00, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00, 0x16, 0xfa, 0xc8, 0x01, 0xf8, 0x00, 0x16, 0x02, + 0xc0, 0xa0, 0x01, 0x6a, 0x01, 0x08, 0xfe, 0x00, 0x16, 0xcc, 0xc8, 0x05, 0x01, 0x6a, 0x01, 0xe0, + 0xf8, 0x02, 0x00, 0x20, 0x07, 0x87, 0x06, 0x30, 0x01, 0xe7, 0x00, 0x04, 0x00, 0x40, 0x04, 0xd7, + 0x02, 0x27, 0x00, 0x0c, 0xa1, 0x45, 0xc9, 0x60, 0xf8, 0x00, 0x0c, 0x32, 0x04, 0xe0, 0xf8, 0x00, + 0x09, 0x15, 0xc2, 0x57, 0x16, 0x03, 0xcd, 0xc5, 0xc5, 0xc5, 0x10, 0x06, 0x05, 0xc7, 0xc8, 0x17, + 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, 0xc5, 0xc5, 0x83, 0x01, 0x13, 0xa9, 0xc8, 0x01, 0x01, 0x6a, + 0x01, 0x20, 0xf8, 0x06, 0x00, 0xc0, 0x13, 0xad, 0x01, 0x60, 0xf8, 0x02, 0x01, 0x00, 0x16, 0x05, + 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x16, 0xf2, 0x10, 0x9a, 0x07, 0xa0, 0x00, 0x12, 0xd7, 0xa4, + 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x13, 0x93, 0xc8, 0x01, 0x01, 0x6a, 0x01, 0x60, 0xf8, 0x02, + 0x01, 0x00, 0x16, 0x89, 0x07, 0xa0, 0x00, 0x12, 0xd7, 0x5e, 0x10, 0xea, 0x03, 0x00, 0x00, 0x02, + 0xc3, 0x20, 0x01, 0x8a, 0x13, 0x1d, 0x83, 0x01, 0x13, 0x0e, 0xc8, 0x01, 0x01, 0x6a, 0x01, 0x20, + 0xf8, 0x06, 0x00, 0xc0, 0x13, 0x86, 0x01, 0x60, 0xf8, 0x02, 0x01, 0x00, 0x16, 0x07, 0xc0, 0x60, + 0xf8, 0x00, 0x83, 0x01, 0x16, 0xf2, 0x03, 0x90, 0xbf, 0xff, 0x03, 0x80, 0x07, 0xa0, 0x00, 0x12, + 0xd7, 0xa4, 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x16, 0x0b, 0x03, 0x90, 0xbf, 0xff, 0x03, 0x80, + 0x10, 0x18, 0x03, 0x00, 0x00, 0x02, 0xc3, 0x20, 0x01, 0x8a, 0x13, 0x13, 0x83, 0x01, 0x13, 0x0e, + 0xc8, 0x01, 0x01, 0x6a, 0x01, 0x60, 0xf8, 0x02, 0x01, 0x00, 0x16, 0x04, 0x07, 0xa0, 0x00, 0x12, + 0xd7, 0x5e, 0x10, 0xdd, 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x16, 0xf2, 0x03, 0x90, 0xbf, 0xff, + 0x03, 0x80, 0x07, 0x8b, 0x9c, 0x72, 0xc3, 0x01, 0x13, 0x39, 0xc2, 0x4c, 0xc8, 0x0c, 0x01, 0x6a, + 0xc2, 0x20, 0xf8, 0x02, 0x11, 0x2d, 0xc2, 0x4c, 0xc3, 0x20, 0xf8, 0x00, 0x16, 0xf7, 0xc8, 0x09, + 0x01, 0x6a, 0xc2, 0x20, 0xf8, 0x02, 0x16, 0x2a, 0x01, 0xe0, 0xf8, 0x02, 0x19, 0x00, 0x05, 0xa0, + 0x13, 0x80, 0x10, 0x24, 0x01, 0xe0, 0xf8, 0x02, 0x19, 0x00, 0x05, 0xa0, 0x13, 0x80, 0xc8, 0x0c, + 0x01, 0x8a, 0x07, 0x89, 0x09, 0x18, 0xc2, 0x19, 0x13, 0x01, 0x05, 0xc9, 0xc6, 0x4c, 0xc2, 0x20, + 0x00, 0x12, 0x02, 0x88, 0xd7, 0x5e, 0x16, 0x03, 0x01, 0xc0, 0x00, 0x40, 0x10, 0x05, 0x02, 0x88, + 0xd7, 0xa4, 0x16, 0x05, 0x01, 0x80, 0x40, 0x40, 0x07, 0xa0, 0x00, 0x12, 0x9c, 0x56, 0x04, 0x5b, + 0xc8, 0x09, 0x01, 0x6a, 0xc2, 0x20, 0xf8, 0x02, 0x16, 0xe2, 0x10, 0xdc, 0xc2, 0x20, 0x0c, 0x02, + 0x11, 0x01, 0x10, 0xe5, 0xd8, 0x20, 0xe0, 0x10, 0x01, 0x83, 0x07, 0x88, 0x00, 0x05, 0x0b, 0x88, + 0x0b, 0x88, 0x06, 0x08, 0x16, 0xfc, 0x07, 0xa0, 0x01, 0x8a, 0x00, 0x43, 0x10, 0xd8, 0x20, 0x00, + 0xd8, 0x70, 0x00, 0x7f, 0x00, 0x00, 0x20, 0x00, 0xf8, 0x30, 0x05, 0xec, 0x68, 0x04, 0x09, 0x32, + 0xd3, 0xcf, 0x16, 0x30, 0x01, 0x4f, 0x00, 0x80, 0x16, 0x2d, 0x01, 0x0e, 0x00, 0x03, 0x16, 0x2a, + 0xd1, 0x04, 0x13, 0x01, 0x07, 0x04, 0x06, 0xc4, 0x07, 0x03, 0x07, 0x88, 0x07, 0x23, 0xb6, 0x04, + 0x18, 0x0d, 0x01, 0x4d, 0x00, 0x02, 0x13, 0x0f, 0xc0, 0x60, 0x06, 0x7c, 0x02, 0x81, 0x06, 0x30, + 0x13, 0x0a, 0x07, 0x88, 0x80, 0x18, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x05, 0x76, 0x04, 0x96, 0x03, + 0x13, 0x02, 0xd6, 0x01, 0x10, 0xee, 0x07, 0x88, 0x07, 0x2f, 0xb6, 0x04, 0x18, 0x03, 0x96, 0x03, + 0x13, 0x05, 0x04, 0x5c, 0x76, 0x04, 0x96, 0x03, 0x13, 0x05, 0xd6, 0x03, 0x07, 0x83, 0x80, 0x40, + 0x06, 0xa0, 0xe3, 0x56, 0x04, 0x5c, 0x03, 0x00, 0x00, 0x02, 0xc1, 0x4b, 0x02, 0x85, 0x00, 0x43, + 0x13, 0x2c, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x04, 0x16, 0x06, 0xc8, 0x05, 0x01, 0x6c, 0x01, 0x60, + 0xfc, 0x02, 0x00, 0x20, 0x13, 0x07, 0x06, 0xa0, 0xf9, 0x32, 0x03, 0x90, 0x04, 0x77, 0x03, 0x80, + 0xc8, 0x0a, 0x01, 0x6c, 0xc2, 0xa0, 0xfc, 0x00, 0x16, 0xfb, 0xc2, 0xa0, 0x01, 0x6c, 0x07, 0x89, + 0x03, 0xea, 0x62, 0x60, 0xfc, 0x04, 0xc8, 0x09, 0xfc, 0x04, 0x07, 0x89, 0x05, 0xf8, 0xc2, 0xd9, + 0x16, 0x02, 0xce, 0x45, 0x10, 0x05, 0x05, 0xc9, 0xc8, 0x19, 0x01, 0x6c, 0xc8, 0x05, 0xfc, 0x00, + 0xc6, 0x4a, 0x01, 0xa0, 0x07, 0x78, 0x07, 0xff, 0x10, 0xe0, 0x07, 0xa0, 0x0c, 0x02, 0x80, 0x00, + 0x07, 0xa0, 0x0c, 0x04, 0x00, 0x28, 0xc0, 0x41, 0x16, 0xd8, 0xd8, 0x20, 0xe0, 0x10, 0x01, 0x83, + 0x07, 0x89, 0x00, 0x05, 0x0b, 0x89, 0x0b, 0x89, 0x06, 0x09, 0x16, 0xfc, 0xc8, 0x05, 0x01, 0x8a, + 0x07, 0xa0, 0x00, 0x12, 0x9c, 0x56, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0x40, 0x10, 0xc6, 0xc2, 0x85, + 0xc2, 0x60, 0x07, 0x80, 0xc8, 0x0a, 0x01, 0x6a, 0x07, 0x20, 0xf8, 0x02, 0x07, 0xa0, 0xf8, 0x04, + 0x03, 0xee, 0xc8, 0x09, 0xf8, 0x76, 0xc8, 0x09, 0xf8, 0xe6, 0xc8, 0x09, 0xf9, 0x56, 0xc8, 0x09, + 0xf9, 0xc6, 0xc8, 0x09, 0xfa, 0x36, 0xc8, 0x09, 0xfa, 0xa6, 0xc8, 0x09, 0xfb, 0x16, 0xc8, 0x09, + 0xfb, 0x86, 0xc8, 0x09, 0xfb, 0xf6, 0xc2, 0xa0, 0xf8, 0x00, 0x16, 0xe4, 0xc2, 0xa0, 0x01, 0x6a, + 0xc0, 0x41, 0x13, 0x06, 0xc8, 0x02, 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, 0xc0, 0x8a, 0x04, 0x5b, + 0xc8, 0x20, 0x08, 0x94, 0x01, 0x6a, 0x16, 0x05, 0x82, 0x85, 0x16, 0x07, 0xc8, 0x05, 0x08, 0x94, + 0x04, 0x5b, 0xc8, 0x05, 0xf8, 0x00, 0xc1, 0x60, 0x08, 0x94, 0x98, 0x20, 0xe0, 0x10, 0x01, 0x83, + 0x16, 0x19, 0x01, 0xe0, 0x01, 0x9c, 0x00, 0x40, 0x07, 0x89, 0x03, 0xe8, 0x0b, 0x89, 0x0b, 0x89, + 0x06, 0x09, 0x13, 0x14, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x16, 0xf8, 0x01, 0x60, 0x0c, 0x02, + 0x01, 0x00, 0x13, 0x0c, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83, 0x07, 0xa0, 0x0c, 0x02, 0x80, 0x00, + 0x0b, 0x89, 0x0b, 0x89, 0xc8, 0x05, 0x01, 0x8a, 0xc8, 0x05, 0x09, 0x18, 0x04, 0xe0, 0x08, 0x94, + 0xc0, 0x54, 0x16, 0x02, 0xc5, 0x05, 0x10, 0x04, 0xc8, 0x02, 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, + 0xc0, 0x45, 0xc0, 0x8a, 0x07, 0xa0, 0x00, 0x12, 0x9c, 0x56, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0x40, + 0x04, 0x5b, 0x07, 0x20, 0x0c, 0xb8, 0x07, 0x83, 0x80, 0x00, 0x04, 0x5b, 0x07, 0xa0, 0xfc, 0x04, + 0x03, 0xee, 0xc2, 0x20, 0x07, 0x80, 0xc8, 0x08, 0xfc, 0x76, 0xc8, 0x08, 0xfc, 0xe6, 0xc8, 0x08, + 0xfd, 0x56, 0xc8, 0x08, 0xfd, 0xc6, 0xc8, 0x08, 0xfe, 0x36, 0xc8, 0x08, 0xfe, 0xa6, 0xc8, 0x08, + 0xff, 0x16, 0xc8, 0x08, 0xff, 0x86, 0xc8, 0x08, 0xff, 0xf6, 0x04, 0x60, 0xc0, 0xc6, 0xc3, 0xa0, + 0x00, 0xe2, 0xc8, 0x0e, 0x08, 0x66, 0xc8, 0x0e, 0x01, 0x6c, 0xc3, 0xa0, 0xfc, 0x00, 0x06, 0x0d, + 0x16, 0xfa, 0x04, 0xe0, 0xfc, 0x00, 0xc8, 0x20, 0x01, 0x6c, 0x08, 0x7c, 0xc8, 0x0e, 0x00, 0xe2, + 0xc8, 0x0e, 0x07, 0x7a, 0x04, 0xe0, 0x08, 0x94, 0x04, 0xe0, 0x0c, 0xb8, 0x07, 0x8d, 0x00, 0x10, + 0x04, 0x5b, 0x03, 0x00, 0x00, 0x02, 0x07, 0x09, 0xc2, 0xa0, 0x01, 0x04, 0x01, 0x8a, 0x00, 0x80, + 0x52, 0x4a, 0xd2, 0x89, 0x01, 0xca, 0x25, 0x00, 0xc8, 0x0a, 0x01, 0x04, 0xd2, 0xa0, 0x01, 0x04, + 0x01, 0x0a, 0xda, 0x00, 0x16, 0xf5, 0x52, 0x4a, 0x01, 0xa0, 0x08, 0xa0, 0xff, 0x00, 0x07, 0xa0, + 0x08, 0xa8, 0x10, 0x00, 0x01, 0xc9, 0x05, 0x00, 0x07, 0x8a, 0x07, 0x78, 0x02, 0x89, 0x5f, 0xff, + 0x16, 0x19, 0x01, 0x5a, 0x80, 0x00, 0x16, 0x0f, 0x07, 0x89, 0xde, 0x8c, 0x01, 0x20, 0x07, 0x58, + 0x20, 0xfe, 0x13, 0x02, 0x01, 0x89, 0x04, 0x00, 0xc8, 0x09, 0x01, 0x04, 0x01, 0x9a, 0x80, 0x00, + 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, 0x16, 0x22, 0x03, 0x90, + 0xff, 0xff, 0x03, 0x80, 0x05, 0x49, 0x01, 0x89, 0x80, 0x00, 0x01, 0x49, 0x40, 0x00, 0x13, 0x23, + 0x01, 0x49, 0x20, 0x00, 0x16, 0x2f, 0x01, 0x5a, 0x80, 0x00, 0x16, 0x0e, 0x01, 0x9a, 0x80, 0x00, + 0x07, 0x8a, 0xde, 0x8c, 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, 0x13, 0x02, 0x01, 0x8a, 0x04, 0x00, + 0xc8, 0x0a, 0x01, 0x04, 0x01, 0x89, 0x20, 0x00, 0xd2, 0x49, 0x16, 0x05, 0x03, 0x90, 0xff, 0xff, + 0x03, 0x80, 0x07, 0x89, 0x20, 0x00, 0xf8, 0x09, 0x07, 0x3a, 0xc2, 0x60, 0x07, 0x36, 0x13, 0xf6, + 0x04, 0xe0, 0x07, 0x36, 0x04, 0x54, 0x04, 0xca, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, + 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x06, 0x0a, 0x16, 0xf4, + 0x04, 0x60, 0xb3, 0xf0, 0x01, 0x5a, 0x80, 0x00, 0x13, 0x04, 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, + 0x13, 0xdb, 0xc2, 0xa0, 0x01, 0x04, 0x01, 0xca, 0xff, 0x00, 0x01, 0x8a, 0x04, 0x80, 0xc8, 0x0a, + 0x01, 0x04, 0x01, 0x60, 0x01, 0x04, 0x20, 0x00, 0x16, 0xcf, 0x01, 0xc9, 0x20, 0x00, 0x07, 0x8a, + 0x07, 0x78, 0x10, 0xb9, 0x01, 0x60, 0x07, 0x58, 0x10, 0x00, 0x16, 0x13, 0x01, 0x20, 0x05, 0xee, + 0x00, 0x07, 0x16, 0x0f, 0xc1, 0xa0, 0x08, 0xa0, 0x06, 0xc6, 0xd1, 0xe0, 0x01, 0x03, 0x13, 0x14, + 0x71, 0x86, 0x06, 0xc6, 0x01, 0x20, 0x01, 0x04, 0x20, 0x00, 0x13, 0x22, 0x71, 0x86, 0xc8, 0x06, + 0x08, 0xa0, 0x01, 0x60, 0x01, 0x82, 0x20, 0x00, 0x16, 0x06, 0x01, 0xa0, 0x01, 0x82, 0x20, 0x00, + 0x01, 0xe0, 0x01, 0x82, 0x20, 0x00, 0x04, 0x5b, 0x07, 0x87, 0x01, 0x0c, 0x07, 0x88, 0x08, 0xa2, + 0x02, 0x26, 0xff, 0x00, 0x18, 0x04, 0xce, 0x37, 0xce, 0x37, 0xc6, 0x17, 0x10, 0xe2, 0x8e, 0x37, + 0x16, 0xdf, 0x8e, 0x37, 0x16, 0xdd, 0x86, 0x17, 0x16, 0xdb, 0xd1, 0x86, 0x16, 0xda, 0x10, 0x11, + 0x02, 0x26, 0x01, 0x00, 0x18, 0x0e, 0x19, 0xdb, 0xc1, 0xe0, 0x01, 0x04, 0x01, 0xc7, 0xff, 0x00, + 0x01, 0x87, 0x04, 0x80, 0xc8, 0x07, 0x01, 0x04, 0x01, 0x20, 0x01, 0x04, 0x20, 0x00, 0x16, 0xce, + 0x10, 0xce, 0x04, 0xe0, 0x08, 0xa8, 0x04, 0x5b, 0xc0, 0xe0, 0x07, 0x5c, 0xc8, 0x03, 0x01, 0x6c, + 0xc3, 0x43, 0xc2, 0xc3, 0xa2, 0xcb, 0xc2, 0xeb, 0x0c, 0x32, 0xc8, 0x0b, 0xfc, 0x00, 0x13, 0x07, + 0xc8, 0x0b, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x00, 0x16, 0xfb, 0xc3, 0x60, 0x01, 0x6c, 0x07, 0x8b, + 0x03, 0xea, 0x62, 0xe0, 0xfc, 0x04, 0xc8, 0x0b, 0xfc, 0x04, 0x07, 0x8b, 0x05, 0xf8, 0x03, 0x00, + 0x00, 0x02, 0xc3, 0x9b, 0x16, 0x02, 0xce, 0xc3, 0x10, 0x05, 0x05, 0xcb, 0xc8, 0x1b, 0x01, 0x6c, + 0xc8, 0x03, 0xfc, 0x00, 0xc6, 0xcd, 0x01, 0xa0, 0x07, 0x78, 0x07, 0xff, 0x03, 0x00, 0x00, 0x0f, + 0x04, 0x20, 0xea, 0x7a, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02, 0xc3, 0xde, 0x01, 0x4f, + 0x20, 0x00, 0x16, 0x08, 0x01, 0x20, 0x07, 0x78, 0x80, 0x00, 0x16, 0x04, 0x03, 0x00, 0x00, 0x0f, + 0x04, 0x60, 0xc5, 0xc6, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, + 0x20, 0x00, 0x16, 0x04, 0x01, 0x60, 0x07, 0x78, 0x80, 0x00, 0x16, 0xf0, 0xc3, 0xdd, 0x02, 0x4f, + 0x00, 0x0f, 0xe1, 0x2f, 0xe0, 0x14, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x5b, 0x03, 0x00, 0x00, 0x0f, + 0x10, 0x08, 0x06, 0xa0, 0xc7, 0x7e, 0x01, 0xc2, 0xff, 0x80, 0x01, 0x82, 0x24, 0x00, 0x07, 0x8e, + 0x01, 0x04, 0x03, 0x00, 0x00, 0x02, 0x01, 0x5e, 0x20, 0x00, 0x16, 0xf0, 0xc7, 0x82, 0x03, 0x00, + 0x00, 0x0f, 0x03, 0x90, 0x60, 0x3f, 0x04, 0x59, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02, + 0x01, 0x5e, 0x20, 0x00, 0x13, 0x06, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, + 0xc7, 0x8f, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60, 0xc5, 0x60, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, + 0x00, 0x02, 0x01, 0x5e, 0x20, 0x00, 0x16, 0x10, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60, 0xc6, 0x22, + 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02, 0x01, 0x5e, 0x20, 0x00, 0x16, 0x09, 0x07, 0xa0, + 0x01, 0x04, 0xdb, 0x86, 0x01, 0x85, 0x58, 0x00, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60, 0xc5, 0x6a, + 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, + 0x13, 0xee, 0x01, 0xc0, 0x00, 0x80, 0x01, 0xc5, 0x58, 0x00, 0x10, 0xee, 0x07, 0x8e, 0x80, 0x20, + 0xc2, 0x60, 0x01, 0x62, 0x04, 0xe0, 0x01, 0x62, 0x07, 0x8c, 0x09, 0x34, 0xcf, 0x1e, 0x11, 0x16, + 0xc3, 0x5e, 0xc3, 0xfe, 0xcf, 0x1e, 0xe3, 0x5e, 0xa3, 0xfe, 0xcf, 0x1e, 0xe3, 0x5e, 0x13, 0x0e, + 0xa3, 0xfe, 0x83, 0xfe, 0x16, 0x0b, 0xc3, 0x7e, 0x05, 0x4d, 0x83, 0x6e, 0xff, 0xf6, 0x16, 0x06, + 0x02, 0x8e, 0x80, 0x30, 0x16, 0xf8, 0xc8, 0x09, 0x01, 0x62, 0x04, 0x5b, 0xc8, 0x09, 0x01, 0x62, + 0x07, 0x20, 0x09, 0x34, 0x04, 0x5b, 0x04, 0xe0, 0x01, 0x68, 0xc8, 0x20, 0x07, 0xe4, 0x01, 0x18, + 0xc3, 0x60, 0x07, 0xe2, 0x07, 0x8f, 0x00, 0x81, 0xd3, 0xe0, 0x07, 0xf4, 0x01, 0x4d, 0x40, 0x00, + 0x16, 0x01, 0x05, 0x8f, 0xc8, 0x0f, 0x07, 0xf8, 0x07, 0x8f, 0x00, 0x81, 0xd3, 0xe0, 0x07, 0xee, + 0x01, 0x4d, 0x80, 0x00, 0x16, 0x01, 0x05, 0x8f, 0xc8, 0x0f, 0x07, 0xee, 0x01, 0x8d, 0xc0, 0x00, + 0xc8, 0x0d, 0x01, 0x1a, 0x04, 0x60, 0xc4, 0x16, 0x07, 0x8c, 0xee, 0x00, 0x06, 0xa0, 0x90, 0x94, + 0x07, 0x8c, 0xed, 0x90, 0x06, 0xa0, 0x90, 0x94, 0x04, 0xe0, 0x01, 0x04, 0x04, 0x60, 0xc5, 0x6a, + 0x02, 0x85, 0x00, 0x0e, 0x1a, 0x05, 0x01, 0x09, 0x0f, 0x00, 0x13, 0x02, 0x04, 0x60, 0xdd, 0x6a, + 0x99, 0x49, 0xea, 0xd0, 0x04, 0x60, 0xdd, 0x54, 0x20, 0x00, 0xb3, 0xcc, 0x00, 0x14, 0x07, 0x8b, + 0x01, 0x04, 0x01, 0x5b, 0x20, 0x00, 0x16, 0xfd, 0xd8, 0x20, 0x07, 0xdf, 0x01, 0x17, 0x07, 0x9b, + 0xdf, 0x80, 0x20, 0x00, 0xff, 0xc0, 0x00, 0x2a, 0x03, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x01, 0x00, + 0x00, 0x80, 0x06, 0x4e, 0x02, 0x01, 0xef, 0xfa, 0xcc, 0x4d, 0xcc, 0x4e, 0xc4, 0x4f, 0x02, 0x00, + 0x00, 0x01, 0xc8, 0x00, 0xef, 0xe0, 0x88, 0x00, 0xef, 0xe0, 0x13, 0xfd, 0x02, 0xe0, 0xef, 0xe0, + 0x03, 0x80, 0x20, 0x00, 0xae, 0x00, 0x00, 0xaa, 0xc3, 0xce, 0x10, 0x32, 0x00, 0x00, 0xc0, 0x3c, + 0x08, 0x4e, 0x00, 0x00, 0xc0, 0x20, 0x07, 0x78, 0x00, 0x00, 0x00, 0x02, 0x08, 0x56, 0x01, 0x0c, + 0x00, 0x08, 0x08, 0x62, 0x03, 0xf8, 0x00, 0x06, 0x00, 0x00, 0x12, 0x00, 0x00, 0x02, 0x08, 0x7e, + 0x01, 0x8c, 0x00, 0x02, 0x07, 0x78, 0x07, 0xff, 0x00, 0x06, 0x07, 0x7e, 0xfc, 0x76, 0xbe, 0xad, + 0x01, 0x0a, 0x00, 0x08, 0x07, 0x8a, 0x00, 0x06, 0x00, 0x00, 0xcf, 0x7a, 0x11, 0x28, 0x00, 0x04, + 0x13, 0xa0, 0x13, 0xa0, 0x90, 0x2a, 0x00, 0x02, 0x08, 0x96, 0x97, 0x6a, 0xc0, 0x04, 0x08, 0x9e, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x9d, 0xc8, 0x01, 0x80, 0x01, 0x00, 0x01, 0x38, 0x01, 0x7c, + 0x01, 0xce, 0x02, 0x32, 0x02, 0xae, 0x03, 0x42, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, + 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, + 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, + 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, + 0xcc, 0x00, 0x20, 0x00, 0xb2, 0x98, 0x00, 0x04, 0x02, 0x09, 0x14, 0x00, 0x20, 0x00, 0xb2, 0xa8, + 0x00, 0x02, 0x90, 0x00, 0x20, 0x00, 0xb1, 0x00, 0x00, 0x02, 0x90, 0x00, 0x20, 0x00, 0xf8, 0x08, + 0x00, 0x02, 0x90, 0x00, 0x20, 0x00, 0xc8, 0xbe, 0x00, 0x04, 0xc2, 0xcb, 0xc2, 0xcb, 0x20, 0x00, + 0xbf, 0xb4, 0x00, 0x08, 0x88, 0x0b, 0x07, 0x98, 0x88, 0x0b, 0x07, 0x78, 0x20, 0x00, 0xc0, 0x54, + 0x00, 0x04, 0x06, 0xa0, 0xfa, 0x06, 0x20, 0x00, 0xc0, 0x5e, 0x00, 0x04, 0x07, 0x84, 0x07, 0x7a, + 0x20, 0x00, 0xc0, 0xc2, 0x00, 0x04, 0x04, 0x60, 0xfa, 0x10, 0x20, 0x00, 0xc9, 0xc0, 0x00, 0x02, + 0x16, 0xe2, 0x20, 0x00, 0xc9, 0xc2, 0x00, 0x04, 0x06, 0xa0, 0xfa, 0x42, 0x20, 0x00, 0xc9, 0xe8, + 0x00, 0x04, 0x04, 0x60, 0xca, 0x0c, 0x20, 0x00, 0xb9, 0xa0, 0x00, 0x04, 0x04, 0x60, 0x98, 0xa0, + 0x20, 0x00, 0xbb, 0x92, 0x00, 0x04, 0x06, 0xa0, 0x9a, 0xf4, 0x20, 0x00, 0xbc, 0x20, 0x00, 0x04, + 0xc1, 0xe0, 0xfc, 0x02, 0x20, 0x00, 0xc5, 0x5c, 0x00, 0x04, 0x04, 0x60, 0xfc, 0xec, 0x20, 0x00, + 0xc5, 0xa2, 0x00, 0x04, 0x04, 0x60, 0xfc, 0x78, 0x20, 0x00, 0xc5, 0xda, 0x00, 0x04, 0x04, 0x60, + 0xfc, 0xc6, 0x20, 0x00, 0xc6, 0x1c, 0x00, 0x04, 0x04, 0x60, 0xfd, 0x0e, 0x20, 0x00, 0xc2, 0xe6, + 0x00, 0x06, 0x01, 0x20, 0x01, 0x00, 0x00, 0x80, 0x20, 0x00, 0xc3, 0xd4, 0x00, 0x02, 0x01, 0x17, + 0x20, 0x00, 0xa2, 0xca, 0x00, 0x02, 0xc5, 0x60, 0x20, 0x00, 0xa2, 0xd2, 0x00, 0x02, 0xfd, 0x24, + 0x20, 0x00, 0xa2, 0xf2, 0x00, 0x02, 0xfd, 0x24, 0x20, 0x00, 0xa3, 0x18, 0x00, 0x02, 0xce, 0x98, + 0x20, 0x00, 0xc5, 0x6e, 0x00, 0x02, 0x10, 0x0c, 0x20, 0x00, 0xc4, 0x0c, 0x00, 0x04, 0x06, 0xa0, + 0xfd, 0xaa, 0x20, 0x00, 0xcc, 0x38, 0x00, 0x02, 0xc7, 0x7e, 0x20, 0x00, 0xa0, 0xc4, 0x00, 0x02, + 0xc7, 0x7e, 0x20, 0x00, 0xc5, 0xec, 0x00, 0x02, 0xc7, 0xb4, 0x20, 0x00, 0xa0, 0xc0, 0x00, 0x02, + 0xc7, 0xb4, 0x20, 0x00, 0xc5, 0x14, 0x00, 0x04, 0x04, 0x60, 0xfd, 0xec, 0x20, 0x00, 0xc4, 0xe6, + 0x00, 0x04, 0x06, 0xa0, 0xfd, 0x60, 0x20, 0x00, 0xc8, 0x2c, 0x00, 0x02, 0x06, 0x69, 0x20, 0x00, + 0xcc, 0x60, 0x00, 0x02, 0x06, 0x69, 0x20, 0x00, 0xdc, 0x68, 0x00, 0x02, 0x04, 0x5c, 0x20, 0x00, + 0xdc, 0xb8, 0x00, 0x04, 0x04, 0x60, 0xf8, 0x30, 0x20, 0x00, 0xdd, 0x50, 0x00, 0x04, 0x04, 0x60, + 0xfe, 0x04, 0x20, 0x80, 0xb4, 0x88, 0x00, 0x02, 0xfb, 0x88, 0x20, 0x80, 0xdf, 0x06, 0x00, 0x02, + 0x08, 0xa8, 0x20, 0x00, 0xa0, 0x34, 0x00, 0x0a, 0x00, 0x02, 0x28, 0xf1, 0xf0, 0xf1, 0xf8, 0xe7, + 0xe7, 0xe7, 0x20, 0x00, 0xb2, 0x3c, 0x00, 0x02, 0x06, 0x03, 0x20, 0x00, 0xa1, 0x16, 0x00, 0x02, + 0x9c, 0x56, 0x20, 0x00, 0xa1, 0x1a, 0x00, 0x02, 0x98, 0x4e, 0x20, 0x00, 0xa1, 0x1c, 0x00, 0x04, + 0x08, 0x4e, 0x95, 0xa8, 0x20, 0x00, 0xa1, 0x22, 0x00, 0x02, 0xfa, 0x76, 0x20, 0x00, 0xa1, 0x66, + 0x00, 0x02, 0xf8, 0x9a, 0x20, 0x00, 0xa1, 0x6e, 0x00, 0x02, 0x9a, 0x22, 0x20, 0x00, 0xa1, 0x72, + 0x00, 0x02, 0x9b, 0x56, 0x20, 0x00, 0xa1, 0x7a, 0x00, 0x02, 0x9a, 0xb0, 0x20, 0x00, 0xa1, 0x80, + 0x00, 0x04, 0xef, 0xc0, 0xff, 0xc0, 0x20, 0x00, 0xa1, 0x9c, 0x00, 0x02, 0x9d, 0xb8, 0x20, 0x00, + 0xa0, 0xb0, 0x00, 0x02, 0xce, 0xe8, 0x20, 0x00, 0xa0, 0xac, 0x00, 0x02, 0x07, 0x78, 0x20, 0x00, + 0xa2, 0xe6, 0x00, 0x02, 0xfc, 0x1c, 0x20, 0x00, 0xf5, 0xc4, 0x00, 0x02, 0x00, 0x02, 0x20, 0x00, + 0xf6, 0x7a, 0x00, 0x02, 0x00, 0x02, 0x20, 0x00, 0xf6, 0xae, 0x00, 0x02, 0x00, 0x02, 0x20, 0x00, + 0xf5, 0xfa, 0x00, 0x02, 0x02, 0x00, 0x20, 0x00, 0xf6, 0x18, 0x00, 0x02, 0x02, 0x00, 0x20, 0x00, + 0xc5, 0xc8, 0x00, 0x04, 0xc2, 0xa0, 0x07, 0xf8, 0x20, 0x00, 0xc6, 0x9a, 0x00, 0x04, 0xc2, 0xa0, + 0x07, 0xf8, 0x20, 0x00, 0xc6, 0xdc, 0x00, 0x04, 0xc2, 0xa0, 0x07, 0xf8, 0x20, 0x00, 0xcc, 0x24, + 0x00, 0x04, 0xc2, 0xa0, 0x07, 0xee, 0x20, 0x00, 0xa3, 0x64, 0x00, 0x02, 0x07, 0xf8, 0x20, 0x00, + 0xa3, 0x6e, 0x00, 0x02, 0x07, 0xf8, 0x20, 0x00, 0xc3, 0xa6, 0x00, 0x02, 0x3f, 0xfe, 0x20, 0x00, + 0xa4, 0x46, 0x00, 0x02, 0x07, 0x08, 0x30, 0x00, 0x90, 0xf0, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, + 0x11, 0xf8, 0x30, 0x00, 0x92, 0x2a, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, + 0x93, 0x5c, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0x94, 0x5a, 0x00, 0x06, + 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0x95, 0x16, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, + 0x11, 0xf8, 0x30, 0x00, 0xcf, 0xe2, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, + 0xd0, 0x14, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd0, 0x5e, 0x00, 0x06, + 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd0, 0x98, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, + 0x11, 0xf8, 0x30, 0x00, 0xd0, 0xea, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, + 0xd1, 0x52, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd1, 0x76, 0x00, 0x06, + 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd1, 0xb6, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, + 0x11, 0xf8, 0x30, 0x00, 0xd1, 0xec, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, + 0xd2, 0x3c, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd2, 0xca, 0x00, 0x06, + 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd3, 0x30, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, + 0x11, 0xf8, 0x30, 0x00, 0xd4, 0x5a, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, + 0xd4, 0xaa, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd4, 0xea, 0x00, 0x06, + 0xc3, 0xa0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd5, 0x0a, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, + 0x11, 0xf8, 0x30, 0x00, 0xd5, 0x54, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, + 0xd5, 0xae, 0x00, 0x06, 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xfb, 0x9e, 0x00, 0x06, + 0xc1, 0xe0, 0xf0, 0x00, 0x11, 0x14, 0x30, 0x00, 0xc7, 0x4e, 0x00, 0x06, 0x01, 0x60, 0xf0, 0x00, + 0x80, 0x00, 0x30, 0x00, 0xc7, 0x86, 0x00, 0x06, 0x01, 0x60, 0xf0, 0x00, 0x80, 0x00, 0x30, 0x00, + 0xc7, 0xbc, 0x00, 0x06, 0x01, 0x60, 0xf0, 0x00, 0x80, 0x00, 0x30, 0x00, 0x95, 0x5e, 0x00, 0x04, + 0xed, 0x03, 0xed, 0x03, 0x30, 0x00, 0x95, 0x8a, 0x00, 0x04, 0xed, 0x03, 0xed, 0x03, 0x34, 0x00, + 0x91, 0xa4, 0x00, 0x02, 0x60, 0x82, 0x34, 0x00, 0x92, 0x44, 0x00, 0x02, 0x60, 0x82, 0x34, 0x00, + 0x93, 0x78, 0x00, 0x02, 0x60, 0x82, 0x34, 0x00, 0x94, 0x7a, 0x00, 0x02, 0x68, 0x82, 0x34, 0x00, + 0x95, 0x32, 0x00, 0x02, 0x60, 0x82, 0x34, 0x00, 0x95, 0x6c, 0x00, 0x02, 0x68, 0x82, 0x34, 0x00, + 0x95, 0x98, 0x00, 0x02, 0x68, 0x82, 0x34, 0x00, 0x95, 0xda, 0x00, 0x02, 0x20, 0x82, 0x38, 0x00, + 0xd0, 0x76, 0x00, 0x02, 0xe0, 0x82, 0x38, 0x00, 0xd0, 0xca, 0x00, 0x02, 0xe0, 0x82, 0x38, 0x00, + 0xd4, 0x3a, 0x00, 0x02, 0xe0, 0x82, 0x20, 0x00, 0xa0, 0x02, 0x00, 0x02, 0xf9, 0xe0, 0x20, 0x00, + 0xa0, 0x7a, 0x00, 0x02, 0xe5, 0x18, 0x20, 0x80, 0xa0, 0x02, 0x00, 0x02, 0x5b, 0x58, 0x20, 0x80, + 0xa0, 0x7a, 0x00, 0x02, 0x83, 0xa0, 0x30, 0x00, 0xa0, 0x02, 0x00, 0x02, 0xae, 0x4f, 0x30, 0x00, + 0xa0, 0x7a, 0x00, 0x02, 0x2f, 0xfc, 0x30, 0x80, 0xa0, 0x02, 0x00, 0x02, 0x0f, 0xc7, 0x30, 0x80, + 0xa0, 0x7a, 0x00, 0x02, 0xce, 0x84, 0x34, 0x00, 0xa0, 0x02, 0x00, 0x02, 0xae, 0x4f, 0x34, 0x00, + 0xa0, 0x7a, 0x00, 0x02, 0x2f, 0xf4, 0x34, 0x80, 0xa0, 0x02, 0x00, 0x02, 0x0f, 0xc7, 0x34, 0x80, + 0xa0, 0x7a, 0x00, 0x02, 0xce, 0x7c, 0x38, 0x00, 0xa0, 0x02, 0x00, 0x02, 0xae, 0x52, 0x38, 0x00, + 0xa0, 0x7a, 0x00, 0x02, 0x2f, 0xf1, 0x38, 0x80, 0xa0, 0x02, 0x00, 0x02, 0x0f, 0xca, 0x38, 0x80, + 0xa0, 0x7a, 0x00, 0x02, 0xce, 0x79, 0x00, 0x00, 0x80, 0x00, 0x09, 0xfc, 0x53, 0x4d, 0x41, 0x43, + 0x2e, 0x30, 0x30, 0x2e, 0x33, 0x38, 0x20, 0x20, 0x28, 0x43, 0x29, 0x20, 0x43, 0x6f, 0x70, 0x79, + 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4f, 0x6c, 0x69, 0x63, 0x6f, 0x6d, 0x20, 0x31, 0x39, 0x39, + 0x38, 0x2e, 0x00, 0x00, 0x07, 0xa0, 0x13, 0x04, 0xc4, 0x00, 0x01, 0x60, 0x09, 0x6a, 0x80, 0x00, + 0x16, 0x03, 0x01, 0xa0, 0x09, 0x6a, 0x00, 0x60, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x40, 0x16, 0x34, + 0x01, 0x20, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x30, 0xd8, 0x20, 0x09, 0x2e, 0x13, 0x06, 0xd8, 0x20, + 0x01, 0x80, 0x13, 0x08, 0xd8, 0x20, 0x01, 0x82, 0x13, 0x0a, 0x07, 0xa0, 0x13, 0x00, 0x87, 0xe0, + 0x07, 0xa0, 0x13, 0x02, 0xed, 0xb6, 0x07, 0xa0, 0x13, 0x14, 0x00, 0x04, 0x06, 0xa0, 0x84, 0xd0, + 0x07, 0xa0, 0x13, 0x0c, 0x04, 0x00, 0xd8, 0x20, 0xef, 0x54, 0x09, 0x2e, 0x01, 0xe0, 0x13, 0x0c, + 0x10, 0x00, 0x01, 0xa0, 0x13, 0x0c, 0x28, 0x00, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x20, 0x16, 0x03, + 0x01, 0xe0, 0x13, 0x0c, 0x28, 0x00, 0x07, 0xa0, 0x13, 0x4c, 0x00, 0x02, 0x02, 0x0a, 0x00, 0x02, + 0x01, 0xe0, 0x13, 0x0e, 0x01, 0x80, 0x10, 0x09, 0x07, 0xa0, 0x13, 0x00, 0xdb, 0xc4, 0x07, 0xa0, + 0x13, 0x02, 0xea, 0xb0, 0x01, 0xa0, 0x13, 0x0c, 0x38, 0x00, 0x06, 0xa0, 0xdc, 0x32, 0xc2, 0xe0, + 0x13, 0x00, 0x04, 0x5b, 0x01, 0x4e, 0x00, 0x40, 0x16, 0x02, 0x04, 0x60, 0xcc, 0xb4, 0x02, 0x0d, + 0x12, 0x00, 0x04, 0x60, 0xcc, 0xa6, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x13, 0x02, 0x04, 0x60, + 0xe3, 0xce, 0xc8, 0x0b, 0x13, 0x52, 0x06, 0xa0, 0xe3, 0xce, 0xd8, 0x20, 0xe0, 0x0a, 0xfc, 0x06, + 0xc2, 0xe0, 0x13, 0x52, 0x04, 0x5b, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x06, 0x02, 0x84, + 0x00, 0x12, 0x13, 0x15, 0x02, 0x84, 0x00, 0x14, 0x13, 0x2d, 0x06, 0xa0, 0xe3, 0xce, 0x01, 0x60, + 0x13, 0x0c, 0x10, 0x00, 0x16, 0x0a, 0xd8, 0x20, 0xe0, 0x0a, 0x04, 0x06, 0x88, 0x20, 0x13, 0x54, + 0x03, 0xf8, 0x13, 0x03, 0x07, 0xa0, 0x03, 0xf8, 0x81, 0x8c, 0x04, 0x60, 0xdb, 0x96, 0x02, 0x04, + 0x00, 0x08, 0x06, 0xa0, 0xe3, 0xce, 0x07, 0xa0, 0x03, 0xf8, 0x81, 0x8c, 0x02, 0x05, 0x04, 0x04, + 0x02, 0x06, 0xef, 0x5c, 0xcd, 0x76, 0xcd, 0x76, 0x02, 0x25, 0x00, 0x0c, 0xcd, 0x76, 0xcd, 0x76, + 0xcd, 0x76, 0xcd, 0x60, 0x13, 0x12, 0xcd, 0x76, 0xcd, 0x60, 0x13, 0x4c, 0xcd, 0x76, 0xc5, 0x60, + 0x09, 0x1e, 0x10, 0xe3, 0x02, 0x04, 0x00, 0x08, 0x06, 0xa0, 0xe3, 0xce, 0x07, 0xa0, 0x03, 0xf8, + 0x81, 0x8c, 0x02, 0x05, 0x04, 0x04, 0x02, 0x06, 0xef, 0x6a, 0xcd, 0x76, 0xcd, 0x76, 0x02, 0x25, + 0x00, 0x0c, 0xcd, 0x76, 0xcd, 0x76, 0x10, 0xd1, 0x04, 0x60, 0x87, 0xe0, 0x01, 0x4f, 0x00, 0x0a, + 0x16, 0x03, 0x01, 0x4f, 0x00, 0x80, 0x04, 0x5b, 0x04, 0x60, 0xda, 0x04, 0xc0, 0xc3, 0x13, 0x06, + 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x02, 0x01, 0xd6, 0x00, 0x80, 0x07, 0x86, 0x07, 0x36, + 0x04, 0x60, 0xe3, 0x7a, 0xa0, 0x60, 0x13, 0x02, 0xc1, 0x11, 0x04, 0x54, 0x01, 0x48, 0x40, 0x00, + 0x16, 0x06, 0x01, 0x88, 0x40, 0x00, 0x02, 0x28, 0xef, 0x00, 0x04, 0x60, 0xe0, 0x36, 0x02, 0x28, + 0xe3, 0xee, 0x04, 0x60, 0xe0, 0x36, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x06, 0x02, 0x85, + 0x00, 0x12, 0x13, 0x0a, 0x02, 0x85, 0x00, 0x14, 0x13, 0x07, 0x02, 0x85, 0x00, 0x15, 0x13, 0x24, + 0x02, 0x85, 0x00, 0x10, 0x04, 0x60, 0xdd, 0x4c, 0x02, 0x03, 0x80, 0x02, 0x88, 0x24, 0x00, 0x14, + 0xe0, 0x1c, 0x16, 0x19, 0x05, 0x83, 0x05, 0x83, 0x92, 0x60, 0xef, 0x9e, 0x16, 0x14, 0x05, 0x83, + 0x99, 0x20, 0xe0, 0x0e, 0x00, 0x18, 0x16, 0x0f, 0x05, 0x83, 0x05, 0x83, 0x02, 0x85, 0x00, 0x12, + 0x16, 0x05, 0x99, 0x20, 0xef, 0xa0, 0x00, 0x19, 0x16, 0x06, 0x10, 0x04, 0x99, 0x20, 0xef, 0xa1, + 0x00, 0x19, 0x16, 0x01, 0x04, 0xc3, 0x04, 0x5c, 0x02, 0x03, 0x80, 0x02, 0x88, 0x24, 0x00, 0x14, + 0xe0, 0x1e, 0x16, 0xf9, 0x05, 0x83, 0x05, 0x83, 0x92, 0x60, 0xef, 0x9e, 0x16, 0xf4, 0x04, 0xc3, + 0x10, 0xf2, 0x02, 0x85, 0x00, 0x15, 0x13, 0x09, 0x02, 0x85, 0x00, 0x09, 0x13, 0x02, 0x06, 0xa0, + 0xe2, 0xe4, 0xa1, 0x45, 0xc1, 0x65, 0xe3, 0xac, 0x04, 0x55, 0x06, 0xa0, 0xe1, 0xa2, 0x01, 0x60, + 0x13, 0x0c, 0x04, 0x00, 0x16, 0x19, 0x01, 0x4f, 0x00, 0x80, 0x16, 0x09, 0x01, 0xe0, 0x13, 0x0e, + 0x20, 0x00, 0x02, 0x03, 0x80, 0x10, 0x06, 0xa0, 0xe3, 0x56, 0x06, 0xa0, 0xe2, 0x72, 0x01, 0xe0, + 0x13, 0x0e, 0x00, 0x10, 0x07, 0xa0, 0x13, 0x00, 0x87, 0xe0, 0x07, 0xa0, 0x13, 0x02, 0xed, 0xb6, + 0x01, 0x8f, 0x00, 0x80, 0x02, 0x0a, 0x00, 0x08, 0x04, 0x60, 0x80, 0xbe, 0x02, 0x0d, 0x80, 0x00, + 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x02, 0x02, 0x0d, 0x80, 0x80, 0x04, 0x52, 0x01, 0x60, + 0x13, 0x0e, 0x20, 0x00, 0x16, 0x02, 0x02, 0x03, 0x82, 0x00, 0x04, 0x60, 0xdb, 0xb8, 0x02, 0x8f, + 0x00, 0x06, 0x16, 0x56, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0xa0, 0x05, 0xa0, 0x13, 0x16, 0x06, 0xa0, + 0x85, 0x30, 0x02, 0x08, 0xc0, 0x00, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd, 0x04, 0x00, 0x10, 0x48, + 0x02, 0x8f, 0x00, 0x02, 0x16, 0x45, 0x02, 0x08, 0xc0, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd, + 0x08, 0x00, 0x10, 0x3e, 0x93, 0xe0, 0xef, 0xa3, 0x13, 0x03, 0x93, 0xe0, 0xef, 0xa4, 0x16, 0x38, + 0xd2, 0xa0, 0xef, 0xa5, 0x10, 0x35, 0x02, 0x8f, 0x00, 0x06, 0x16, 0x32, 0x02, 0x03, 0x00, 0x03, + 0x04, 0x60, 0x82, 0xc2, 0x93, 0xe0, 0xef, 0xa5, 0x16, 0x2b, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0x80, + 0x06, 0xa0, 0x85, 0x30, 0x04, 0xcf, 0x02, 0x0a, 0x00, 0x04, 0x02, 0x08, 0xc0, 0x1e, 0x06, 0xa0, + 0xe0, 0x22, 0x02, 0x03, 0x68, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0x02, 0x03, 0x80, 0x10, 0x06, 0xa0, + 0xe3, 0x56, 0x10, 0x16, 0x02, 0x8f, 0x00, 0x04, 0x16, 0x13, 0x02, 0x03, 0x00, 0x03, 0x04, 0x60, + 0x82, 0xc2, 0x02, 0x8f, 0x00, 0x02, 0x16, 0x7a, 0x01, 0x60, 0x13, 0x0e, 0x00, 0x08, 0x16, 0x02, + 0x04, 0x60, 0x85, 0x56, 0x02, 0x0a, 0x00, 0x04, 0x02, 0x08, 0xc0, 0x1e, 0x06, 0xa0, 0xe0, 0x22, + 0x10, 0x6d, 0x01, 0x60, 0x13, 0x0e, 0x40, 0x00, 0x16, 0x69, 0x02, 0x8f, 0x00, 0x06, 0x16, 0x07, + 0x01, 0xe0, 0x13, 0x0e, 0x00, 0xa0, 0x05, 0xa0, 0x13, 0x16, 0x06, 0xa0, 0x85, 0x30, 0x02, 0x08, + 0xc0, 0x30, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd, 0x01, 0x00, 0x10, 0x58, 0x93, 0xe0, 0xef, 0xa3, + 0x16, 0x55, 0x02, 0x08, 0xc0, 0x36, 0x06, 0xa0, 0xe0, 0x22, 0x07, 0xa0, 0x07, 0x08, 0x00, 0x05, + 0x01, 0x60, 0x13, 0x0e, 0x04, 0x00, 0x16, 0x03, 0x07, 0xa0, 0x07, 0x08, 0x00, 0x02, 0x02, 0x05, + 0x03, 0xf8, 0x02, 0x04, 0x00, 0x04, 0x04, 0x60, 0x80, 0xfa, 0xc1, 0x20, 0x01, 0x84, 0x02, 0x44, + 0x88, 0x00, 0x13, 0x12, 0x48, 0x04, 0x01, 0x84, 0x06, 0x20, 0x07, 0x02, 0x16, 0x08, 0x01, 0xe0, + 0x13, 0x0e, 0x04, 0x00, 0x07, 0x83, 0xc0, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x2f, 0x02, 0x08, + 0xc0, 0x3c, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x2a, 0x01, 0xe0, 0x01, 0x82, 0x40, 0x00, 0x06, 0xa0, + 0xe0, 0x18, 0x07, 0x20, 0x07, 0x02, 0x01, 0x8e, 0x80, 0x00, 0x01, 0xa0, 0x13, 0x0e, 0x06, 0x00, + 0x10, 0x1d, 0x02, 0x8f, 0x00, 0x02, 0x16, 0x1a, 0x01, 0x20, 0x13, 0x0e, 0x00, 0x40, 0x16, 0x16, + 0xc2, 0x20, 0x13, 0x14, 0x13, 0x09, 0x06, 0x20, 0x13, 0x14, 0x02, 0x08, 0xc0, 0x42, 0x06, 0xa0, + 0xe0, 0x22, 0x01, 0xcd, 0x08, 0x00, 0x10, 0x0a, 0x01, 0x60, 0x13, 0x0c, 0x20, 0x00, 0x13, 0x02, + 0x04, 0x60, 0x85, 0x56, 0x02, 0x03, 0x00, 0x05, 0x04, 0x60, 0x82, 0xc2, 0x04, 0x60, 0x87, 0xe0, + 0x02, 0x8f, 0x00, 0x06, 0x16, 0x04, 0x02, 0x03, 0x00, 0x05, 0x04, 0x60, 0x82, 0xc2, 0x01, 0x60, + 0x13, 0x0e, 0x20, 0x00, 0x16, 0xf3, 0x93, 0xe0, 0xef, 0xa2, 0x16, 0xf0, 0x01, 0xa0, 0x13, 0x0e, + 0x50, 0x80, 0x06, 0xa0, 0x85, 0x30, 0x01, 0xce, 0x00, 0x01, 0xd2, 0xa0, 0xef, 0xa3, 0x07, 0xa0, + 0x07, 0x08, 0x00, 0x05, 0x01, 0x60, 0x13, 0x0e, 0x04, 0x00, 0x16, 0x03, 0x07, 0xa0, 0x07, 0x08, + 0x00, 0x02, 0x02, 0x08, 0xc0, 0x36, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x0c, 0x06, 0xa0, + 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x18, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0xd0, 0x02, 0x8f, 0x00, 0x08, + 0x16, 0xcd, 0x07, 0xa0, 0x13, 0x14, 0x00, 0x0c, 0x04, 0x60, 0x80, 0x74, 0xc3, 0x0b, 0x06, 0xa0, + 0x85, 0x48, 0x06, 0xa0, 0x84, 0xf2, 0xc2, 0xcc, 0x04, 0xe0, 0x13, 0x0e, 0x04, 0xe0, 0x13, 0x16, + 0x04, 0xe0, 0x06, 0xdc, 0x04, 0xe0, 0x06, 0xde, 0x04, 0xe0, 0x06, 0xe0, 0x04, 0x5b, 0x02, 0x06, + 0x00, 0x05, 0x02, 0x04, 0x13, 0x1a, 0xc1, 0x54, 0x13, 0x01, 0x2c, 0xd4, 0x02, 0x24, 0x00, 0x0a, + 0x06, 0x06, 0x16, 0xf9, 0x04, 0x5b, 0x02, 0x06, 0x00, 0x05, 0x02, 0x04, 0x06, 0x72, 0xc1, 0x54, + 0x13, 0x01, 0x2c, 0xd4, 0x02, 0x24, 0x00, 0x0a, 0x06, 0x06, 0x16, 0xf9, 0x04, 0x5b, 0x01, 0x60, + 0x13, 0x0e, 0x08, 0x00, 0x16, 0x03, 0x01, 0xe0, 0x01, 0x82, 0x20, 0x00, 0x01, 0x60, 0x13, 0x0e, + 0x00, 0x80, 0x16, 0x04, 0x01, 0xe0, 0x01, 0x82, 0x0a, 0x00, 0x10, 0x03, 0x01, 0xa0, 0x01, 0x82, + 0x0a, 0x00, 0x04, 0x5b, 0x01, 0xa0, 0x01, 0x82, 0x28, 0x00, 0x01, 0xe0, 0x01, 0x82, 0x10, 0x00, + 0x04, 0x5b, 0x06, 0xa0, 0x84, 0xf2, 0x04, 0xe0, 0x13, 0x0e, 0xd8, 0x20, 0x13, 0x06, 0x09, 0x2e, + 0xd8, 0x20, 0x13, 0x08, 0x01, 0x80, 0xd8, 0x20, 0x13, 0x0a, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18, + 0x04, 0x60, 0xe5, 0x62, 0xc0, 0x62, 0x00, 0x04, 0xc8, 0x22, 0x00, 0x06, 0x01, 0x6c, 0x02, 0x82, + 0x04, 0x00, 0x1b, 0x0d, 0x01, 0x8e, 0x08, 0x00, 0x02, 0x8f, 0x00, 0x06, 0x16, 0x08, 0x06, 0x20, + 0x13, 0x16, 0x16, 0x05, 0x01, 0xa0, 0x13, 0x0e, 0x00, 0xa0, 0x06, 0xa0, 0x85, 0x30, 0xc1, 0x22, + 0x00, 0x0e, 0x04, 0x51, 0xc8, 0x02, 0x01, 0x6c, 0xa0, 0x82, 0xc8, 0x22, 0x0c, 0x32, 0xfc, 0x00, + 0x02, 0x02, 0xfc, 0x00, 0x93, 0xe0, 0xe3, 0xaa, 0x13, 0x71, 0x06, 0xa0, 0xdc, 0xc6, 0x01, 0xa2, + 0x00, 0x0e, 0x80, 0x00, 0xc8, 0x05, 0x06, 0xfc, 0xc0, 0xc3, 0x16, 0x43, 0x01, 0x22, 0x00, 0x16, + 0x0f, 0x00, 0x16, 0x10, 0x88, 0x22, 0x00, 0x0e, 0x09, 0x6c, 0x16, 0x0c, 0x88, 0x22, 0x00, 0x10, + 0x09, 0x6e, 0x16, 0x08, 0x88, 0x22, 0x00, 0x12, 0x09, 0x70, 0x16, 0x04, 0x06, 0xa0, 0xe1, 0xa2, + 0x04, 0x60, 0x87, 0xe0, 0x98, 0xa0, 0xef, 0xa6, 0x00, 0x16, 0x13, 0x04, 0x98, 0xa0, 0xef, 0xa7, + 0x00, 0x16, 0x16, 0x15, 0xc2, 0xe0, 0x06, 0xdc, 0x16, 0x06, 0xc2, 0xe0, 0x06, 0xde, 0x16, 0x03, + 0xc2, 0xe0, 0x06, 0xe0, 0x13, 0x0c, 0x88, 0x22, 0x00, 0x0e, 0x06, 0xdc, 0x16, 0x71, 0x88, 0x22, + 0x00, 0x10, 0x06, 0xde, 0x16, 0x6d, 0x88, 0x22, 0x00, 0x12, 0x06, 0xe0, 0x16, 0x69, 0x02, 0x85, + 0x00, 0x09, 0x13, 0x0b, 0x02, 0x85, 0x00, 0x15, 0x13, 0x08, 0x02, 0x85, 0x00, 0x12, 0x13, 0x0d, + 0x02, 0x85, 0x00, 0x14, 0x13, 0x0e, 0x06, 0xa0, 0xe2, 0xe4, 0xa1, 0x45, 0xc1, 0x65, 0xef, 0x72, + 0x04, 0x55, 0x06, 0xa0, 0xe0, 0x6e, 0x04, 0x60, 0x87, 0xe0, 0xc8, 0x24, 0x00, 0x1a, 0x13, 0x4e, + 0x10, 0xf4, 0xc8, 0x24, 0x00, 0x1a, 0x13, 0x50, 0x10, 0xf0, 0x01, 0x20, 0x13, 0x0e, 0x02, 0x00, + 0x16, 0x07, 0x04, 0xe0, 0x01, 0x84, 0x01, 0xa0, 0x01, 0x82, 0x40, 0x00, 0x06, 0xa0, 0xe0, 0x18, + 0x07, 0xa0, 0x07, 0x02, 0x00, 0x04, 0x01, 0xe0, 0x13, 0x0e, 0x02, 0x00, 0x01, 0xce, 0x80, 0x00, + 0x02, 0x08, 0xc0, 0x3c, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0x87, 0xe0, 0x06, 0xa0, 0xe1, 0xa2, + 0x04, 0x60, 0x87, 0xe0, 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x03, 0x00, 0x05, 0x01, 0x4f, 0x00, 0x80, + 0x16, 0x02, 0x02, 0x03, 0x82, 0x00, 0x04, 0x60, 0x82, 0xc2, 0x01, 0x60, 0x13, 0x0e, 0x20, 0x00, + 0x16, 0x24, 0x93, 0xe0, 0xef, 0xa2, 0x16, 0x0c, 0x01, 0x60, 0x13, 0x0e, 0x20, 0x00, 0x16, 0x28, + 0x02, 0x03, 0xa0, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0x01, 0xa0, 0x13, 0x0e, 0x50, 0x00, 0x10, 0x03, + 0x93, 0xe0, 0xef, 0xa3, 0x16, 0x1d, 0x01, 0xce, 0x00, 0x02, 0xd2, 0xa0, 0xef, 0xa4, 0x02, 0x08, + 0xc0, 0x0c, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x18, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x10, + 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x03, 0x00, 0x0b, 0x10, 0x04, 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x03, + 0x00, 0x05, 0x01, 0x4f, 0x00, 0x80, 0x16, 0x02, 0x02, 0x03, 0x82, 0x00, 0x04, 0x60, 0x82, 0xc2, + 0x10, 0xbd, 0x02, 0x8f, 0x00, 0x02, 0x13, 0xf1, 0x02, 0x8f, 0x00, 0x04, 0x13, 0xee, 0x01, 0x60, + 0x13, 0x0e, 0x40, 0x00, 0x16, 0xf5, 0x02, 0x08, 0xc0, 0x48, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0xf0, + 0x02, 0x8f, 0x00, 0x02, 0x16, 0xab, 0xc0, 0xe0, 0x13, 0x4e, 0x16, 0x0e, 0x01, 0x60, 0x13, 0x0c, + 0x08, 0x00, 0x13, 0xa8, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0x48, 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x08, + 0xc0, 0x24, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x22, 0x02, 0x83, 0x00, 0x02, 0x16, 0xd9, 0xc8, 0x24, + 0x00, 0x0e, 0x06, 0xdc, 0xc8, 0x24, 0x00, 0x10, 0x06, 0xde, 0xc8, 0x24, 0x00, 0x12, 0x06, 0xe0, + 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x08, 0xc0, 0x24, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xe0, 0x13, 0x0e, + 0x00, 0x40, 0xc0, 0xe0, 0x13, 0x12, 0x16, 0x04, 0x01, 0xa0, 0x13, 0x0e, 0x08, 0x01, 0x10, 0x06, + 0x02, 0x83, 0x00, 0x01, 0x16, 0x03, 0x01, 0xe0, 0x13, 0x0e, 0x08, 0x01, 0x10, 0x17, 0x02, 0x8f, + 0x00, 0x06, 0x16, 0xb6, 0xc0, 0xe0, 0x13, 0x50, 0x02, 0x83, 0x00, 0x00, 0x16, 0x05, 0x06, 0xa0, + 0xe1, 0xa2, 0x02, 0x0a, 0x00, 0x0a, 0x10, 0x0a, 0x02, 0x83, 0x80, 0x20, 0x16, 0x04, 0x02, 0x03, + 0x00, 0x08, 0x04, 0x60, 0x82, 0xc2, 0x16, 0xa4, 0x04, 0x60, 0xda, 0x04, 0x92, 0xa0, 0xe0, 0x26, + 0x16, 0x0d, 0xd3, 0xe0, 0xe0, 0x26, 0x01, 0x4f, 0x00, 0x80, 0x13, 0x07, 0xc1, 0x0a, 0x83, 0xc4, + 0x13, 0x08, 0xc3, 0xc4, 0xc1, 0x24, 0xed, 0xd6, 0x04, 0x54, 0x10, 0x03, 0x93, 0xca, 0x13, 0xec, + 0xd3, 0xca, 0x03, 0xb0, 0xd8, 0x0f, 0x06, 0x59, 0x71, 0x04, 0xc1, 0x24, 0xed, 0xe2, 0x04, 0x54, + 0xf8, 0x20, 0xef, 0x54, 0x01, 0x80, 0xf8, 0x20, 0xef, 0x56, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18, + 0x2e, 0xe0, 0x00, 0x00, 0xc8, 0x20, 0x09, 0x6c, 0x01, 0xa0, 0xc8, 0x20, 0x09, 0x6e, 0x01, 0xa2, + 0xc8, 0x20, 0x09, 0x70, 0x01, 0xa4, 0x02, 0x08, 0xc0, 0x06, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0xcc, + 0x07, 0xa0, 0x06, 0xc6, 0x02, 0x00, 0x07, 0xa0, 0x06, 0xc8, 0x00, 0x02, 0xd8, 0x20, 0xef, 0x58, + 0x09, 0x2e, 0xd8, 0x20, 0xef, 0x58, 0x01, 0x80, 0xd8, 0x20, 0xef, 0x5a, 0x01, 0x82, 0x06, 0xa0, + 0xe0, 0x18, 0x04, 0xe0, 0x01, 0x9e, 0x02, 0x08, 0xc0, 0x2a, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x04, + 0x00, 0x0a, 0x02, 0x05, 0x03, 0xf4, 0x06, 0xa0, 0xe3, 0xce, 0x07, 0xa0, 0x03, 0xf8, 0x88, 0x94, + 0x01, 0x4e, 0x08, 0x00, 0x13, 0xa9, 0x01, 0xce, 0x08, 0x00, 0x2e, 0xa0, 0x03, 0xf4, 0x10, 0xa4, + 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x0e, 0x06, 0x65, 0x16, 0x9f, 0x92, 0xa0, 0xe0, 0x26, 0x16, 0x9c, + 0x02, 0x44, 0x5e, 0x00, 0x16, 0x0b, 0x06, 0x20, 0x06, 0xc6, 0x16, 0xdd, 0x02, 0x0a, 0x00, 0x06, + 0x10, 0x95, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x0e, 0x06, 0x65, 0x16, 0x8e, 0x06, 0x20, 0x06, 0xc8, + 0x16, 0xc5, 0x04, 0x60, 0xe6, 0x6a, 0xd8, 0x20, 0xef, 0x54, 0x09, 0x2e, 0xd8, 0x20, 0xef, 0x54, + 0x01, 0x80, 0xd8, 0x20, 0xef, 0x56, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18, 0x01, 0xe0, 0x13, 0x0e, + 0x40, 0x20, 0x07, 0xa0, 0x13, 0x16, 0x00, 0x01, 0x02, 0x08, 0xc0, 0x30, 0x06, 0xa0, 0xe0, 0x22, + 0x02, 0x08, 0xc0, 0x48, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x12, 0x06, 0xa0, 0xe0, 0x22, + 0x02, 0x08, 0xc0, 0x00, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd, 0x04, 0x00, 0x04, 0x60, 0x87, 0xe0, + 0x06, 0xa0, 0x85, 0x48, 0x01, 0xce, 0x00, 0x20, 0x2e, 0xe0, 0x00, 0x00, 0x04, 0xcd, 0x06, 0xa0, + 0x85, 0x0a, 0x02, 0x08, 0xc0, 0x4e, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0x87, 0xe0, 0x01, 0xa0, + 0x13, 0x0e, 0x00, 0x80, 0x06, 0xa0, 0x85, 0x22, 0x01, 0xcf, 0x00, 0x80, 0x01, 0xe0, 0x13, 0x0e, + 0x10, 0x00, 0x01, 0x60, 0x13, 0x0e, 0x00, 0x01, 0x16, 0x04, 0x07, 0x88, 0x80, 0x06, 0x06, 0xa0, + 0xe0, 0x22, 0x01, 0x20, 0x13, 0x0e, 0x20, 0x00, 0x16, 0x07, 0x01, 0xe0, 0x13, 0x0e, 0x20, 0x00, + 0x04, 0xc3, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x0e, 0x01, 0x8e, 0x00, 0x03, 0x02, 0x03, 0x00, 0x10, + 0x06, 0xa0, 0xe3, 0x56, 0x01, 0x60, 0x13, 0x0e, 0x00, 0x10, 0x16, 0x04, 0x02, 0x03, 0x80, 0x08, + 0x06, 0xa0, 0xe3, 0x56, 0xc8, 0x20, 0xe4, 0x6e, 0x01, 0x86, 0x2e, 0xe0, 0x00, 0x01, 0x01, 0x8e, + 0x00, 0x20, 0x04, 0x60, 0x87, 0xdc, 0x02, 0x03, 0xa8, 0x00, 0x01, 0x60, 0x07, 0x08, 0x00, 0x02, + 0x16, 0x02, 0x02, 0x03, 0xe8, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0x01, 0x4e, 0x00, 0x20, 0x13, 0x06, + 0x01, 0xce, 0x00, 0x20, 0x2e, 0xe0, 0x00, 0x00, 0xc0, 0x41, 0x16, 0xfa, 0x06, 0xa0, 0xe1, 0x2e, + 0x02, 0x4a, 0xff, 0x00, 0x02, 0x4f, 0xff, 0x80, 0x02, 0x05, 0x03, 0xf8, 0x02, 0x04, 0x00, 0x04, + 0x04, 0x60, 0x80, 0xfa, 0x02, 0x4a, 0xff, 0x00, 0x02, 0x4f, 0xff, 0x80, 0x04, 0x60, 0x87, 0xdc, + 0x06, 0xa0, 0x85, 0x48, 0x04, 0x60, 0x87, 0xdc, 0x06, 0xa0, 0x84, 0xf2, 0x04, 0xe0, 0x13, 0x0e, + 0x01, 0xce, 0x00, 0x08, 0x04, 0x60, 0xe7, 0xf6, 0x00, 0x00, 0x89, 0xfc, 0x06, 0x05, 0x00, 0x00, + 0x00, 0x00, 0xad, 0x90, 0x00, 0x62, 0xc0, 0x80, 0x13, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x00, + 0xdb, 0xc4, 0x00, 0x02, 0x13, 0x02, 0xea, 0xb0, 0x00, 0x02, 0x13, 0x54, 0xdc, 0x16, 0x00, 0x02, + 0x09, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x13, 0x12, 0x00, 0x01, 0x00, 0x00, 0xda, 0x88, 0xda, 0x7c, + 0x86, 0x6e, 0xda, 0xa6, 0xda, 0x9e, 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x86, 0xda, 0xa8, 0x85, 0xa8, + 0x85, 0x78, 0xdb, 0x78, 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x9e, 0x88, 0x14, + 0x88, 0x44, 0x88, 0xca, 0x89, 0x14, 0x89, 0x32, 0xdb, 0xf6, 0x89, 0x9a, 0x89, 0xd8, 0x89, 0xe4, + 0xe4, 0x6e, 0xdb, 0x9e, 0x89, 0xec, 0xdb, 0x9e, 0x00, 0x00, 0xaf, 0x00, 0x00, 0xa8, 0x13, 0x24, + 0x82, 0xd2, 0x00, 0x14, 0x13, 0x1a, 0x82, 0xf4, 0x00, 0x04, 0x13, 0x38, 0x83, 0x08, 0x02, 0xbc, + 0x13, 0x1a, 0x83, 0x1a, 0x07, 0x08, 0x13, 0x1a, 0x83, 0x28, 0x03, 0xe8, 0x13, 0x1a, 0x83, 0x58, + 0x00, 0xf0, 0x13, 0x1a, 0x83, 0x66, 0x00, 0x14, 0x13, 0x24, 0x88, 0xb6, 0x00, 0x04, 0x13, 0x2e, + 0x83, 0x86, 0x00, 0x64, 0x13, 0x2e, 0x83, 0xb0, 0x00, 0x02, 0x13, 0x42, 0x83, 0xde, 0x00, 0x05, + 0x13, 0x1a, 0x84, 0x26, 0x00, 0x04, 0x13, 0x38, 0x84, 0x64, 0x01, 0xf4, 0x13, 0x1a, 0x84, 0xc0, + 0x00, 0x14, 0xae, 0x00, 0xd9, 0x00, 0x02, 0x00, 0xd9, 0x00, 0x00, 0x1e, 0x10, 0x00, 0x00, 0x10, + 0x30, 0x11, 0x04, 0x0c, 0x04, 0x0e, 0x04, 0x21, 0x00, 0x12, 0x10, 0x00, 0x00, 0x04, 0x30, 0x13, + 0xdb, 0xa8, 0xe8, 0x7c, 0x86, 0xbe, 0x86, 0xa8, 0x86, 0xa8, 0x87, 0x26, 0x86, 0xa8, 0xeb, 0xf2, + 0xdb, 0xa8, 0x86, 0xa0, 0xec, 0x04, 0xe8, 0x62, 0xec, 0x10, 0xec, 0x10, 0xed, 0x3a, 0xed, 0x44, + 0xed, 0x4e, 0x86, 0xa0, 0x87, 0x44, 0x86, 0xa0, 0x87, 0xb2, 0x86, 0xa0, 0x03, 0x00, 0x0f, 0x0d, + 0x00, 0x02, 0x04, 0x06, 0x00, 0x03, 0x00, 0x00, 0xb2, 0xa8, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, + 0xb1, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0xf8, 0x08, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, + 0xb9, 0x0c, 0x00, 0x06, 0x48, 0x20, 0x13, 0x04, 0x01, 0x80, 0x00, 0x00, 0xba, 0x38, 0x00, 0x06, + 0x48, 0x20, 0x13, 0x04, 0x01, 0x80, 0x00, 0x00, 0xbc, 0x88, 0x00, 0x06, 0x48, 0x20, 0x13, 0x04, + 0x01, 0x80, 0x00, 0x00, 0xca, 0xaa, 0x00, 0x04, 0x04, 0x60, 0x82, 0xb0, 0x00, 0x00, 0xc8, 0x2c, + 0x00, 0x02, 0x06, 0x09, 0x00, 0x00, 0xcc, 0x60, 0x00, 0x02, 0x06, 0x09, 0x00, 0x00, 0xdb, 0x1c, + 0x00, 0x04, 0x04, 0x60, 0x82, 0x56, 0x00, 0x00, 0xe0, 0xc8, 0x00, 0x02, 0x80, 0xda, 0x00, 0x00, + 0xed, 0x74, 0x00, 0x02, 0x80, 0xda, 0x00, 0x00, 0xed, 0x94, 0x00, 0x02, 0x80, 0xda, 0x00, 0x00, + 0xe7, 0xae, 0x00, 0x04, 0x06, 0xa0, 0x81, 0x90, 0x00, 0x00, 0xe5, 0xb0, 0x00, 0x04, 0x04, 0x60, + 0x80, 0x28, 0x00, 0x00, 0xdb, 0xc0, 0x00, 0x04, 0x04, 0x60, 0x80, 0xbe, 0x00, 0x00, 0xda, 0x76, + 0x00, 0x04, 0x04, 0x60, 0x81, 0xb8, 0x00, 0x00, 0xe0, 0x32, 0x00, 0x04, 0x04, 0x60, 0x81, 0xc0, + 0x00, 0x00, 0xdb, 0x92, 0x00, 0x04, 0x04, 0x60, 0x80, 0xfa, 0x00, 0x00, 0xe3, 0x76, 0x00, 0x04, + 0x04, 0x60, 0x81, 0xa0, 0x00, 0x00, 0xdd, 0x48, 0x00, 0x04, 0x04, 0x60, 0x81, 0xda, 0x00, 0x00, + 0xcc, 0xa2, 0x00, 0x04, 0x04, 0x60, 0x80, 0xc8, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00 }; + +#endif /* OLTR_NO_TMS_MAC */ diff --git a/sys/contrib/ipfilter/netinet/fil.c b/sys/contrib/ipfilter/netinet/fil.c new file mode 100644 index 0000000..bb6eb52 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/fil.c @@ -0,0 +1,1548 @@ +/* + * Copyright (C) 1993-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + */ +#if !defined(lint) +static const char sccsid[] = "@(#)fil.c 1.36 6/5/96 (C) 1993-1996 Darren Reed"; +/*static const char rcsid[] = "@(#)$Id: fil.c,v 2.3.2.7 1999/10/21 14:21:40 darrenr Exp $";*/ +static const char rcsid[] = "@(#)$FreeBSD$"; +#endif + +#include <sys/errno.h> +#include <sys/types.h> +#include <sys/param.h> +#include <sys/time.h> +#include <sys/file.h> +#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \ + defined(_KERNEL) +# include "opt_ipfilter_log.h" +#endif +#if defined(KERNEL) && defined(__FreeBSD_version) && \ + (__FreeBSD_version >= 220000) +# include <sys/filio.h> +# include <sys/fcntl.h> +#else +# include <sys/ioctl.h> +#endif +#if (defined(_KERNEL) || defined(KERNEL)) && !defined(linux) +# include <sys/systm.h> +#else +# include <stdio.h> +# include <string.h> +# include <stdlib.h> +#endif +#include <sys/uio.h> +#if !defined(__SVR4) && !defined(__svr4__) +# ifndef linux +# include <sys/mbuf.h> +# endif +#else +# include <sys/byteorder.h> +# if SOLARIS2 < 5 +# include <sys/dditypes.h> +# endif +# include <sys/stream.h> +#endif +#ifndef linux +# include <sys/protosw.h> +# include <sys/socket.h> +#endif +#include <net/if.h> +#ifdef sun +# include <net/af.h> +#endif +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#ifndef linux +# include <netinet/ip_var.h> +#endif +#if defined(__sgi) && defined(IFF_DRVRLOCK) /* IRIX 6 */ +# include <sys/hashing.h> +# include <netinet/in_var.h> +#endif +#include <netinet/tcp.h> +#include <netinet/udp.h> +#include <netinet/ip_icmp.h> +#include "netinet/ip_compat.h" +#include <netinet/tcpip.h> +#include "netinet/ip_fil.h" +#include "netinet/ip_proxy.h" +#include "netinet/ip_nat.h" +#include "netinet/ip_frag.h" +#include "netinet/ip_state.h" +#include "netinet/ip_auth.h" +# if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000) +# include <sys/malloc.h> +# if defined(_KERNEL) && !defined(IPFILTER_LKM) +# include "opt_ipfilter.h" +# endif +# endif +#ifndef MIN +# define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#include "netinet/ipl.h" + +#ifndef _KERNEL +# include "ipf.h" +# include "ipt.h" +extern int opts; + +# define FR_IFVERBOSE(ex,second,verb_pr) if (ex) { verbose verb_pr; \ + second; } +# define FR_IFDEBUG(ex,second,verb_pr) if (ex) { debug verb_pr; \ + second; } +# define FR_VERBOSE(verb_pr) verbose verb_pr +# define FR_DEBUG(verb_pr) debug verb_pr +# define SEND_RESET(ip, qif, if, m, fin) send_reset(ip, if) +# define IPLLOG(a, c, d, e) ipllog() +# define FR_NEWAUTH(m, fi, ip, qif) fr_newauth((mb_t *)m, fi, ip) +#else /* #ifndef _KERNEL */ +# define FR_IFVERBOSE(ex,second,verb_pr) ; +# define FR_IFDEBUG(ex,second,verb_pr) ; +# define FR_VERBOSE(verb_pr) +# define FR_DEBUG(verb_pr) +# define IPLLOG(a, c, d, e) ipflog(a, c, d, e) +# if SOLARIS || defined(__sgi) +extern KRWLOCK_T ipf_mutex, ipf_auth, ipf_nat; +extern kmutex_t ipf_rw; +# endif +# if SOLARIS +# define FR_NEWAUTH(m, fi, ip, qif) fr_newauth((mb_t *)m, fi, \ + ip, qif) +# define SEND_RESET(ip, qif, if, fin) send_reset(fin, ip, qif) +# define ICMP_ERROR(b, ip, t, c, if, dst) \ + icmp_error(ip, t, c, if, dst) +# else /* SOLARIS */ +# define FR_NEWAUTH(m, fi, ip, qif) fr_newauth((mb_t *)m, fi, ip) +# ifdef linux +# define SEND_RESET(ip, qif, if, fin) send_reset(ip, ifp) +# define ICMP_ERROR(b, ip, t, c, if, dst) icmp_send(b,t,c,0,if) +# else +# define SEND_RESET(ip, qif, if, fin) send_reset(fin, ip) +# define ICMP_ERROR(b, ip, t, c, if, dst) \ + send_icmp_err(ip, t, c, if, dst) +# endif /* linux */ +# endif /* SOLARIS || __sgi */ +#endif /* _KERNEL */ + + +struct filterstats frstats[2] = {{0,0,0,0,0},{0,0,0,0,0}}; +struct frentry *ipfilter[2][2] = { { NULL, NULL }, { NULL, NULL } }, + *ipacct[2][2] = { { NULL, NULL }, { NULL, NULL } }; +struct frgroup *ipfgroups[3][2]; +int fr_flags = IPF_LOGGING, fr_active = 0; +#if defined(IPFILTER_DEFAULT_BLOCK) +int fr_pass = FR_NOMATCH|FR_BLOCK; +#else +int fr_pass = (IPF_DEFAULT_PASS|FR_NOMATCH); +#endif +char ipfilter_version[] = IPL_VERSION; + +fr_info_t frcache[2]; + +static int fr_tcpudpchk __P((frentry_t *, fr_info_t *)); +static int frflushlist __P((int, minor_t, int *, frentry_t **)); + + +/* + * bit values for identifying presence of individual IP options + */ +struct optlist ipopts[20] = { + { IPOPT_NOP, 0x000001 }, + { IPOPT_RR, 0x000002 }, + { IPOPT_ZSU, 0x000004 }, + { IPOPT_MTUP, 0x000008 }, + { IPOPT_MTUR, 0x000010 }, + { IPOPT_ENCODE, 0x000020 }, + { IPOPT_TS, 0x000040 }, + { IPOPT_TR, 0x000080 }, + { IPOPT_SECURITY, 0x000100 }, + { IPOPT_LSRR, 0x000200 }, + { IPOPT_E_SEC, 0x000400 }, + { IPOPT_CIPSO, 0x000800 }, + { IPOPT_SATID, 0x001000 }, + { IPOPT_SSRR, 0x002000 }, + { IPOPT_ADDEXT, 0x004000 }, + { IPOPT_VISA, 0x008000 }, + { IPOPT_IMITD, 0x010000 }, + { IPOPT_EIP, 0x020000 }, + { IPOPT_FINN, 0x040000 }, + { 0, 0x000000 } +}; + +/* + * bit values for identifying presence of individual IP security options + */ +struct optlist secopt[8] = { + { IPSO_CLASS_RES4, 0x01 }, + { IPSO_CLASS_TOPS, 0x02 }, + { IPSO_CLASS_SECR, 0x04 }, + { IPSO_CLASS_RES3, 0x08 }, + { IPSO_CLASS_CONF, 0x10 }, + { IPSO_CLASS_UNCL, 0x20 }, + { IPSO_CLASS_RES2, 0x40 }, + { IPSO_CLASS_RES1, 0x80 } +}; + + +/* + * compact the IP header into a structure which contains just the info. + * which is useful for comparing IP headers with. + */ +void fr_makefrip(hlen, ip, fin) +int hlen; +ip_t *ip; +fr_info_t *fin; +{ + struct optlist *op; + tcphdr_t *tcp; + fr_ip_t *fi = &fin->fin_fi; + u_short optmsk = 0, secmsk = 0, auth = 0; + int i, mv, ol, off; + u_char *s, opt; + + fin->fin_rev = 0; + fin->fin_fr = NULL; + fin->fin_tcpf = 0; + fin->fin_data[0] = 0; + fin->fin_data[1] = 0; + fin->fin_rule = -1; + fin->fin_group = -1; + fin->fin_id = ip->ip_id; +#ifdef _KERNEL + fin->fin_icode = ipl_unreach; +#endif + fi->fi_v = ip->ip_v; + fi->fi_tos = ip->ip_tos; + fin->fin_hlen = hlen; + fin->fin_dlen = ip->ip_len - hlen; + tcp = (tcphdr_t *)((char *)ip + hlen); + fin->fin_dp = (void *)tcp; + (*(((u_short *)fi) + 1)) = (*(((u_short *)ip) + 4)); + fi->fi_src.s_addr = ip->ip_src.s_addr; + fi->fi_dst.s_addr = ip->ip_dst.s_addr; + + fi->fi_fl = (hlen > sizeof(ip_t)) ? FI_OPTIONS : 0; + off = (ip->ip_off & IP_OFFMASK) << 3; + if (ip->ip_off & 0x3fff) + fi->fi_fl |= FI_FRAG; + switch (ip->ip_p) + { + case IPPROTO_ICMP : + { + int minicmpsz = sizeof(struct icmp); + icmphdr_t *icmp; + + icmp = (icmphdr_t *)tcp; + + if (!off && (icmp->icmp_type == ICMP_ECHOREPLY || + icmp->icmp_type == ICMP_ECHO)) + minicmpsz = ICMP_MINLEN; + if ((!(ip->ip_len >= hlen + minicmpsz) && !off) || + (off && off < sizeof(struct icmp))) + fi->fi_fl |= FI_SHORT; + if (fin->fin_dlen > 1) + fin->fin_data[0] = *(u_short *)tcp; + break; + } + case IPPROTO_TCP : + fi->fi_fl |= FI_TCPUDP; + if ((!IPMINLEN(ip, tcphdr) && !off) || + (off && off < sizeof(struct tcphdr))) + fi->fi_fl |= FI_SHORT; + if (!(fi->fi_fl & FI_SHORT) && !off) + fin->fin_tcpf = tcp->th_flags; + goto getports; + case IPPROTO_UDP : + fi->fi_fl |= FI_TCPUDP; + if ((!IPMINLEN(ip, udphdr) && !off) || + (off && off < sizeof(struct udphdr))) + fi->fi_fl |= FI_SHORT; +getports: + if (!off && (fin->fin_dlen > 3)) { + fin->fin_data[0] = ntohs(tcp->th_sport); + fin->fin_data[1] = ntohs(tcp->th_dport); + } + break; + default : + break; + } + + + for (s = (u_char *)(ip + 1), hlen -= (int)sizeof(*ip); hlen; ) { + opt = *s; + if (opt == '\0') + break; + ol = (opt == IPOPT_NOP) ? 1 : (int)*(s+1); + if (opt > 1 && (ol < 2 || ol > hlen)) + break; + for (i = 9, mv = 4; mv >= 0; ) { + op = ipopts + i; + if (opt == (u_char)op->ol_val) { + optmsk |= op->ol_bit; + if (opt == IPOPT_SECURITY) { + struct optlist *sp; + u_char sec; + int j, m; + + sec = *(s + 2); /* classification */ + for (j = 3, m = 2; m >= 0; ) { + sp = secopt + j; + if (sec == sp->ol_val) { + secmsk |= sp->ol_bit; + auth = *(s + 3); + auth *= 256; + auth += *(s + 4); + break; + } + if (sec < sp->ol_val) + j -= m--; + else + j += m--; + } + } + break; + } + if (opt < op->ol_val) + i -= mv--; + else + i += mv--; + } + hlen -= ol; + s += ol; + } + if (auth && !(auth & 0x0100)) + auth &= 0xff00; + fi->fi_optmsk = optmsk; + fi->fi_secmsk = secmsk; + fi->fi_auth = auth; +} + + +/* + * check an IP packet for TCP/UDP characteristics such as ports and flags. + */ +static int fr_tcpudpchk(fr, fin) +frentry_t *fr; +fr_info_t *fin; +{ + register u_short po, tup; + register char i; + register int err = 1; + + /* + * Both ports should *always* be in the first fragment. + * So far, I cannot find any cases where they can not be. + * + * compare destination ports + */ + if ((i = (int)fr->fr_dcmp)) { + po = fr->fr_dport; + tup = fin->fin_data[1]; + /* + * Do opposite test to that required and + * continue if that succeeds. + */ + if (!--i && tup != po) /* EQUAL */ + err = 0; + else if (!--i && tup == po) /* NOTEQUAL */ + err = 0; + else if (!--i && tup >= po) /* LESSTHAN */ + err = 0; + else if (!--i && tup <= po) /* GREATERTHAN */ + err = 0; + else if (!--i && tup > po) /* LT or EQ */ + err = 0; + else if (!--i && tup < po) /* GT or EQ */ + err = 0; + else if (!--i && /* Out of range */ + (tup >= po && tup <= fr->fr_dtop)) + err = 0; + else if (!--i && /* In range */ + (tup <= po || tup >= fr->fr_dtop)) + err = 0; + } + /* + * compare source ports + */ + if (err && (i = (int)fr->fr_scmp)) { + po = fr->fr_sport; + tup = fin->fin_data[0]; + if (!--i && tup != po) + err = 0; + else if (!--i && tup == po) + err = 0; + else if (!--i && tup >= po) + err = 0; + else if (!--i && tup <= po) + err = 0; + else if (!--i && tup > po) + err = 0; + else if (!--i && tup < po) + err = 0; + else if (!--i && /* Out of range */ + (tup >= po && tup <= fr->fr_stop)) + err = 0; + else if (!--i && /* In range */ + (tup <= po || tup >= fr->fr_stop)) + err = 0; + } + + /* + * If we don't have all the TCP/UDP header, then how can we + * expect to do any sort of match on it ? If we were looking for + * TCP flags, then NO match. If not, then match (which should + * satisfy the "short" class too). + */ + if (err && (fin->fin_fi.fi_p == IPPROTO_TCP)) { + if (fin->fin_fi.fi_fl & FI_SHORT) + return !(fr->fr_tcpf | fr->fr_tcpfm); + /* + * Match the flags ? If not, abort this match. + */ + if (fr->fr_tcpfm && + fr->fr_tcpf != (fin->fin_tcpf & fr->fr_tcpfm)) { + FR_DEBUG(("f. %#x & %#x != %#x\n", fin->fin_tcpf, + fr->fr_tcpfm, fr->fr_tcpf)); + err = 0; + } + } + return err; +} + +/* + * Check the input/output list of rules for a match and result. + * Could be per interface, but this gets real nasty when you don't have + * kernel sauce. + */ +int fr_scanlist(pass, ip, fin, m) +u_32_t pass; +ip_t *ip; +register fr_info_t *fin; +void *m; +{ + register struct frentry *fr; + register fr_ip_t *fi = &fin->fin_fi; + int rulen, portcmp = 0, off, skip = 0, logged = 0; + u_32_t passt; + + fr = fin->fin_fr; + fin->fin_fr = NULL; + fin->fin_rule = 0; + fin->fin_group = 0; + off = ip->ip_off & IP_OFFMASK; + pass |= (fi->fi_fl << 24); + + if ((fi->fi_fl & FI_TCPUDP) && (fin->fin_dlen > 3) && !off) + portcmp = 1; + + for (rulen = 0; fr; fr = fr->fr_next, rulen++) { + if (skip) { + skip--; + continue; + } + /* + * In all checks below, a null (zero) value in the + * filter struture is taken to mean a wildcard. + * + * check that we are working for the right interface + */ +#ifdef _KERNEL +# if BSD >= 199306 + if (fin->fin_out != 0) { + if ((fr->fr_oifa && + fr->fr_oifa != ((mb_t *)m)->m_pkthdr.rcvif) || + (fr->fr_ifa && fr->fr_ifa != fin->fin_ifp)) + continue; + } else +# endif + if (fr->fr_ifa && fr->fr_ifa != fin->fin_ifp) + continue; +#else + if (opts & (OPT_VERBOSE|OPT_DEBUG)) + printf("\n"); + FR_VERBOSE(("%c", (pass & FR_PASS) ? 'p' : + (pass & FR_AUTH) ? 'a' : 'b')); + if (fr->fr_ifa && fr->fr_ifa != fin->fin_ifp) + continue; + FR_VERBOSE((":i")); +#endif + { + register u_32_t *ld, *lm, *lip; + register int i; + + lip = (u_32_t *)fi; + lm = (u_32_t *)&fr->fr_mip; + ld = (u_32_t *)&fr->fr_ip; + i = ((lip[0] & lm[0]) != ld[0]); + FR_IFDEBUG(i,continue,("0. %#08x & %#08x != %#08x\n", + lip[0], lm[0], ld[0])); + i |= ((lip[1] & lm[1]) != ld[1]) << 19; + i ^= (fr->fr_flags & FR_NOTSRCIP); + FR_IFDEBUG(i,continue,("1. %#08x & %#08x != %#08x\n", + lip[1], lm[1], ld[1])); + i |= ((lip[2] & lm[2]) != ld[2]) << 20; + i ^= (fr->fr_flags & FR_NOTDSTIP); + FR_IFDEBUG(i,continue,("2. %#08x & %#08x != %#08x\n", + lip[2], lm[2], ld[2])); + i |= ((lip[3] & lm[3]) != ld[3]); + FR_IFDEBUG(i,continue,("3. %#08x & %#08x != %#08x\n", + lip[3], lm[3], ld[3])); + i |= ((lip[4] & lm[4]) != ld[4]); + FR_IFDEBUG(i,continue,("4. %#08x & %#08x != %#08x\n", + lip[4], lm[4], ld[4])); + if (i) + continue; + } + + /* + * If a fragment, then only the first has what we're looking + * for here... + */ + if (!portcmp && (fr->fr_dcmp || fr->fr_scmp || fr->fr_tcpf || + fr->fr_tcpfm)) + continue; + if (fi->fi_fl & FI_TCPUDP) { + if (!fr_tcpudpchk(fr, fin)) + continue; + } else if (fr->fr_icmpm || fr->fr_icmp) { + if ((fi->fi_p != IPPROTO_ICMP) || off || + (fin->fin_dlen < 2)) + continue; + if ((fin->fin_data[0] & fr->fr_icmpm) != fr->fr_icmp) { + FR_DEBUG(("i. %#x & %#x != %#x\n", + fin->fin_data[0], fr->fr_icmpm, + fr->fr_icmp)); + continue; + } + } + FR_VERBOSE(("*")); + /* + * Just log this packet... + */ + passt = fr->fr_flags; + if ((passt & FR_CALLNOW) && fr->fr_func) + passt = (*fr->fr_func)(passt, ip, fin); + fin->fin_fr = fr; +#ifdef IPFILTER_LOG + if ((passt & FR_LOGMASK) == FR_LOG) { + if (!IPLLOG(passt, ip, fin, m)) { + ATOMIC_INC(frstats[fin->fin_out].fr_skip); + } + ATOMIC_INC(frstats[fin->fin_out].fr_pkl); + logged = 1; + } +#endif /* IPFILTER_LOG */ + if (!(skip = fr->fr_skip) && (passt & FR_LOGMASK) != FR_LOG) + pass = passt; + FR_DEBUG(("pass %#x\n", pass)); + ATOMIC_INC(fr->fr_hits); + if (pass & FR_ACCOUNT) + fr->fr_bytes += (U_QUAD_T)ip->ip_len; + else + fin->fin_icode = fr->fr_icode; + fin->fin_rule = rulen; + fin->fin_group = fr->fr_group; + if (fr->fr_grp) { + fin->fin_fr = fr->fr_grp; + pass = fr_scanlist(pass, ip, fin, m); + if (fin->fin_fr == NULL) { + fin->fin_rule = rulen; + fin->fin_group = fr->fr_group; + fin->fin_fr = fr; + } + if (pass & FR_DONTCACHE) + logged = 1; + } + if (pass & FR_QUICK) + break; + } + if (logged) + pass |= FR_DONTCACHE; + return pass; +} + + +/* + * frcheck - filter check + * check using source and destination addresses/ports in a packet whether + * or not to pass it on or not. + */ +int fr_check(ip, hlen, ifp, out +#if defined(_KERNEL) && SOLARIS +, qif, mp) +qif_t *qif; +#else +, mp) +#endif +mb_t **mp; +ip_t *ip; +int hlen; +void *ifp; +int out; +{ + /* + * The above really sucks, but short of writing a diff + */ + fr_info_t frinfo, *fc; + register fr_info_t *fin = &frinfo; + frentry_t *fr = NULL; + int changed, error = EHOSTUNREACH; + u_32_t pass, apass; +#if !SOLARIS || !defined(_KERNEL) + register mb_t *m = *mp; +#endif + +#ifdef _KERNEL + mb_t *mc = NULL; +# if !defined(__SVR4) && !defined(__svr4__) +# ifdef __sgi + char hbuf[(0xf << 2) + sizeof(struct icmp) + sizeof(ip_t) + 8]; +# endif + int up; + +# ifdef M_CANFASTFWD + /* + * XXX For now, IP Filter and fast-forwarding of cached flows + * XXX are mutually exclusive. Eventually, IP Filter should + * XXX get a "can-fast-forward" filter rule. + */ + m->m_flags &= ~M_CANFASTFWD; +# endif /* M_CANFASTFWD */ + + if ((ip->ip_p == IPPROTO_TCP || ip->ip_p == IPPROTO_UDP || + ip->ip_p == IPPROTO_ICMP)) { + int plen = 0; + + if ((ip->ip_off & IP_OFFMASK) == 0) + switch(ip->ip_p) + { + case IPPROTO_TCP: + plen = sizeof(tcphdr_t); + break; + case IPPROTO_UDP: + plen = sizeof(udphdr_t); + break; + /* 96 - enough for complete ICMP error IP header */ + case IPPROTO_ICMP: + plen = ICMPERR_MAXPKTLEN - sizeof(ip_t); + break; + } + up = MIN(hlen + plen, ip->ip_len); + + if (up > m->m_len) { +# ifdef __sgi + /* Under IRIX, avoid m_pullup as it makes ping <hostname> panic */ + if ((up > sizeof(hbuf)) || (m_length(m) < up)) { + ATOMIC_INC(frstats[out].fr_pull[1]); + return -1; + } + m_copydata(m, 0, up, hbuf); + ATOMIC_INC(frstats[out].fr_pull[0]); + ip = (ip_t *)hbuf; +# else /* __ sgi */ +# ifndef linux + if ((*mp = m_pullup(m, up)) == 0) { + ATOMIC_INC(frstats[out].fr_pull[1]); + return -1; + } else { + ATOMIC_INC(frstats[out].fr_pull[0]); + m = *mp; + ip = mtod(m, ip_t *); + } +# endif /* !linux */ +# endif /* __sgi */ + } else + up = 0; + } else + up = 0; +# endif /* !defined(__SVR4) && !defined(__svr4__) */ +# if SOLARIS + mb_t *m = qif->qf_m; + + if ((u_int)ip & 0x3) + return 2; + fin->fin_qfm = m; + fin->fin_qif = qif; +# endif +#endif /* _KERNEL */ + fr_makefrip(hlen, ip, fin); + fin->fin_ifp = ifp; + fin->fin_out = out; + fin->fin_mp = mp; + pass = fr_pass; + + READ_ENTER(&ipf_mutex); + + /* + * Check auth now. This, combined with the check below to see if apass + * is 0 is to ensure that we don't count the packet twice, which can + * otherwise occur when we reprocess it. As it is, we only count it + * after it has no auth. table matchup. This also stops NAT from + * occuring until after the packet has been auth'd. + */ + apass = fr_checkauth(ip, fin); + + if (!out) { + changed = ip_natin(ip, fin); + if (!apass && (fin->fin_fr = ipacct[0][fr_active]) && + (fr_scanlist(FR_NOMATCH, ip, fin, m) & FR_ACCOUNT)) { + ATOMIC_INC(frstats[0].fr_acct); + } + } + + if (apass || (!(fr = ipfr_knownfrag(ip, fin)) && + !(fr = fr_checkstate(ip, fin)))) { + /* + * If a packet is found in the auth table, then skip checking + * the access lists for permission but we do need to consider + * the result as if it were from the ACL's. + */ + if (!apass) { + fc = frcache + out; + if (!bcmp((char *)fin, (char *)fc, FI_CSIZE)) { + /* + * copy cached data so we can unlock the mutex + * earlier. + */ + bcopy((char *)fc, (char *)fin, FI_COPYSIZE); + ATOMIC_INC(frstats[out].fr_chit); + if ((fr = fin->fin_fr)) { + ATOMIC_INC(fr->fr_hits); + pass = fr->fr_flags; + } + } else { + if ((fin->fin_fr = ipfilter[out][fr_active])) + pass = fr_scanlist(fr_pass, ip, fin, m); + if (!(pass & (FR_KEEPSTATE|FR_DONTCACHE))) + bcopy((char *)fin, (char *)fc, + FI_COPYSIZE); + if (pass & FR_NOMATCH) { + ATOMIC_INC(frstats[out].fr_nom); + } + } + fr = fin->fin_fr; + } else + pass = apass; + + /* + * If we fail to add a packet to the authorization queue, + * then we drop the packet later. However, if it was added + * then pretend we've dropped it already. + */ + if ((pass & FR_AUTH)) + if (FR_NEWAUTH(m, fin, ip, qif) != 0) +#ifdef _KERNEL + m = *mp = NULL; +#else + ; +#endif + + if (pass & FR_PREAUTH) { + READ_ENTER(&ipf_auth); + if ((fin->fin_fr = ipauth) && + (pass = fr_scanlist(0, ip, fin, m))) { + ATOMIC_INC(fr_authstats.fas_hits); + } else { + ATOMIC_INC(fr_authstats.fas_miss); + } + RWLOCK_EXIT(&ipf_auth); + } + + fin->fin_fr = fr; + if ((pass & (FR_KEEPFRAG|FR_KEEPSTATE)) == FR_KEEPFRAG) { + if (fin->fin_fi.fi_fl & FI_FRAG) { + if (ipfr_newfrag(ip, fin, pass) == -1) { + ATOMIC_INC(frstats[out].fr_bnfr); + } else { + ATOMIC_INC(frstats[out].fr_nfr); + } + } else { + ATOMIC_INC(frstats[out].fr_cfr); + } + } + if (pass & FR_KEEPSTATE) { + if (fr_addstate(ip, fin, 0) == NULL) { + ATOMIC_INC(frstats[out].fr_bads); + } else { + ATOMIC_INC(frstats[out].fr_ads); + } + } + } else if (fr != NULL) { + pass = fr->fr_flags; + if (pass & FR_LOGFIRST) + pass &= ~(FR_LOGFIRST|FR_LOG); + } + + if (fr && fr->fr_func && !(pass & FR_CALLNOW)) + pass = (*fr->fr_func)(pass, ip, fin); + + /* + * Only count/translate packets which will be passed on, out the + * interface. + */ + if (out && (pass & FR_PASS)) { + if ((fin->fin_fr = ipacct[1][fr_active]) && + (fr_scanlist(FR_NOMATCH, ip, fin, m) & FR_ACCOUNT)) { + ATOMIC_INC(frstats[1].fr_acct); + } + fin->fin_fr = fr; + changed = ip_natout(ip, fin); + } else + fin->fin_fr = fr; + RWLOCK_EXIT(&ipf_mutex); + +#ifdef IPFILTER_LOG + if ((fr_flags & FF_LOGGING) || (pass & FR_LOGMASK)) { + if ((fr_flags & FF_LOGNOMATCH) && (pass & FR_NOMATCH)) { + pass |= FF_LOGNOMATCH; + ATOMIC_INC(frstats[out].fr_npkl); + goto logit; + } else if (((pass & FR_LOGMASK) == FR_LOGP) || + ((pass & FR_PASS) && (fr_flags & FF_LOGPASS))) { + if ((pass & FR_LOGMASK) != FR_LOGP) + pass |= FF_LOGPASS; + ATOMIC_INC(frstats[out].fr_ppkl); + goto logit; + } else if (((pass & FR_LOGMASK) == FR_LOGB) || + ((pass & FR_BLOCK) && (fr_flags & FF_LOGBLOCK))) { + if ((pass & FR_LOGMASK) != FR_LOGB) + pass |= FF_LOGBLOCK; + ATOMIC_INC(frstats[out].fr_bpkl); +logit: + if (!IPLLOG(pass, ip, fin, m)) { + ATOMIC_INC(frstats[out].fr_skip); + if ((pass & (FR_PASS|FR_LOGORBLOCK)) == + (FR_PASS|FR_LOGORBLOCK)) + pass ^= FR_PASS|FR_BLOCK; + } + } + } +#endif /* IPFILTER_LOG */ +#ifdef _KERNEL + /* + * Only allow FR_DUP to work if a rule matched - it makes no sense to + * set FR_DUP as a "default" as there are no instructions about where + * to send the packet. + */ + if (fr && (pass & FR_DUP)) +# if SOLARIS + mc = dupmsg(m); +# else +# ifndef linux + mc = m_copy(m, 0, M_COPYALL); +# else + ; +# endif +# endif +#endif + if (pass & FR_PASS) { + ATOMIC_INC(frstats[out].fr_pass); + } else if (pass & FR_BLOCK) { + ATOMIC_INC(frstats[out].fr_block); + /* + * Should we return an ICMP packet to indicate error + * status passing through the packet filter ? + * WARNING: ICMP error packets AND TCP RST packets should + * ONLY be sent in repsonse to incoming packets. Sending them + * in response to outbound packets can result in a panic on + * some operating systems. + */ + if (!out) { +#ifdef _KERNEL + if (pass & FR_RETICMP) { + struct in_addr dst; + + if ((pass & FR_RETMASK) == FR_FAKEICMP) + dst = ip->ip_dst; + else + dst.s_addr = 0; +# if SOLARIS + ICMP_ERROR(q, ip, ICMP_UNREACH, fin->fin_icode, + qif, dst); +# else + ICMP_ERROR(m, ip, ICMP_UNREACH, fin->fin_icode, + ifp, dst); +# endif + ATOMIC_INC(frstats[0].fr_ret); + } else if (((pass & FR_RETMASK) == FR_RETRST) && + !(fin->fin_fi.fi_fl & FI_SHORT)) { + if (SEND_RESET(ip, qif, ifp, fin) == 0) { + ATOMIC_INC(frstats[1].fr_ret); + } + } +#else + if ((pass & FR_RETMASK) == FR_RETICMP) { + verbose("- ICMP unreachable sent\n"); + ATOMIC_INC(frstats[0].fr_ret); + } else if ((pass & FR_RETMASK) == FR_FAKEICMP) { + verbose("- forged ICMP unreachable sent\n"); + ATOMIC_INC(frstats[0].fr_ret); + } else if (((pass & FR_RETMASK) == FR_RETRST) && + !(fin->fin_fi.fi_fl & FI_SHORT)) { + verbose("- TCP RST sent\n"); + ATOMIC_INC(frstats[1].fr_ret); + } +#endif + } else { + if (pass & FR_RETRST) + error = ECONNRESET; + } + } + + /* + * If we didn't drop off the bottom of the list of rules (and thus + * the 'current' rule fr is not NULL), then we may have some extra + * instructions about what to do with a packet. + * Once we're finished return to our caller, freeing the packet if + * we are dropping it (* BSD ONLY *). + */ +#if defined(_KERNEL) +# if !SOLARIS +# if !defined(linux) + if (fr) { + frdest_t *fdp = &fr->fr_tif; + + if (((pass & FR_FASTROUTE) && !out) || + (fdp->fd_ifp && fdp->fd_ifp != (struct ifnet *)-1)) { + if (ipfr_fastroute(m, fin, fdp) == 0) + m = *mp = NULL; + } + if (mc) + ipfr_fastroute(mc, fin, &fr->fr_dif); + } + if (!(pass & FR_PASS) && m) + m_freem(m); +# ifdef __sgi + else if (changed && up && m) + m_copyback(m, 0, up, hbuf); +# endif +# endif /* !linux */ +# else /* !SOLARIS */ + if (fr) { + frdest_t *fdp = &fr->fr_tif; + + if (((pass & FR_FASTROUTE) && !out) || + (fdp->fd_ifp && fdp->fd_ifp != (struct ifnet *)-1)) { + if (ipfr_fastroute(qif, ip, m, mp, fin, fdp) == 0) + m = *mp = NULL; + } + if (mc) + ipfr_fastroute(qif, ip, mc, mp, fin, &fr->fr_dif); + } +# endif /* !SOLARIS */ + return (pass & FR_PASS) ? 0 : error; +#else /* _KERNEL */ + if (pass & FR_NOMATCH) + return 1; + if (pass & FR_PASS) + return 0; + if (pass & FR_AUTH) + return -2; + return -1; +#endif /* _KERNEL */ +} + + +/* + * ipf_cksum + * addr should be 16bit aligned and len is in bytes. + * length is in bytes + */ +u_short ipf_cksum(addr, len) +register u_short *addr; +register int len; +{ + register u_32_t sum = 0; + + for (sum = 0; len > 1; len -= 2) + sum += *addr++; + + /* mop up an odd byte, if necessary */ + if (len == 1) + sum += *(u_char *)addr; + + /* + * add back carry outs from top 16 bits to low 16 bits + */ + sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */ + sum += (sum >> 16); /* add carry */ + return (u_short)(~sum); +} + + +/* + * NB: This function assumes we've pullup'd enough for all of the IP header + * and the TCP header. We also assume that data blocks aren't allocated in + * odd sizes. + */ +u_short fr_tcpsum(m, ip, tcp) +mb_t *m; +ip_t *ip; +tcphdr_t *tcp; +{ + u_short *sp, slen, ts; + u_int sum, sum2; + int hlen; + + /* + * Add up IP Header portion + */ + hlen = ip->ip_hl << 2; + slen = ip->ip_len - hlen; + sum = htons((u_short)ip->ip_p); + sum += htons(slen); + sp = (u_short *)&ip->ip_src; + sum += *sp++; /* ip_src */ + sum += *sp++; + sum += *sp++; /* ip_dst */ + sum += *sp++; + ts = tcp->th_sum; + tcp->th_sum = 0; +#ifdef KERNEL +# if SOLARIS + sum2 = ip_cksum(m, hlen, sum); /* hlen == offset */ + sum2 = (sum2 & 0xffff) + (sum2 >> 16); + sum2 = ~sum2 & 0xffff; +# else /* SOLARIS */ +# if defined(BSD) || defined(sun) +# if BSD >= 199306 + m->m_data += hlen; +# else + m->m_off += hlen; +# endif + m->m_len -= hlen; + sum2 = in_cksum(m, slen); + m->m_len += hlen; +# if BSD >= 199306 + m->m_data -= hlen; +# else + m->m_off -= hlen; +# endif + /* + * Both sum and sum2 are partial sums, so combine them together. + */ + sum = (sum & 0xffff) + (sum >> 16); + sum = ~sum & 0xffff; + sum2 += sum; + sum2 = (sum2 & 0xffff) + (sum2 >> 16); +# else /* defined(BSD) || defined(sun) */ +{ + union { + u_char c[2]; + u_short s; + } bytes; + u_short len = ip->ip_len; +# if defined(__sgi) + int add; +# endif + + /* + * Add up IP Header portion + */ + sp = (u_short *)&ip->ip_src; + len -= (ip->ip_hl << 2); + sum = ntohs(IPPROTO_TCP); + sum += htons(len); + sum += *sp++; /* ip_src */ + sum += *sp++; + sum += *sp++; /* ip_dst */ + sum += *sp++; + if (sp != (u_short *)tcp) + sp = (u_short *)tcp; + sum += *sp++; /* sport */ + sum += *sp++; /* dport */ + sum += *sp++; /* seq */ + sum += *sp++; + sum += *sp++; /* ack */ + sum += *sp++; + sum += *sp++; /* off */ + sum += *sp++; /* win */ + sum += *sp++; /* Skip over checksum */ + sum += *sp++; /* urp */ + +# ifdef __sgi + /* + * In case we had to copy the IP & TCP header out of mbufs, + * skip over the mbuf bits which are the header + */ + if ((caddr_t)ip != mtod(m, caddr_t)) { + hlen = (caddr_t)sp - (caddr_t)ip; + while (hlen) { + add = MIN(hlen, m->m_len); + sp = (u_short *)(mtod(m, caddr_t) + add); + hlen -= add; + if (add == m->m_len) { + m = m->m_next; + if (!hlen) { + if (!m) + break; + sp = mtod(m, u_short *); + } + PANIC((!m),("fr_tcpsum(1): not enough data")); + } + } + } +# endif + + if (!(len -= sizeof(*tcp))) + goto nodata; + while (len > 1) { + if (((caddr_t)sp - mtod(m, caddr_t)) >= m->m_len) { + m = m->m_next; + PANIC((!m),("fr_tcpsum(2): not enough data")); + sp = mtod(m, u_short *); + } + if (((caddr_t)(sp + 1) - mtod(m, caddr_t)) > m->m_len) { + bytes.c[0] = *(u_char *)sp; + m = m->m_next; + PANIC((!m),("fr_tcpsum(3): not enough data")); + sp = mtod(m, u_short *); + bytes.c[1] = *(u_char *)sp; + sum += bytes.s; + sp = (u_short *)((u_char *)sp + 1); + } + if ((u_long)sp & 1) { + bcopy((char *)sp++, (char *)&bytes.s, sizeof(bytes.s)); + sum += bytes.s; + } else + sum += *sp++; + len -= 2; + } + if (len) + sum += ntohs(*(u_char *)sp << 8); +nodata: + while (sum > 0xffff) + sum = (sum & 0xffff) + (sum >> 16); + sum2 = (u_short)(~sum & 0xffff); +} +# endif /* defined(BSD) || defined(sun) */ +# endif /* SOLARIS */ +#else /* KERNEL */ + sum2 = 0; +#endif /* KERNEL */ + tcp->th_sum = ts; + return sum2; +} + + +#if defined(_KERNEL) && ( ((BSD < 199306) && !SOLARIS) || defined(__sgi) ) +/* + * Copyright (c) 1982, 1986, 1988, 1991, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94 + * $Id: fil.c,v 2.3.2.7 1999/10/21 14:21:40 darrenr Exp $ + */ +/* + * Copy data from an mbuf chain starting "off" bytes from the beginning, + * continuing for "len" bytes, into the indicated buffer. + */ +void +m_copydata(m, off, len, cp) + register mb_t *m; + register int off; + register int len; + caddr_t cp; +{ + register unsigned count; + + if (off < 0 || len < 0) + panic("m_copydata"); + while (off > 0) { + if (m == 0) + panic("m_copydata"); + if (off < m->m_len) + break; + off -= m->m_len; + m = m->m_next; + } + while (len > 0) { + if (m == 0) + panic("m_copydata"); + count = MIN(m->m_len - off, len); + bcopy(mtod(m, caddr_t) + off, cp, count); + len -= count; + cp += count; + off = 0; + m = m->m_next; + } +} + + +# ifndef linux +/* + * Copy data from a buffer back into the indicated mbuf chain, + * starting "off" bytes from the beginning, extending the mbuf + * chain if necessary. + */ +void +m_copyback(m0, off, len, cp) + struct mbuf *m0; + register int off; + register int len; + caddr_t cp; +{ + register int mlen; + register struct mbuf *m = m0, *n; + int totlen = 0; + + if (m0 == 0) + return; + while (off > (mlen = m->m_len)) { + off -= mlen; + totlen += mlen; + if (m->m_next == 0) { + n = m_getclr(M_DONTWAIT, m->m_type); + if (n == 0) + goto out; + n->m_len = min(MLEN, len + off); + m->m_next = n; + } + m = m->m_next; + } + while (len > 0) { + mlen = min (m->m_len - off, len); + bcopy(cp, off + mtod(m, caddr_t), (unsigned)mlen); + cp += mlen; + len -= mlen; + mlen += off; + off = 0; + totlen += mlen; + if (len == 0) + break; + if (m->m_next == 0) { + n = m_get(M_DONTWAIT, m->m_type); + if (n == 0) + break; + n->m_len = min(MLEN, len); + m->m_next = n; + } + m = m->m_next; + } +out: +#if 0 + if (((m = m0)->m_flags & M_PKTHDR) && (m->m_pkthdr.len < totlen)) + m->m_pkthdr.len = totlen; +#endif + return; +} +# endif /* linux */ +#endif /* (_KERNEL) && ( ((BSD < 199306) && !SOLARIS) || __sgi) */ + + +frgroup_t *fr_findgroup(num, flags, which, set, fgpp) +u_int num; +u_32_t flags; +minor_t which; +int set; +frgroup_t ***fgpp; +{ + frgroup_t *fg, **fgp; + + if (which == IPL_LOGAUTH) + fgp = &ipfgroups[2][set]; + else if (flags & FR_ACCOUNT) + fgp = &ipfgroups[1][set]; + else if (flags & (FR_OUTQUE|FR_INQUE)) + fgp = &ipfgroups[0][set]; + else + return NULL; + num &= 0xffff; + + while ((fg = *fgp)) + if (fg->fg_num == num) + break; + else + fgp = &fg->fg_next; + if (fgpp) + *fgpp = fgp; + return fg; +} + + +frgroup_t *fr_addgroup(num, fp, which, set) +u_int num; +frentry_t *fp; +minor_t which; +int set; +{ + frgroup_t *fg, **fgp; + + if ((fg = fr_findgroup(num, fp->fr_flags, which, set, &fgp))) + return fg; + + KMALLOC(fg, frgroup_t *); + if (fg) { + fg->fg_num = num & 0xffff; + fg->fg_next = *fgp; + fg->fg_head = fp; + fg->fg_start = &fp->fr_grp; + *fgp = fg; + } + return fg; +} + + +void fr_delgroup(num, flags, which, set) +u_int num; +u_32_t flags; +minor_t which; +int set; +{ + frgroup_t *fg, **fgp; + + if (!(fg = fr_findgroup(num, flags, which, set, &fgp))) + return; + + *fgp = fg->fg_next; + KFREE(fg); +} + + + +/* + * recursively flush rules from the list, descending groups as they are + * encountered. if a rule is the head of a group and it has lost all its + * group members, then also delete the group reference. + */ +static int frflushlist(set, unit, nfreedp, listp) +int set; +minor_t unit; +int *nfreedp; +frentry_t **listp; +{ + register int freed = 0, i; + register frentry_t *fp; + + while ((fp = *listp)) { + *listp = fp->fr_next; + if (fp->fr_grp) { + i = frflushlist(set, unit, nfreedp, &fp->fr_grp); + MUTEX_ENTER(&ipf_rw); + fp->fr_ref -= i; + MUTEX_EXIT(&ipf_rw); + } + + ATOMIC_DEC(fp->fr_ref); + if (fp->fr_ref == 0) { + if (fp->fr_grhead) + fr_delgroup((u_int)fp->fr_grhead, fp->fr_flags, + unit, set); + KFREE(fp); + } else + fp->fr_next = NULL; + freed++; + } + *nfreedp += freed; + return freed; +} + + +int frflush(unit, flags) +minor_t unit; +int flags; +{ + int flushed = 0, set; + + if (unit != IPL_LOGIPF) + return 0; + WRITE_ENTER(&ipf_mutex); + bzero((char *)frcache, sizeof(frcache[0]) * 2); + + set = fr_active; + if (flags & FR_INACTIVE) + set = 1 - set; + + if (flags & FR_OUTQUE) { + (void) frflushlist(set, unit, &flushed, &ipfilter[1][set]); + (void) frflushlist(set, unit, &flushed, &ipacct[1][set]); + } + if (flags & FR_INQUE) { + (void) frflushlist(set, unit, &flushed, &ipfilter[0][set]); + (void) frflushlist(set, unit, &flushed, &ipacct[0][set]); + } + RWLOCK_EXIT(&ipf_mutex); + return flushed; +} + + +char *memstr(src, dst, slen, dlen) +char *src, *dst; +int slen, dlen; +{ + char *s = NULL; + + while (dlen >= slen) { + if (bcmp(src, dst, slen) == 0) { + s = dst; + break; + } + dst++; + dlen--; + } + return s; +} + + +void fixskip(listp, rp, addremove) +frentry_t **listp, *rp; +int addremove; +{ + frentry_t *fp; + int rules = 0, rn = 0; + + for (fp = *listp; fp && (fp != rp); fp = fp->fr_next, rules++) + ; + + if (!fp) + return; + + for (fp = *listp; fp && (fp != rp); fp = fp->fr_next, rn++) + if (fp->fr_skip && (rn + fp->fr_skip >= rules)) + fp->fr_skip += addremove; +} + + +#ifdef _KERNEL +/* + * count consecutive 1's in bit mask. If the mask generated by counting + * consecutive 1's is different to that passed, return -1, else return # + * of bits. + */ +int countbits(ip) +u_32_t ip; +{ + u_32_t ipn; + int cnt = 0, i, j; + + ip = ipn = ntohl(ip); + for (i = 32; i; i--, ipn *= 2) + if (ipn & 0x80000000) + cnt++; + else + break; + ipn = 0; + for (i = 32, j = cnt; i; i--, j--) { + ipn *= 2; + if (j > 0) + ipn++; + } + if (ipn == ip) + return cnt; + return -1; +} + + +/* + * return the first IP Address associated with an interface + */ +int fr_ifpaddr(ifptr, inp) +void *ifptr; +struct in_addr *inp; +{ +# if SOLARIS + ill_t *ill = ifptr; +# else + struct ifnet *ifp = ifptr; +# endif + struct in_addr in; + +# if SOLARIS + in.s_addr = ill->ill_ipif->ipif_local_addr; +# else /* SOLARIS */ +# if linux + ; +# else /* linux */ + struct ifaddr *ifa; + struct sockaddr_in *sin; + +# if (__FreeBSD_version >= 300000) + ifa = TAILQ_FIRST(&ifp->if_addrhead); +# else +# if defined(__NetBSD__) || defined(__OpenBSD__) + ifa = ifp->if_addrlist.tqh_first; +# else +# if defined(__sgi) && defined(IFF_DRVRLOCK) /* IRIX 6 */ + ifa = &((struct in_ifaddr *)ifp->in_ifaddr)->ia_ifa; +# else + ifa = ifp->if_addrlist; +# endif +# endif /* __NetBSD__ || __OpenBSD__ */ +# endif /* __FreeBSD_version >= 300000 */ +# if (BSD < 199306) && !(/*IRIX6*/defined(__sgi) && defined(IFF_DRVRLOCK)) + sin = (struct sockaddr_in *)&ifa->ifa_addr; +# else + sin = (struct sockaddr_in *)ifa->ifa_addr; + while (sin && ifa && + sin->sin_family != AF_INET) { +# if (__FreeBSD_version >= 300000) + ifa = TAILQ_NEXT(ifa, ifa_link); +# else +# if defined(__NetBSD__) || defined(__OpenBSD__) + ifa = ifa->ifa_list.tqe_next; +# else + ifa = ifa->ifa_next; +# endif +# endif /* __FreeBSD_version >= 300000 */ + if (ifa) + sin = (struct sockaddr_in *)ifa->ifa_addr; + } + if (ifa == NULL) + sin = NULL; + if (sin == NULL) + return -1; +# endif /* (BSD < 199306) && (!__sgi && IFF_DRVLOCK) */ + in = sin->sin_addr; +# endif /* linux */ +# endif /* SOLARIS */ + in.s_addr = ntohl(in.s_addr); + *inp = in; + return 0; +} +#else + + +/* + * return the first IP Address associated with an interface + */ +int fr_ifpaddr(ifptr, inp) +void *ifptr; +struct in_addr *inp; +{ + return 0; +} +#endif diff --git a/sys/contrib/ipfilter/netinet/ip_auth.c b/sys/contrib/ipfilter/netinet/ip_auth.c new file mode 100644 index 0000000..f0fd500 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_auth.c @@ -0,0 +1,538 @@ +/* + * Copyright (C) 1998 by Darren Reed & Guido van Rooij. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + */ +#if !defined(lint) +/*static const char rcsid[] = "@(#)$Id: ip_auth.c,v 2.1.2.1 1999/09/28 11:44:04 darrenr Exp $";*/ +static const char rcsid[] = "@(#)$FreeBSD$"; +#endif + +#include <sys/errno.h> +#include <sys/types.h> +#include <sys/param.h> +#include <sys/time.h> +#include <sys/file.h> +#if !defined(_KERNEL) && !defined(KERNEL) +# include <stdio.h> +# include <stdlib.h> +# include <string.h> +#endif +#if defined(KERNEL) && (__FreeBSD_version >= 220000) +# include <sys/filio.h> +# include <sys/fcntl.h> +#else +# include <sys/ioctl.h> +#endif +#include <sys/uio.h> +#ifndef linux +# include <sys/protosw.h> +#endif +#include <sys/socket.h> +#if (defined(_KERNEL) || defined(KERNEL)) && !defined(linux) +# include <sys/systm.h> +#endif +#if !defined(__SVR4) && !defined(__svr4__) +# ifndef linux +# include <sys/mbuf.h> +# endif +#else +# include <sys/filio.h> +# include <sys/byteorder.h> +# ifdef _KERNEL +# include <sys/dditypes.h> +# endif +# include <sys/stream.h> +# include <sys/kmem.h> +#endif +#if _BSDI_VERSION >= 199802 +# include <sys/queue.h> +#endif +#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(bsdi) +# include <machine/cpu.h> +#endif +#include <net/if.h> +#ifdef sun +# include <net/af.h> +#endif +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#ifndef KERNEL +# define KERNEL +# define NOT_KERNEL +#endif +#ifndef linux +# include <netinet/ip_var.h> +#endif +#ifdef NOT_KERNEL +# undef KERNEL +#endif +#ifdef __sgi +# ifdef IFF_DRVRLOCK /* IRIX6 */ +# include <sys/hashing.h> +# endif +#endif +#include <netinet/tcp.h> +#if defined(__sgi) && !defined(IFF_DRVRLOCK) /* IRIX < 6 */ +extern struct ifqueue ipintrq; /* ip packet input queue */ +#else +# ifndef linux +# if __FreeBSD_version >= 300000 +# include <net/if_var.h> +# endif +# include <netinet/in_var.h> +# include <netinet/tcp_fsm.h> +# endif +#endif +#include <netinet/udp.h> +#include <netinet/ip_icmp.h> +#include "netinet/ip_compat.h" +#include <netinet/tcpip.h> +#include "netinet/ip_fil.h" +#include "netinet/ip_auth.h" +#if !SOLARIS && !defined(linux) +# include <net/netisr.h> +# ifdef __FreeBSD__ +# include <machine/cpufunc.h> +# endif +#endif +#if (__FreeBSD_version >= 300000) +# include <sys/malloc.h> +# if (defined(_KERNEL) || defined(KERNEL)) && !defined(IPFILTER_LKM) +# include <sys/libkern.h> +# include <sys/systm.h> +# endif +#endif + + + +#if (SOLARIS || defined(__sgi)) && defined(_KERNEL) +extern KRWLOCK_T ipf_auth; +extern kmutex_t ipf_authmx; +# if SOLARIS +extern kcondvar_t ipfauthwait; +# endif +#endif +#ifdef linux +static struct wait_queue *ipfauthwait = NULL; +#endif + +int fr_authsize = FR_NUMAUTH; +int fr_authused = 0; +int fr_defaultauthage = 600; +fr_authstat_t fr_authstats; +static frauth_t fr_auth[FR_NUMAUTH]; +mb_t *fr_authpkts[FR_NUMAUTH]; +static int fr_authstart = 0, fr_authend = 0, fr_authnext = 0; +static frauthent_t *fae_list = NULL; +frentry_t *ipauth = NULL; + + +/* + * Check if a packet has authorization. If the packet is found to match an + * authorization result and that would result in a feedback loop (i.e. it + * will end up returning FR_AUTH) then return FR_BLOCK instead. + */ +u_32_t fr_checkauth(ip, fin) +ip_t *ip; +fr_info_t *fin; +{ + u_short id = ip->ip_id; + u_32_t pass; + int i; + + READ_ENTER(&ipf_auth); + for (i = fr_authstart; i != fr_authend; ) { + /* + * index becomes -2 only after an SIOCAUTHW. Check this in + * case the same packet gets sent again and it hasn't yet been + * auth'd. + */ + if ((fr_auth[i].fra_index == -2) && + (id == fr_auth[i].fra_info.fin_id) && + !bcmp((char *)fin,(char *)&fr_auth[i].fra_info,FI_CSIZE)) { + /* + * Avoid feedback loop. + */ + if (!(pass = fr_auth[i].fra_pass) || (pass & FR_AUTH)) + pass = FR_BLOCK; + RWLOCK_EXIT(&ipf_auth); + WRITE_ENTER(&ipf_auth); + fr_authstats.fas_hits++; + fr_auth[i].fra_index = -1; + fr_authused--; + if (i == fr_authstart) { + while (fr_auth[i].fra_index == -1) { + i++; + if (i == FR_NUMAUTH) + i = 0; + fr_authstart = i; + if (i == fr_authend) + break; + } + if (fr_authstart == fr_authend) { + fr_authnext = 0; + fr_authstart = fr_authend = 0; + } + } + RWLOCK_EXIT(&ipf_auth); + return pass; + } + i++; + if (i == FR_NUMAUTH) + i = 0; + } + fr_authstats.fas_miss++; + RWLOCK_EXIT(&ipf_auth); + return 0; +} + + +/* + * Check if we have room in the auth array to hold details for another packet. + * If we do, store it and wake up any user programs which are waiting to + * hear about these events. + */ +int fr_newauth(m, fin, ip +#if defined(_KERNEL) && SOLARIS +, qif) +qif_t *qif; +#else +) +#endif +mb_t *m; +fr_info_t *fin; +ip_t *ip; +{ + int i; + + WRITE_ENTER(&ipf_auth); + if (fr_authstart > fr_authend) { + fr_authstats.fas_nospace++; + RWLOCK_EXIT(&ipf_auth); + return 0; + } else { + if ((fr_authstart == 0) && (fr_authend == FR_NUMAUTH - 1)) { + fr_authstats.fas_nospace++; + RWLOCK_EXIT(&ipf_auth); + return 0; + } + } + + fr_authstats.fas_added++; + fr_authused++; + i = fr_authend++; + if (fr_authend == FR_NUMAUTH) + fr_authend = 0; + RWLOCK_EXIT(&ipf_auth); + fr_auth[i].fra_index = i; + fr_auth[i].fra_pass = 0; + fr_auth[i].fra_age = fr_defaultauthage; + bcopy((char *)fin, (char *)&fr_auth[i].fra_info, sizeof(*fin)); +#if !defined(sparc) && !defined(m68k) + /* + * No need to copyback here as we want to undo the changes, not keep + * them. + */ +# if SOLARIS && defined(_KERNEL) + if (ip == (ip_t *)m->b_rptr) +# endif + { + register u_short bo; + + bo = ip->ip_len; + ip->ip_len = htons(bo); +# if !SOLARIS /* 4.4BSD converts this ip_input.c, but I don't in solaris.c */ + bo = ip->ip_id; + ip->ip_id = htons(bo); +# endif + bo = ip->ip_off; + ip->ip_off = htons(bo); + } +#endif +#if SOLARIS && defined(_KERNEL) + m->b_rptr -= qif->qf_off; + fr_authpkts[i] = *(mblk_t **)fin->fin_mp; + fr_auth[i].fra_q = qif->qf_q; + cv_signal(&ipfauthwait); +#else + fr_authpkts[i] = m; +# if defined(linux) && defined(_KERNEL) + wake_up_interruptible(&ipfauthwait); +# else + WAKEUP(&fr_authnext); +# endif +#endif + return 1; +} + + +int fr_auth_ioctl(data, cmd, fr, frptr) +caddr_t data; +#if defined(__NetBSD__) || defined(__OpenBSD__) || (FreeBSD_version >= 300003) +u_long cmd; +#else +int cmd; +#endif +frentry_t *fr, **frptr; +{ + mb_t *m; +#if defined(_KERNEL) +# if !SOLARIS + struct ifqueue *ifq; + int s; +# endif +#endif + frauth_t auth, *au = &auth; + frauthent_t *fae, **faep; + int i, error = 0; + + switch (cmd) + { + case SIOCINIFR : + case SIOCRMIFR : + case SIOCADIFR : + error = EINVAL; + break; + case SIOCINAFR : + case SIOCRMAFR : + case SIOCADAFR : + for (faep = &fae_list; (fae = *faep); ) + if (&fae->fae_fr == fr) + break; + else + faep = &fae->fae_next; + if (cmd == SIOCRMAFR) { + if (!fae) + error = ESRCH; + else { + WRITE_ENTER(&ipf_auth); + *faep = fae->fae_next; + *frptr = fr->fr_next; + RWLOCK_EXIT(&ipf_auth); + KFREE(fae); + } + } else { + KMALLOC(fae, frauthent_t *); + if (fae != NULL) { + IRCOPY((char *)data, (char *)&fae->fae_fr, + sizeof(fae->fae_fr)); + WRITE_ENTER(&ipf_auth); + fae->fae_age = fr_defaultauthage; + fae->fae_fr.fr_hits = 0; + fae->fae_fr.fr_next = *frptr; + *frptr = &fae->fae_fr; + fae->fae_next = *faep; + *faep = fae; + ipauth = &fae_list->fae_fr; + RWLOCK_EXIT(&ipf_auth); + } else + error = ENOMEM; + } + break; + case SIOCATHST: + READ_ENTER(&ipf_auth); + fr_authstats.fas_faelist = fae_list; + RWLOCK_EXIT(&ipf_auth); + IWCOPY((char *)&fr_authstats, data, sizeof(fr_authstats)); + break; + case SIOCAUTHW: +fr_authioctlloop: + READ_ENTER(&ipf_auth); + if ((fr_authnext != fr_authend) && fr_authpkts[fr_authnext]) { + IWCOPY((char *)&fr_auth[fr_authnext], data, + sizeof(fr_info_t)); + RWLOCK_EXIT(&ipf_auth); + WRITE_ENTER(&ipf_auth); + fr_authnext++; + if (fr_authnext == FR_NUMAUTH) + fr_authnext = 0; + RWLOCK_EXIT(&ipf_auth); + return 0; + } +#ifdef _KERNEL +# if SOLARIS + mutex_enter(&ipf_authmx); + if (!cv_wait_sig(&ipfauthwait, &ipf_authmx)) { + mutex_exit(&ipf_authmx); + return EINTR; + } + mutex_exit(&ipf_authmx); +# else +# ifdef linux + interruptible_sleep_on(&ipfauthwait); + if (current->signal & ~current->blocked) + error = -EINTR; +# else + error = SLEEP(&fr_authnext, "fr_authnext"); +# endif +# endif +#endif + RWLOCK_EXIT(&ipf_auth); + if (!error) + goto fr_authioctlloop; + break; + case SIOCAUTHR: + IRCOPY(data, (caddr_t)&auth, sizeof(auth)); + WRITE_ENTER(&ipf_auth); + i = au->fra_index; + if ((i < 0) || (i > FR_NUMAUTH) || + (fr_auth[i].fra_info.fin_id != au->fra_info.fin_id)) { + RWLOCK_EXIT(&ipf_auth); + return EINVAL; + } + m = fr_authpkts[i]; + fr_auth[i].fra_index = -2; + fr_auth[i].fra_pass = au->fra_pass; + fr_authpkts[i] = NULL; +#ifdef _KERNEL + RWLOCK_EXIT(&ipf_auth); + SPL_NET(s); +# ifndef linux + if (m && au->fra_info.fin_out) { +# if SOLARIS + error = fr_qout(fr_auth[i].fra_q, m); +# else /* SOLARIS */ +# if _BSDI_VERSION >= 199802 + error = ip_output(m, NULL, NULL, IP_FORWARDING, NULL, + NULL); +# else + error = ip_output(m, NULL, NULL, IP_FORWARDING, NULL); +# endif +# endif /* SOLARIS */ + if (error) + fr_authstats.fas_sendfail++; + else + fr_authstats.fas_sendok++; + } else if (m) { +# if SOLARIS + error = fr_qin(fr_auth[i].fra_q, m); +# else /* SOLARIS */ + ifq = &ipintrq; + if (IF_QFULL(ifq)) { + IF_DROP(ifq); + m_freem(m); + error = ENOBUFS; + } else { + IF_ENQUEUE(ifq, m); + schednetisr(NETISR_IP); + } +# endif /* SOLARIS */ + if (error) + fr_authstats.fas_quefail++; + else + fr_authstats.fas_queok++; + } else + error = EINVAL; +# endif +# if SOLARIS + if (error) + error = EINVAL; +# else + /* + * If we experience an error which will result in the packet + * not being processed, make sure we advance to the next one. + */ + if (error == ENOBUFS) { + fr_authused--; + fr_auth[i].fra_index = -1; + fr_auth[i].fra_pass = 0; + if (i == fr_authstart) { + while (fr_auth[i].fra_index == -1) { + i++; + if (i == FR_NUMAUTH) + i = 0; + fr_authstart = i; + if (i == fr_authend) + break; + } + if (fr_authstart == fr_authend) { + fr_authnext = 0; + fr_authstart = fr_authend = 0; + } + } + } +# endif + SPL_X(s); +#endif /* _KERNEL */ + break; + default : + error = EINVAL; + break; + } + return error; +} + + +#ifdef _KERNEL +/* + * Free all network buffer memory used to keep saved packets. + */ +void fr_authunload() +{ + register int i; + register frauthent_t *fae, **faep; + mb_t *m; + + WRITE_ENTER(&ipf_auth); + for (i = 0; i < FR_NUMAUTH; i++) { + if ((m = fr_authpkts[i])) { + FREE_MB_T(m); + fr_authpkts[i] = NULL; + fr_auth[i].fra_index = -1; + } + } + + + for (faep = &fae_list; (fae = *faep); ) { + *faep = fae->fae_next; + KFREE(fae); + } + ipauth = NULL; + RWLOCK_EXIT(&ipf_auth); +} + + +/* + * Slowly expire held auth records. Timeouts are set + * in expectation of this being called twice per second. + */ +void fr_authexpire() +{ + register int i; + register frauth_t *fra; + register frauthent_t *fae, **faep; + mb_t *m; +#if !SOLARIS + int s; +#endif + + SPL_NET(s); + WRITE_ENTER(&ipf_auth); + for (i = 0, fra = fr_auth; i < FR_NUMAUTH; i++, fra++) { + if ((!--fra->fra_age) && (m = fr_authpkts[i])) { + FREE_MB_T(m); + fr_authpkts[i] = NULL; + fr_auth[i].fra_index = -1; + fr_authstats.fas_expire++; + fr_authused--; + } + } + + for (faep = &fae_list; (fae = *faep); ) { + if (!--fae->fae_age) { + *faep = fae->fae_next; + KFREE(fae); + fr_authstats.fas_expire++; + } else + faep = &fae->fae_next; + } + ipauth = &fae_list->fae_fr; + RWLOCK_EXIT(&ipf_auth); + SPL_X(s); +} +#endif diff --git a/sys/contrib/ipfilter/netinet/ip_auth.h b/sys/contrib/ipfilter/netinet/ip_auth.h new file mode 100644 index 0000000..a7c640b --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_auth.h @@ -0,0 +1,68 @@ +/* + * Copyright (C) 1997-1998 by Darren Reed & Guido Van Rooij. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + * + * $Id: ip_auth.h,v 2.1 1999/08/04 17:29:54 darrenr Exp $ + * + * $FreeBSD$ + */ +#ifndef __IP_AUTH_H__ +#define __IP_AUTH_H__ + +#define FR_NUMAUTH 32 + +typedef struct frauth { + int fra_age; + int fra_index; + u_32_t fra_pass; + fr_info_t fra_info; +#if SOLARIS + queue_t *fra_q; +#endif +} frauth_t; + +typedef struct frauthent { + struct frentry fae_fr; + struct frauthent *fae_next; + u_long fae_age; +} frauthent_t; + +typedef struct fr_authstat { + U_QUAD_T fas_hits; + U_QUAD_T fas_miss; + u_long fas_nospace; + u_long fas_added; + u_long fas_sendfail; + u_long fas_sendok; + u_long fas_queok; + u_long fas_quefail; + u_long fas_expire; + frauthent_t *fas_faelist; +} fr_authstat_t; + + +extern frentry_t *ipauth; +extern struct fr_authstat fr_authstats; +extern int fr_defaultauthage; +extern int fr_authstart; +extern int fr_authend; +extern int fr_authsize; +extern int fr_authused; +extern u_32_t fr_checkauth __P((ip_t *, fr_info_t *)); +extern void fr_authexpire __P((void)); +extern void fr_authunload __P((void)); +extern mb_t *fr_authpkts[]; +#if defined(_KERNEL) && SOLARIS +extern int fr_newauth __P((mb_t *, fr_info_t *, ip_t *, qif_t *)); +#else +extern int fr_newauth __P((mb_t *, fr_info_t *, ip_t *)); +#endif +#if defined(__NetBSD__) || defined(__OpenBSD__) +extern int fr_auth_ioctl __P((caddr_t, u_long, frentry_t *, frentry_t **)); +#else +extern int fr_auth_ioctl __P((caddr_t, int, frentry_t *, frentry_t **)); +#endif +#endif /* __IP_AUTH_H__ */ diff --git a/sys/contrib/ipfilter/netinet/ip_compat.h b/sys/contrib/ipfilter/netinet/ip_compat.h new file mode 100644 index 0000000..7982a5d --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_compat.h @@ -0,0 +1,835 @@ +/* + * Copyright (C) 1993-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + * + * @(#)ip_compat.h 1.8 1/14/96 + * $Id: ip_compat.h,v 2.1.2.1 1999/09/18 15:03:51 darrenr Exp $ + * $FreeBSD$ + */ + +#ifndef __IP_COMPAT_H__ +#define __IP_COMPAT_H__ + +#ifndef __P +# ifdef __STDC__ +# define __P(x) x +# else +# define __P(x) () +# endif +#endif +#ifndef __STDC__ +# undef const +# define const +#endif + +#ifndef SOLARIS +#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4))) +#endif + +#if defined(_KERNEL) || defined(KERNEL) || defined(__KERNEL__) +# undef KERNEL +# undef _KERNEL +# undef __KERNEL__ +# define KERNEL +# define _KERNEL +# define __KERNEL__ +#endif + +#if defined(__SVR4) || defined(__svr4__) || defined(__sgi) +#define index strchr +# if !defined(KERNEL) +# define bzero(a,b) memset(a,0,b) +# define bcmp memcmp +# define bcopy(a,b,c) memmove(b,a,c) +# endif +#endif + +#ifndef offsetof +#define offsetof(t,m) (int)((&((t *)0L)->m)) +#endif + +#if defined(__sgi) || defined(bsdi) +struct ether_addr { + u_char ether_addr_octet[6]; +}; +#endif + +#if defined(__sgi) && !defined(IPFILTER_LKM) +# ifdef __STDC__ +# define IPL_EXTERN(ep) ipfilter##ep +# else +# define IPL_EXTERN(ep) ipfilter/**/ep +# endif +#else +# ifdef __STDC__ +# define IPL_EXTERN(ep) ipl##ep +# else +# define IPL_EXTERN(ep) ipl/**/ep +# endif +#endif + +#ifdef linux +# include <sys/sysmacros.h> +#endif +#if SOLARIS +# define MTYPE(m) ((m)->b_datap->db_type) +# include <sys/isa_defs.h> +# include <sys/ioccom.h> +# include <sys/sysmacros.h> +# include <sys/kmem.h> +/* + * because Solaris 2 defines these in two places :-/ + */ +# undef IPOPT_EOL +# undef IPOPT_NOP +# undef IPOPT_LSRR +# undef IPOPT_RR +# undef IPOPT_SSRR +# ifndef KERNEL +# define _KERNEL +# undef RES_INIT +# include <inet/common.h> +# include <inet/ip.h> +# include <inet/ip_ire.h> +# undef _KERNEL +# else /* _KERNEL */ +# include <inet/common.h> +# include <inet/ip.h> +# include <inet/ip_ire.h> +# endif /* _KERNEL */ +#else +# if !defined(__sgi) +typedef int minor_t; +#endif +#endif /* SOLARIS */ +#define IPMINLEN(i, h) ((i)->ip_len >= ((i)->ip_hl * 4 + sizeof(struct h))) + +#ifndef IP_OFFMASK +#define IP_OFFMASK 0x1fff +#endif + +#if BSD > 199306 +# define USE_QUAD_T +# define U_QUAD_T u_quad_t +# define QUAD_T quad_t +#else /* BSD > 199306 */ +# define U_QUAD_T u_long +# define QUAD_T long +#endif /* BSD > 199306 */ + +/* + * These operating systems already take care of the problem for us. + */ +#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || \ + defined(__sgi) +typedef u_int32_t u_32_t; +#else +/* + * Really, any arch where sizeof(long) != sizeof(int). + */ +# if defined(__alpha__) || defined(__alpha) || defined(_LP64) +typedef unsigned int u_32_t; +# else +typedef unsigned long u_32_t; +# endif +#endif /* __NetBSD__ || __OpenBSD__ || __FreeBSD__ || __sgi */ + +#ifndef MAX +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) +#endif + +/* + * Security Options for Intenet Protocol (IPSO) as defined in RFC 1108. + * + * Basic Option + * + * 00000001 - (Reserved 4) + * 00111101 - Top Secret + * 01011010 - Secret + * 10010110 - Confidential + * 01100110 - (Reserved 3) + * 11001100 - (Reserved 2) + * 10101011 - Unclassified + * 11110001 - (Reserved 1) + */ +#define IPSO_CLASS_RES4 0x01 +#define IPSO_CLASS_TOPS 0x3d +#define IPSO_CLASS_SECR 0x5a +#define IPSO_CLASS_CONF 0x96 +#define IPSO_CLASS_RES3 0x66 +#define IPSO_CLASS_RES2 0xcc +#define IPSO_CLASS_UNCL 0xab +#define IPSO_CLASS_RES1 0xf1 + +#define IPSO_AUTH_GENSER 0x80 +#define IPSO_AUTH_ESI 0x40 +#define IPSO_AUTH_SCI 0x20 +#define IPSO_AUTH_NSA 0x10 +#define IPSO_AUTH_DOE 0x08 +#define IPSO_AUTH_UN 0x06 +#define IPSO_AUTH_FTE 0x01 + +/* + * IP option #defines + */ +/*#define IPOPT_RR 7 */ +#define IPOPT_ZSU 10 /* ZSU */ +#define IPOPT_MTUP 11 /* MTUP */ +#define IPOPT_MTUR 12 /* MTUR */ +#define IPOPT_ENCODE 15 /* ENCODE */ +/*#define IPOPT_TS 68 */ +#define IPOPT_TR 82 /* TR */ +/*#define IPOPT_SECURITY 130 */ +/*#define IPOPT_LSRR 131 */ +#define IPOPT_E_SEC 133 /* E-SEC */ +#define IPOPT_CIPSO 134 /* CIPSO */ +/*#define IPOPT_SATID 136 */ +#ifndef IPOPT_SID +# define IPOPT_SID IPOPT_SATID +#endif +/*#define IPOPT_SSRR 137 */ +#define IPOPT_ADDEXT 147 /* ADDEXT */ +#define IPOPT_VISA 142 /* VISA */ +#define IPOPT_IMITD 144 /* IMITD */ +#define IPOPT_EIP 145 /* EIP */ +#define IPOPT_FINN 205 /* FINN */ + + +#if defined(__FreeBSD__) && defined(KERNEL) +# if __FreeBSD__ < 3 +# include <machine/spl.h> +# else +# if __FreeBSD__ == 3 +# if defined(IPFILTER_LKM) && !defined(ACTUALLY_LKM_NOT_KERNEL) +# define ACTUALLY_LKM_NOT_KERNEL +# endif +# endif +# endif +#endif /* __FreeBSD__ && KERNEL */ + +/* + * Build some macros and #defines to enable the same code to compile anywhere + * Well, that's the idea, anyway :-) + */ +#ifdef KERNEL +# if SOLARIS +# define ATOMIC_INC(x) { mutex_enter(&ipf_rw); (x)++; \ + mutex_exit(&ipf_rw); } +# define ATOMIC_DEC(x) { mutex_enter(&ipf_rw); (x)--; \ + mutex_exit(&ipf_rw); } +# define MUTEX_ENTER(x) mutex_enter(x) +# if 1 +# define KRWLOCK_T krwlock_t +# define READ_ENTER(x) rw_enter(x, RW_READER) +# define WRITE_ENTER(x) rw_enter(x, RW_WRITER) +# define RW_UPGRADE(x) { if (rw_tryupgrade(x) == 0) { \ + rw_exit(x); \ + rw_enter(x, RW_WRITER); } \ + } +# define MUTEX_DOWNGRADE(x) rw_downgrade(x) +# define RWLOCK_INIT(x, y, z) rw_init((x), (y), RW_DRIVER, (z)) +# define RWLOCK_EXIT(x) rw_exit(x) +# define RW_DESTROY(x) rw_destroy(x) +# else +# define KRWLOCK_T kmutex_t +# define READ_ENTER(x) mutex_enter(x) +# define WRITE_ENTER(x) mutex_enter(x) +# define MUTEX_DOWNGRADE(x) ; +# define RWLOCK_INIT(x, y, z) mutex_init((x), (y), MUTEX_DRIVER, (z)) +# define RWLOCK_EXIT(x) mutex_exit(x) +# define RW_DESTROY(x) mutex_destroy(x) +# endif +# define MUTEX_EXIT(x) mutex_exit(x) +# define MTOD(m,t) (t)((m)->b_rptr) +# define IRCOPY(a,b,c) copyin((a), (b), (c)) +# define IWCOPY(a,b,c) copyout((a), (b), (c)) +# define FREE_MB_T(m) freemsg(m) +# define SPL_NET(x) ; +# define SPL_IMP(x) ; +# undef SPL_X +# define SPL_X(x) ; +# ifdef sparc +# define ntohs(x) (x) +# define ntohl(x) (x) +# define htons(x) (x) +# define htonl(x) (x) +# endif /* sparc */ +# define KMALLOC(a,b) (a) = (b)kmem_alloc(sizeof(*(a)), KM_NOSLEEP) +# define KMALLOCS(a,b,c) (a) = (b)kmem_alloc((c), KM_NOSLEEP) +# define GET_MINOR(x) getminor(x) +typedef struct qif { + struct qif *qf_next; + ill_t *qf_ill; + kmutex_t qf_lock; + void *qf_iptr; + void *qf_optr; + queue_t *qf_in; + queue_t *qf_out; + struct qinit *qf_wqinfo; + struct qinit *qf_rqinfo; + struct qinit qf_wqinit; + struct qinit qf_rqinit; + mblk_t *qf_m; /* These three fields are for passing data up from */ + queue_t *qf_q; /* fr_qin and fr_qout to the packet processing. */ + size_t qf_off; + size_t qf_len; /* this field is used for in ipfr_fastroute */ + char qf_name[8]; + /* + * in case the ILL has disappeared... + */ + size_t qf_hl; /* header length */ +} qif_t; +extern ill_t *get_unit __P((char *)); +# define GETUNIT(n) get_unit((n)) +# else /* SOLARIS */ +# if defined(__sgi) +# define hz HZ +# include <sys/ksynch.h> +# define IPF_LOCK_PL plhi +# include <sys/sema.h> +#undef kmutex_t +typedef struct { + lock_t *l; + int pl; +} kmutex_t; +# define ATOMIC_INC(x) { MUTEX_ENTER(&ipf_rw); \ + (x)++; MUTEX_EXIT(&ipf_rw); } +# define ATOMIC_DEC(x) { MUTEX_ENTER(&ipf_rw); \ + (x)--; MUTEX_EXIT(&ipf_rw); } +# define MUTEX_ENTER(x) (x)->pl = LOCK((x)->l, IPF_LOCK_PL); +# define KRWLOCK_T kmutex_t +# define READ_ENTER(x) MUTEX_ENTER(x) +# define WRITE_ENTER(x) MUTEX_ENTER(x) +# define RW_UPGRADE(x) ; +# define MUTEX_DOWNGRADE(x) ; +# define RWLOCK_EXIT(x) MUTEX_EXIT(x) +# define MUTEX_EXIT(x) UNLOCK((x)->l, (x)->pl); +# else /* __sgi */ +# define ATOMIC_INC(x) (x)++ +# define ATOMIC_DEC(x) (x)-- +# define MUTEX_ENTER(x) ; +# define READ_ENTER(x) ; +# define WRITE_ENTER(x) ; +# define RW_UPGRADE(x) ; +# define MUTEX_DOWNGRADE(x) ; +# define RWLOCK_EXIT(x) ; +# define MUTEX_EXIT(x) ; +# endif /* __sgi */ +# ifndef linux +# define FREE_MB_T(m) m_freem(m) +# define MTOD(m,t) mtod(m,t) +# define IRCOPY(a,b,c) bcopy((a), (b), (c)) +# define IWCOPY(a,b,c) bcopy((a), (b), (c)) +# endif /* !linux */ +# endif /* SOLARIS */ + +# ifdef sun +# if !SOLARIS +# include <sys/kmem_alloc.h> +# define GETUNIT(n) ifunit((n), IFNAMSIZ) +# endif +# else +# ifndef linux +# define GETUNIT(n) ifunit((n)) +# endif +# endif /* sun */ + +# if defined(sun) && !defined(linux) || defined(__sgi) +# define UIOMOVE(a,b,c,d) uiomove((caddr_t)a,b,c,d) +# define SLEEP(id, n) sleep((id), PZERO+1) +# define WAKEUP(id) wakeup(id) +# define KFREE(x) kmem_free((char *)(x), sizeof(*(x))) +# define KFREES(x,s) kmem_free((char *)(x), (s)) +# if !SOLARIS +extern void m_copydata __P((struct mbuf *, int, int, caddr_t)); +extern void m_copyback __P((struct mbuf *, int, int, caddr_t)); +# endif +# ifdef __sgi +# include <sys/kmem.h> +# include <sys/ddi.h> +# define KMALLOC(a,b) (a) = (b)kmem_alloc(sizeof(*(a)), KM_NOSLEEP) +# define KMALLOCS(a,b,c) (a) = (b)kmem_alloc((c), KM_NOSLEEP) +# define GET_MINOR(x) getminor(x) +# else +# if !SOLARIS +# define KMALLOC(a,b) (a) = (b)new_kmem_alloc(sizeof(*(a)), \ + KMEM_NOSLEEP) +# define KMALLOCS(a,b,c) (a) = (b)new_kmem_alloc((c), KMEM_NOSLEEP) +# endif /* SOLARIS */ +# endif /* __sgi */ +# endif /* sun && !linux */ +# ifndef GET_MINOR +# define GET_MINOR(x) minor(x) +# endif +# if (BSD >= 199306) || defined(__FreeBSD__) +# include <vm/vm.h> +# if !defined(__FreeBSD__) || (defined (__FreeBSD__) && __FreeBSD__>=3) +# include <vm/vm_extern.h> +# include <sys/proc.h> +extern vm_map_t kmem_map; +# else /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD__>=3) */ +# include <vm/vm_kern.h> +# endif /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD__>=3) */ +# ifdef M_PFIL +# define KMALLOC(a, b) MALLOC((a), b, sizeof(*(a)), M_PFIL, M_NOWAIT) +# define KMALLOCS(a, b, c) MALLOC((a), b, (c), M_PFIL, M_NOWAIT) +# define KFREE(x) FREE((x), M_PFIL) +# define KFREES(x,s) FREE((x), M_PFIL) +# else +# define KMALLOC(a, b) MALLOC((a), b, sizeof(*(a)), M_TEMP, M_NOWAIT) +# define KMALLOCS(a, b, c) MALLOC((a), b, (c), M_TEMP, M_NOWAIT) +# define KFREE(x) FREE((x), M_TEMP) +# define KFREES(x,s) FREE((x), M_TEMP) +# endif /* M_PFIL */ +# define UIOMOVE(a,b,c,d) uiomove(a,b,d) +# define SLEEP(id, n) tsleep((id), PPAUSE|PCATCH, n, 0) +# define WAKEUP(id) wakeup(id) +# endif /* BSD */ +# if defined(NetBSD) && NetBSD <= 1991011 && NetBSD >= 199407 +# define SPL_NET(x) x = splsoftnet() +# define SPL_X(x) (void) splx(x) +# else +# if !SOLARIS && !defined(linux) +# define SPL_IMP(x) x = splimp() +# define SPL_NET(x) x = splnet() +# define SPL_X(x) (void) splx(x) +# endif +# endif /* NetBSD && NetBSD <= 1991011 && NetBSD >= 199407 */ +# define PANIC(x,y) if (x) panic y +#else /* KERNEL */ +# define SLEEP(x,y) ; +# define WAKEUP(x) ; +# define PANIC(x,y) ; +# define ATOMIC_INC(x) (x)++ +# define ATOMIC_DEC(x) (x)-- +# define MUTEX_ENTER(x) ; +# define READ_ENTER(x) ; +# define WRITE_ENTER(x) ; +# define RW_UPGRADE(x) ; +# define MUTEX_DOWNGRADE(x) ; +# define RWLOCK_EXIT(x) ; +# define MUTEX_EXIT(x) ; +# define SPL_NET(x) ; +# define SPL_IMP(x) ; +# undef SPL_X +# define SPL_X(x) ; +# define KMALLOC(a,b) (a) = (b)malloc(sizeof(*a)) +# define KMALLOCS(a,b,c) (a) = (b)malloc(c) +# define KFREE(x) free(x) +# define KFREES(x,s) free(x) +# define GETUNIT(x) get_unit(x) +# define IRCOPY(a,b,c) bcopy((a), (b), (c)) +# define IWCOPY(a,b,c) bcopy((a), (b), (c)) +#endif /* KERNEL */ + +#if SOLARIS +typedef mblk_t mb_t; +# if SOLARIS2 >= 7 +# ifdef lint +# define ALIGN32(ptr) (ptr ? 0L : 0L) +# define ALIGN16(ptr) (ptr ? 0L : 0L) +# else +# define ALIGN32(ptr) (ptr) +# define ALIGN16(ptr) (ptr) +# endif +# endif +#else +# ifdef linux +# ifndef kernel +typedef struct mb { + struct mb *next; + u_int len; + u_char *data; +} mb_t; +# else +typedef struct sk_buff mb_t; +# endif +# else +typedef struct mbuf mb_t; +# endif +#endif /* SOLARIS */ + +#if defined(linux) || defined(__sgi) +/* + * These #ifdef's are here mainly for linux, but who knows, they may + * not be in other places or maybe one day linux will grow up and some + * of these will turn up there too. + */ +#ifndef ICMP_MINLEN +# define ICMP_MINLEN 8 +#endif +#ifndef ICMP_UNREACH +# define ICMP_UNREACH ICMP_DEST_UNREACH +#endif +#ifndef ICMP_SOURCEQUENCH +# define ICMP_SOURCEQUENCH ICMP_SOURCE_QUENCH +#endif +#ifndef ICMP_TIMXCEED +# define ICMP_TIMXCEED ICMP_TIME_EXCEEDED +#endif +#ifndef ICMP_PARAMPROB +# define ICMP_PARAMPROB ICMP_PARAMETERPROB +#endif +#ifndef ICMP_TSTAMP +# define ICMP_TSTAMP ICMP_TIMESTAMP +#endif +#ifndef ICMP_TSTAMPREPLY +# define ICMP_TSTAMPREPLY ICMP_TIMESTAMPREPLY +#endif +#ifndef ICMP_IREQ +# define ICMP_IREQ ICMP_INFO_REQUEST +#endif +#ifndef ICMP_IREQREPLY +# define ICMP_IREQREPLY ICMP_INFO_REPLY +#endif +#ifndef ICMP_MASKREQ +# define ICMP_MASKREQ ICMP_ADDRESS +#endif +#ifndef ICMP_MASKREPLY +# define ICMP_MASKREPLY ICMP_ADDRESSREPLY +#endif +#ifndef IPVERSION +# define IPVERSION 4 +#endif +#ifndef IPOPT_MINOFF +# define IPOPT_MINOFF 4 +#endif +#ifndef IPOPT_COPIED +# define IPOPT_COPIED(x) ((x)&0x80) +#endif +#ifndef IPOPT_EOL +# define IPOPT_EOL 0 +#endif +#ifndef IPOPT_NOP +# define IPOPT_NOP 1 +#endif +#ifndef IP_MF +# define IP_MF ((u_short)0x2000) +#endif +#ifndef ETHERTYPE_IP +# define ETHERTYPE_IP ((u_short)0x0800) +#endif +#ifndef TH_FIN +# define TH_FIN 0x01 +#endif +#ifndef TH_SYN +# define TH_SYN 0x02 +#endif +#ifndef TH_RST +# define TH_RST 0x04 +#endif +#ifndef TH_PUSH +# define TH_PUSH 0x08 +#endif +#ifndef TH_ACK +# define TH_ACK 0x10 +#endif +#ifndef TH_URG +# define TH_URG 0x20 +#endif +#ifndef IPOPT_EOL +# define IPOPT_EOL 0 +#endif +#ifndef IPOPT_NOP +# define IPOPT_NOP 1 +#endif +#ifndef IPOPT_RR +# define IPOPT_RR 7 +#endif +#ifndef IPOPT_TS +# define IPOPT_TS 68 +#endif +#ifndef IPOPT_SECURITY +# define IPOPT_SECURITY 130 +#endif +#ifndef IPOPT_LSRR +# define IPOPT_LSRR 131 +#endif +#ifndef IPOPT_SATID +# define IPOPT_SATID 136 +#endif +#ifndef IPOPT_SSRR +# define IPOPT_SSRR 137 +#endif +#ifndef IPOPT_SECUR_UNCLASS +# define IPOPT_SECUR_UNCLASS ((u_short)0x0000) +#endif +#ifndef IPOPT_SECUR_CONFID +# define IPOPT_SECUR_CONFID ((u_short)0xf135) +#endif +#ifndef IPOPT_SECUR_EFTO +# define IPOPT_SECUR_EFTO ((u_short)0x789a) +#endif +#ifndef IPOPT_SECUR_MMMM +# define IPOPT_SECUR_MMMM ((u_short)0xbc4d) +#endif +#ifndef IPOPT_SECUR_RESTR +# define IPOPT_SECUR_RESTR ((u_short)0xaf13) +#endif +#ifndef IPOPT_SECUR_SECRET +# define IPOPT_SECUR_SECRET ((u_short)0xd788) +#endif +#ifndef IPOPT_SECUR_TOPSECRET +# define IPOPT_SECUR_TOPSECRET ((u_short)0x6bc5) +#endif +#ifndef IPOPT_OLEN +# define IPOPT_OLEN 1 +#endif +#endif /* linux || __sgi */ + +#ifdef linux +#include <linux/in_systm.h> +/* + * TCP States + */ +#define TCPS_CLOSED 0 /* closed */ +#define TCPS_LISTEN 1 /* listening for connection */ +#define TCPS_SYN_SENT 2 /* active, have sent syn */ +#define TCPS_SYN_RECEIVED 3 /* have send and received syn */ +/* states < TCPS_ESTABLISHED are those where connections not established */ +#define TCPS_ESTABLISHED 4 /* established */ +#define TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */ +/* states > TCPS_CLOSE_WAIT are those where user has closed */ +#define TCPS_FIN_WAIT_1 6 /* have closed, sent fin */ +#define TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */ +#define TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */ +/* states > TCPS_CLOSE_WAIT && < TCPS_FIN_WAIT_2 await ACK of FIN */ +#define TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */ +#define TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */ + +/* + * file flags. + */ +#ifdef WRITE +#define FWRITE WRITE +#define FREAD READ +#else +#define FWRITE _IOC_WRITE +#define FREAD _IOC_READ +#endif +/* + * mbuf related problems. + */ +#define mtod(m,t) (t)((m)->data) +#define m_len len +#define m_next next + +#ifdef IP_DF +#undef IP_DF +#endif +#define IP_DF 0x4000 + +typedef struct { + __u16 th_sport; + __u16 th_dport; + __u32 th_seq; + __u32 th_ack; +# if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) ||\ + defined(vax) + __u8 th_res:4; + __u8 th_off:4; +#else + __u8 th_off:4; + __u8 th_res:4; +#endif + __u8 th_flags; + __u16 th_win; + __u16 th_sum; + __u16 th_urp; +} tcphdr_t; + +typedef struct { + __u16 uh_sport; + __u16 uh_dport; + __u16 uh_ulen; + __u16 uh_sum; +} udphdr_t; + +typedef struct { +# if defined(__i386__) || defined(__MIPSEL__) || defined(__alpha__) ||\ + defined(vax) + __u8 ip_hl:4; + __u8 ip_v:4; +# else + __u8 ip_hl:4; + __u8 ip_v:4; +# endif + __u8 ip_tos; + __u16 ip_len; + __u16 ip_id; + __u16 ip_off; + __u8 ip_ttl; + __u8 ip_p; + __u16 ip_sum; + struct in_addr ip_src; + struct in_addr ip_dst; +} ip_t; + +/* + * Structure of an icmp header. + */ +typedef struct icmp { + __u8 icmp_type; /* type of message, see below */ + __u8 icmp_code; /* type sub code */ + __u16 icmp_cksum; /* ones complement cksum of struct */ + union { + __u8 ih_pptr; /* ICMP_PARAMPROB */ + struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ + struct ih_idseq { + __u16 icd_id; + __u16 icd_seq; + } ih_idseq; + int ih_void; + } icmp_hun; +# define icmp_pptr icmp_hun.ih_pptr +# define icmp_gwaddr icmp_hun.ih_gwaddr +# define icmp_id icmp_hun.ih_idseq.icd_id +# define icmp_seq icmp_hun.ih_idseq.icd_seq +# define icmp_void icmp_hun.ih_void + union { + struct id_ts { + n_time its_otime; + n_time its_rtime; + n_time its_ttime; + } id_ts; + struct id_ip { + ip_t idi_ip; + /* options and then 64 bits of data */ + } id_ip; + u_long id_mask; + char id_data[1]; + } icmp_dun; +# define icmp_otime icmp_dun.id_ts.its_otime +# define icmp_rtime icmp_dun.id_ts.its_rtime +# define icmp_ttime icmp_dun.id_ts.its_ttime +# define icmp_ip icmp_dun.id_ip.idi_ip +# define icmp_mask icmp_dun.id_mask +# define icmp_data icmp_dun.id_data +} icmphdr_t; + +# ifndef LINUX_IPOVLY +# define LINUX_IPOVLY +struct ipovly { + caddr_t ih_next, ih_prev; /* for protocol sequence q's */ + u_char ih_x1; /* (unused) */ + u_char ih_pr; /* protocol */ + short ih_len; /* protocol length */ + struct in_addr ih_src; /* source internet address */ + struct in_addr ih_dst; /* destination internet address */ +}; +# endif + +typedef struct { + __u8 ether_dhost[6]; + __u8 ether_shost[6]; + __u16 ether_type; +} ether_header_t; + +typedef struct uio { + int uio_resid; + int uio_rw; + caddr_t uio_buf; +} uio_t; + +# define UIO_READ 0 +# define UIO_WRITE 1 +# define UIOMOVE(a, b, c, d) uiomove(a,b,c,d) + +/* + * For masking struct ifnet onto struct device + */ +# define if_name name + +# ifdef KERNEL +# define GETUNIT(x) dev_get(x) +# define FREE_MB_T(m) kfree_skb(m, FREE_WRITE) +# define uniqtime do_gettimeofday +# undef INT_MAX +# undef UINT_MAX +# undef LONG_MAX +# undef ULONG_MAX +# include <linux/netdevice.h> +# define SPL_X(x) +# define SPL_NET(x) +# define SPL_IMP(x) + +# define bcmp(a,b,c) memcmp(a,b,c) +# define bcopy(a,b,c) memcpy(b,a,c) +# define bzero(a,c) memset(a,0,c) + +# define UNITNAME(n) dev_get((n)) + +# define KMALLOC(a,b) (a) = (b)kmalloc(sizeof(*(a)), GFP_ATOMIC) +# define KMALLOCS(a,b,c) (a) = (b)kmalloc((c), GFP_ATOMIC) +# define KFREE(x) kfree_s((x), sizeof(*(x))) +# define KFREES(x,s) kfree_s((x), (s)) +# define IRCOPY(a,b,c) { \ + error = verify_area(VERIFY_READ, (a) ,(c)); \ + if (!error) \ + memcpy_fromfs((b), (a), (c)); \ + } +# define IWCOPY(a,b,c) { \ + error = verify_area(VERIFY_WRITE, (b), (c)); \ + if (!error) \ + memcpy_tofs((b), (a), (c)); \ + } +# else +# define __KERNEL__ +# undef INT_MAX +# undef UINT_MAX +# undef LONG_MAX +# undef ULONG_MAX +# define s8 __s8 +# define u8 __u8 +# define s16 __s16 +# define u16 __u16 +# define s32 __s32 +# define u32 __u32 +# include <linux/netdevice.h> +# undef __KERNEL__ +# endif +# define ifnet device +#else +typedef struct tcphdr tcphdr_t; +typedef struct udphdr udphdr_t; +typedef struct icmp icmphdr_t; +typedef struct ip ip_t; +typedef struct ether_header ether_header_t; +#endif /* linux */ +typedef struct tcpiphdr tcpiphdr_t; + +#if defined(hpux) || defined(linux) +struct ether_addr { + char ether_addr_octet[6]; +}; +#endif + +/* + * XXX - This is one of those *awful* hacks which nobody likes + */ +#ifdef ultrix +#define A_A +#else +#define A_A & +#endif + +#ifndef ICMP_ROUTERADVERT +# define ICMP_ROUTERADVERT 9 +#endif +#ifndef ICMP_ROUTERSOLICIT +# define ICMP_ROUTERSOLICIT 10 +#endif +/* + * ICMP error replies have an IP header (20 bytes), 8 bytes of ICMP data, + * another IP header and then 64 bits of data, totalling 56. Of course, + * the last 64 bits is dependant on that being available. + */ +#define ICMPERR_ICMPHLEN 8 +#define ICMPERR_IPICMPHLEN (20 + 8) +#define ICMPERR_MINPKTLEN (20 + 8 + 20) +#define ICMPERR_MAXPKTLEN (20 + 8 + 20 + 8) + +#endif /* __IP_COMPAT_H__ */ diff --git a/sys/contrib/ipfilter/netinet/ip_fil.c b/sys/contrib/ipfilter/netinet/ip_fil.c new file mode 100644 index 0000000..9d95eb3 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_fil.c @@ -0,0 +1,1471 @@ +/* + * Copyright (C) 1993-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + */ +#if !defined(lint) +static const char sccsid[] = "@(#)ip_fil.c 2.41 6/5/96 (C) 1993-1995 Darren Reed"; +/*static const char rcsid[] = "@(#)$Id: ip_fil.c,v 2.4.2.7 1999/10/15 13:49:43 darrenr Exp $";*/ +static const char rcsid[] = "@(#)$FreeBSD$"; +#endif + +#ifndef SOLARIS +#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4))) +#endif + +#if defined(KERNEL) && !defined(_KERNEL) +# define _KERNEL +#endif +#include <sys/param.h> +#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \ + defined(_KERNEL) +# include "opt_ipfilter_log.h" +#endif +#if defined(__FreeBSD__) && !defined(__FreeBSD_version) +# if !defined(_KERNEL) || defined(IPFILTER_LKM) +# include <osreldate.h> +# endif +#endif +#ifndef _KERNEL +# include <stdio.h> +# include <string.h> +# include <stdlib.h> +# include <ctype.h> +# include <fcntl.h> +#endif +#include <sys/errno.h> +#include <sys/types.h> +#include <sys/file.h> +#if __FreeBSD_version >= 220000 && defined(_KERNEL) +# include <sys/fcntl.h> +# include <sys/filio.h> +#else +# include <sys/ioctl.h> +#endif +#include <sys/time.h> +#ifdef _KERNEL +# include <sys/systm.h> +#endif +#include <sys/uio.h> +#if !SOLARIS +# if (NetBSD > 199609) || (OpenBSD > 199603) || (__FreeBSD_version >= 300000) +# include <sys/dirent.h> +# else +# include <sys/dir.h> +# endif +# include <sys/mbuf.h> +#else +# include <sys/filio.h> +#endif +#include <sys/protosw.h> +#include <sys/socket.h> + +#include <net/if.h> +#ifdef sun +# include <net/af.h> +#endif +#if __FreeBSD_version >= 300000 +# include <net/if_var.h> +# if defined(_KERNEL) && !defined(IPFILTER_LKM) +# include "opt_ipfilter.h" +# endif +#endif +#ifdef __sgi +#include <sys/debug.h> +# ifdef IFF_DRVRLOCK /* IRIX6 */ +#include <sys/hashing.h> +# endif +#endif +#include <net/route.h> +#include <netinet/in.h> +#if !(defined(__sgi) && !defined(IFF_DRVRLOCK)) /* IRIX < 6 */ +# include <netinet/in_var.h> +#endif +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/ip_var.h> +#include <netinet/tcp.h> +#include <netinet/udp.h> +#include <netinet/tcpip.h> +#include <netinet/ip_icmp.h> +#ifndef _KERNEL +# include <unistd.h> +# include <syslog.h> +#endif +#include "netinet/ip_compat.h" +#include "netinet/ip_fil.h" +#include "netinet/ip_proxy.h" +#include "netinet/ip_nat.h" +#include "netinet/ip_frag.h" +#include "netinet/ip_state.h" +#include "netinet/ip_auth.h" +#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000) +# include <sys/malloc.h> +#endif +#ifndef MIN +# define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#if !SOLARIS && defined(_KERNEL) && !defined(__sgi) +# include <sys/kernel.h> +extern int ip_optcopy __P((struct ip *, struct ip *)); +#endif + + +extern struct protosw inetsw[]; + +#ifndef _KERNEL +# include "ipt.h" +static struct ifnet **ifneta = NULL; +static int nifs = 0; +#else +# if (BSD < 199306) || defined(__sgi) +extern int tcp_ttl; +# endif +#endif + +int ipl_inited = 0; +int ipl_unreach = ICMP_UNREACH_FILTER; +u_long ipl_frouteok[2] = {0, 0}; + +static void frzerostats __P((caddr_t)); +#if defined(__NetBSD__) || defined(__OpenBSD__) || (__FreeBSD_version >= 300003) +static int frrequest __P((int, u_long, caddr_t, int)); +#else +static int frrequest __P((int, int, caddr_t, int)); +#endif +#ifdef _KERNEL +static int (*fr_savep) __P((ip_t *, int, void *, int, struct mbuf **)); +static int send_ip __P((struct mbuf *, ip_t *)); +# ifdef __sgi +extern kmutex_t ipf_rw; +# endif +#else +int ipllog __P((void)); +void init_ifp __P((void)); +# ifdef __sgi +static int no_output __P((struct ifnet *, struct mbuf *, + struct sockaddr *)); +static int write_output __P((struct ifnet *, struct mbuf *, + struct sockaddr *)); +# else +static int no_output __P((struct ifnet *, struct mbuf *, + struct sockaddr *, struct rtentry *)); +static int write_output __P((struct ifnet *, struct mbuf *, + struct sockaddr *, struct rtentry *)); +# endif +#endif +#if defined(IPFILTER_LKM) +int fr_running = 1; +#else +int fr_running = 0; +#endif + +#if (__FreeBSD_version >= 300000) && defined(_KERNEL) +struct callout_handle ipfr_slowtimer_ch; +#endif + +#if (_BSDI_VERSION >= 199510) && defined(_KERNEL) +# include <sys/device.h> +# include <sys/conf.h> + +struct cfdriver iplcd = { + NULL, "ipl", NULL, NULL, DV_DULL, 0 +}; + +struct devsw iplsw = { + &iplcd, + iplopen, iplclose, iplread, nowrite, iplioctl, noselect, nommap, + nostrat, nodump, nopsize, 0, + nostop +}; +#endif /* _BSDI_VERSION >= 199510 && _KERNEL */ + +#if defined(__NetBSD__) || defined(__OpenBSD__) || (_BSDI_VERSION >= 199701) +# include <sys/conf.h> +# if defined(NETBSD_PF) +# include <net/pfil.h> +/* + * We provide the fr_checkp name just to minimize changes later. + */ +int (*fr_checkp) __P((ip_t *ip, int hlen, void *ifp, int out, mb_t **mp)); +# endif /* NETBSD_PF */ +#endif /* __NetBSD__ */ + +#ifdef _KERNEL +# if defined(IPFILTER_LKM) && !defined(__sgi) +int iplidentify(s) +char *s; +{ + if (strcmp(s, "ipl") == 0) + return 1; + return 0; +} +# endif /* IPFILTER_LKM */ + + +/* + * Try to detect the case when compiling for NetBSD with pseudo-device + */ +# if defined(__NetBSD__) && defined(PFIL_HOOKS) +void +ipfilterattach(count) +int count; +{ + if (iplattach() != 0) + printf("IP Filter failed to attach\n"); +} +# endif + + +int iplattach() +{ + char *defpass; + int s; +# ifdef __sgi + int error; +# endif + + SPL_NET(s); + if (ipl_inited || (fr_checkp == fr_check)) { + printf("IP Filter: already initialized\n"); + SPL_X(s); + return EBUSY; + } + +# ifdef IPFILTER_LOG + ipflog_init(); +# endif + if (nat_init() == -1) + return -1; + if (fr_stateinit() == -1) + return -1; + if (appr_init() == -1) + return -1; + +# ifdef NETBSD_PF + pfil_add_hook((void *)fr_check, PFIL_IN|PFIL_OUT); +# endif + +# ifdef __sgi + error = ipfilter_sgi_attach(); + if (error) { + SPL_X(s); + return error; + } +# endif + + ipl_inited = 1; + bzero((char *)frcache, sizeof(frcache)); + fr_savep = fr_checkp; + fr_checkp = fr_check; + + SPL_X(s); + if (fr_pass & FR_PASS) + defpass = "pass"; + else if (fr_pass & FR_BLOCK) + defpass = "block"; + else + defpass = "no-match -> block"; + + printf("IP Filter: initialized. Default = %s all, Logging = %s\n", + defpass, +# ifdef IPFILTER_LOG + "enabled"); +# else + "disabled"); +# endif + printf("%s\n", ipfilter_version); +#ifdef _KERNEL +# if (__FreeBSD_version >= 300000) && defined(_KERNEL) + ipfr_slowtimer_ch = timeout(ipfr_slowtimer, NULL, hz/2); +# else + timeout(ipfr_slowtimer, NULL, hz/2); +# endif +#endif + return 0; +} + + +/* + * Disable the filter by removing the hooks from the IP input/output + * stream. + */ +int ipldetach() +{ + int s, i = FR_INQUE|FR_OUTQUE; + +#ifdef _KERNEL +# if (__FreeBSD_version >= 300000) + untimeout(ipfr_slowtimer, NULL, ipfr_slowtimer_ch); +# else +# ifdef __sgi + untimeout(ipfr_slowtimer); +# else + untimeout(ipfr_slowtimer, NULL); +# endif +# endif +#endif + SPL_NET(s); + if (!ipl_inited) + { + printf("IP Filter: not initialized\n"); + SPL_X(s); + return 0; + } + + printf("IP Filter: unloaded\n"); + + fr_checkp = fr_savep; + i = frflush(IPL_LOGIPF, i); + ipl_inited = 0; + +# ifdef NETBSD_PF + pfil_remove_hook((void *)fr_check, PFIL_IN|PFIL_OUT); +# endif + +# ifdef __sgi + ipfilter_sgi_detach(); +# endif + + ipfr_unload(); + ip_natunload(); + fr_stateunload(); + fr_authunload(); + + SPL_X(s); + return 0; +} +#endif /* _KERNEL */ + + +static void frzerostats(data) +caddr_t data; +{ + friostat_t fio; + + bcopy((char *)frstats, (char *)fio.f_st, + sizeof(struct filterstats) * 2); + fio.f_fin[0] = ipfilter[0][0]; + fio.f_fin[1] = ipfilter[0][1]; + fio.f_fout[0] = ipfilter[1][0]; + fio.f_fout[1] = ipfilter[1][1]; + fio.f_acctin[0] = ipacct[0][0]; + fio.f_acctin[1] = ipacct[0][1]; + fio.f_acctout[0] = ipacct[1][0]; + fio.f_acctout[1] = ipacct[1][1]; + fio.f_active = fr_active; + fio.f_froute[0] = ipl_frouteok[0]; + fio.f_froute[1] = ipl_frouteok[1]; + IWCOPY((caddr_t)&fio, data, sizeof(fio)); + bzero((char *)frstats, sizeof(*frstats) * 2); +} + + +/* + * Filter ioctl interface. + */ +#ifdef __sgi +int IPL_EXTERN(ioctl)(dev_t dev, int cmd, caddr_t data, int mode +# ifdef _KERNEL + , cred_t *cp, int *rp +# endif +) +#else +int IPL_EXTERN(ioctl)(dev, cmd, data, mode +#if ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || (NetBSD >= 199511) || \ + (__FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL) +, p) +struct proc *p; +#else +) +#endif +dev_t dev; +#if defined(__NetBSD__) || defined(__OpenBSD__) || \ + (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 300000) +u_long cmd; +#else +int cmd; +#endif +caddr_t data; +int mode; +#endif /* __sgi */ +{ +#if defined(_KERNEL) && !SOLARIS + int s; +#endif + int error = 0, unit = 0, tmp; + +#if (BSD >= 199306) && defined(_KERNEL) + if ((securelevel >= 2) && (mode & FWRITE)) + return EPERM; +#endif +#ifdef _KERNEL + unit = GET_MINOR(dev); + if ((IPL_LOGMAX < unit) || (unit < 0)) + return ENXIO; +#else + unit = dev; +#endif + + SPL_NET(s); + + if (unit == IPL_LOGNAT) { + error = nat_ioctl(data, cmd, mode); + SPL_X(s); + return error; + } + if (unit == IPL_LOGSTATE) { + error = fr_state_ioctl(data, cmd, mode); + SPL_X(s); + return error; + } + switch (cmd) { + case FIONREAD : +#ifdef IPFILTER_LOG + IWCOPY((caddr_t)&iplused[IPL_LOGIPF], (caddr_t)data, + sizeof(iplused[IPL_LOGIPF])); +#endif + break; +#if !defined(IPFILTER_LKM) && defined(_KERNEL) + case SIOCFRENB : + { + u_int enable; + + if (!(mode & FWRITE)) + error = EPERM; + else { + IRCOPY(data, (caddr_t)&enable, sizeof(enable)); + if (enable) { + error = iplattach(); + if (error == 0) + fr_running = 1; + } else { + error = ipldetach(); + if (error == 0) + fr_running = 0; + } + } + break; + } +#endif + case SIOCSETFF : + if (!(mode & FWRITE)) + error = EPERM; + else + IRCOPY(data, (caddr_t)&fr_flags, sizeof(fr_flags)); + break; + case SIOCGETFF : + IWCOPY((caddr_t)&fr_flags, data, sizeof(fr_flags)); + break; + case SIOCINAFR : + case SIOCRMAFR : + case SIOCADAFR : + case SIOCZRLST : + if (!(mode & FWRITE)) + error = EPERM; + else + error = frrequest(unit, cmd, data, fr_active); + break; + case SIOCINIFR : + case SIOCRMIFR : + case SIOCADIFR : + if (!(mode & FWRITE)) + error = EPERM; + else + error = frrequest(unit, cmd, data, 1 - fr_active); + break; + case SIOCSWAPA : + if (!(mode & FWRITE)) + error = EPERM; + else { + bzero((char *)frcache, sizeof(frcache[0]) * 2); + *(u_int *)data = fr_active; + fr_active = 1 - fr_active; + } + break; + case SIOCGETFS : + { + struct friostat fio; + + bcopy((char *)frstats, (char *)fio.f_st, + sizeof(struct filterstats) * 2); + fio.f_fin[0] = ipfilter[0][0]; + fio.f_fin[1] = ipfilter[0][1]; + fio.f_fout[0] = ipfilter[1][0]; + fio.f_fout[1] = ipfilter[1][1]; + fio.f_acctin[0] = ipacct[0][0]; + fio.f_acctin[1] = ipacct[0][1]; + fio.f_acctout[0] = ipacct[1][0]; + fio.f_acctout[1] = ipacct[1][1]; + fio.f_auth = ipauth; + fio.f_active = fr_active; + fio.f_froute[0] = ipl_frouteok[0]; + fio.f_froute[1] = ipl_frouteok[1]; + fio.f_running = fr_running; + fio.f_groups[0][0] = ipfgroups[0][0]; + fio.f_groups[0][1] = ipfgroups[0][1]; + fio.f_groups[1][0] = ipfgroups[1][0]; + fio.f_groups[1][1] = ipfgroups[1][1]; + fio.f_groups[2][0] = ipfgroups[2][0]; + fio.f_groups[2][1] = ipfgroups[2][1]; +#ifdef IPFILTER_LOG + fio.f_logging = 1; +#else + fio.f_logging = 0; +#endif + fio.f_defpass = fr_pass; + strncpy(fio.f_version, ipfilter_version, + sizeof(fio.f_version)); + IWCOPY((caddr_t)&fio, data, sizeof(fio)); + break; + } + case SIOCFRZST : + if (!(mode & FWRITE)) + error = EPERM; + else + frzerostats(data); + break; + case SIOCIPFFL : + if (!(mode & FWRITE)) + error = EPERM; + else { + IRCOPY(data, (caddr_t)&tmp, sizeof(tmp)); + tmp = frflush(unit, tmp); + IWCOPY((caddr_t)&tmp, data, sizeof(tmp)); + } + break; +#ifdef IPFILTER_LOG + case SIOCIPFFB : + if (!(mode & FWRITE)) + error = EPERM; + else + *(int *)data = ipflog_clear(unit); + break; +#endif /* IPFILTER_LOG */ + case SIOCGFRST : + IWCOPY((caddr_t)ipfr_fragstats(), data, sizeof(ipfrstat_t)); + break; + case SIOCAUTHW : + case SIOCAUTHR : + if (!(mode & FWRITE)) { + error = EPERM; + break; + } + case SIOCATHST : + error = fr_auth_ioctl(data, cmd, NULL, NULL); + break; + case SIOCFRSYN : + if (!(mode & FWRITE)) + error = EPERM; + else { +#if defined(_KERNEL) && defined(__sgi) + ipfsync(); +#endif + frsync(); + } + break; + default : + error = EINVAL; + break; + } + SPL_X(s); + return error; +} + + +void frsync() +{ +#ifdef _KERNEL + register frentry_t *f; + register struct ifnet *ifp; + +# if defined(__OpenBSD__) || ((NetBSD >= 199511) && (NetBSD < 1991011)) || \ + (defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)) +# if (NetBSD >= 199905) || defined(__OpenBSD__) + for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_list.tqe_next) +# else + for (ifp = ifnet.tqh_first; ifp; ifp = ifp->if_link.tqe_next) +# endif +# else + for (ifp = ifnet; ifp; ifp = ifp->if_next) +# endif + ip_natsync(ifp); + + WRITE_ENTER(&ipf_mutex); + for (f = ipacct[0][fr_active]; (f != NULL); f = f->fr_next) + if (f->fr_ifa == (void *)-1) + f->fr_ifa = GETUNIT(f->fr_ifname); + for (f = ipacct[1][fr_active]; (f != NULL); f = f->fr_next) + if (f->fr_ifa == (void *)-1) + f->fr_ifa = GETUNIT(f->fr_ifname); + for (f = ipfilter[0][fr_active]; (f != NULL); f = f->fr_next) + if (f->fr_ifa == (void *)-1) + f->fr_ifa = GETUNIT(f->fr_ifname); + for (f = ipfilter[1][fr_active]; (f != NULL); f = f->fr_next) + if (f->fr_ifa == (void *)-1) + f->fr_ifa = GETUNIT(f->fr_ifname); + RWLOCK_EXIT(&ipf_mutex); +#endif +} + + +void fr_forgetifp(ifp) +void *ifp; +{ + register frentry_t *f; + + WRITE_ENTER(&ipf_mutex); + for (f = ipacct[0][fr_active]; (f != NULL); f = f->fr_next) + if (f->fr_ifa == ifp) + f->fr_ifa = (void *)-1; + for (f = ipacct[1][fr_active]; (f != NULL); f = f->fr_next) + if (f->fr_ifa == ifp) + f->fr_ifa = (void *)-1; + for (f = ipfilter[0][fr_active]; (f != NULL); f = f->fr_next) + if (f->fr_ifa == ifp) + f->fr_ifa = (void *)-1; + for (f = ipfilter[1][fr_active]; (f != NULL); f = f->fr_next) + if (f->fr_ifa == ifp) + f->fr_ifa = (void *)-1; + RWLOCK_EXIT(&ipf_mutex); + ip_natsync(ifp); +} + + +static int frrequest(unit, req, data, set) +int unit; +#if defined(__NetBSD__) || defined(__OpenBSD__) || (__FreeBSD_version >= 300003) +u_long req; +#else +int req; +#endif +int set; +caddr_t data; +{ + register frentry_t *fp, *f, **fprev; + register frentry_t **ftail; + frentry_t frd; + frdest_t *fdp; + frgroup_t *fg = NULL; + int error = 0, in; + u_int group; + + fp = &frd; + IRCOPY(data, (caddr_t)fp, sizeof(*fp)); + fp->fr_ref = 0; + + /* + * Check that the group number does exist and that if a head group + * has been specified, doesn't exist. + */ + if ((req != SIOCZRLST) && fp->fr_grhead && + fr_findgroup((u_int)fp->fr_grhead, fp->fr_flags, unit, set, NULL)) + return EEXIST; + if ((req != SIOCZRLST) && fp->fr_group && + !fr_findgroup((u_int)fp->fr_group, fp->fr_flags, unit, set, NULL)) + return ESRCH; + + in = (fp->fr_flags & FR_INQUE) ? 0 : 1; + + if (unit == IPL_LOGAUTH) + ftail = fprev = &ipauth; + else if (fp->fr_flags & FR_ACCOUNT) + ftail = fprev = &ipacct[in][set]; + else if (fp->fr_flags & (FR_OUTQUE|FR_INQUE)) + ftail = fprev = &ipfilter[in][set]; + else + return ESRCH; + + if ((group = fp->fr_group)) { + if (!(fg = fr_findgroup(group, fp->fr_flags, unit, set, NULL))) + return ESRCH; + ftail = fprev = fg->fg_start; + } + + bzero((char *)frcache, sizeof(frcache[0]) * 2); + + if (*fp->fr_ifname) { + fp->fr_ifa = GETUNIT(fp->fr_ifname); + if (!fp->fr_ifa) + fp->fr_ifa = (void *)-1; + } +#if BSD >= 199306 + if (*fp->fr_oifname) { + fp->fr_oifa = GETUNIT(fp->fr_oifname); + if (!fp->fr_oifa) + fp->fr_oifa = (void *)-1; + } +#endif + + fdp = &fp->fr_dif; + fp->fr_flags &= ~FR_DUP; + if (*fdp->fd_ifname) { + fdp->fd_ifp = GETUNIT(fdp->fd_ifname); + if (!fdp->fd_ifp) + fdp->fd_ifp = (struct ifnet *)-1; + else + fp->fr_flags |= FR_DUP; + } + + fdp = &fp->fr_tif; + if (*fdp->fd_ifname) { + fdp->fd_ifp = GETUNIT(fdp->fd_ifname); + if (!fdp->fd_ifp) + fdp->fd_ifp = (struct ifnet *)-1; + } + + /* + * Look for a matching filter rule, but don't include the next or + * interface pointer in the comparison (fr_next, fr_ifa). + */ + for (; (f = *ftail); ftail = &f->fr_next) + if (bcmp((char *)&f->fr_ip, (char *)&fp->fr_ip, + FR_CMPSIZ) == 0) + break; + + /* + * If zero'ing statistics, copy current to caller and zero. + */ + if (req == SIOCZRLST) { + if (!f) + return ESRCH; + IWCOPY((caddr_t)f, data, sizeof(*f)); + f->fr_hits = 0; + f->fr_bytes = 0; + return 0; + } + + if (!f) { + ftail = fprev; + if (req != SIOCINAFR && req != SIOCINIFR) + while ((f = *ftail)) + ftail = &f->fr_next; + else if (fp->fr_hits) + while (--fp->fr_hits && (f = *ftail)) + ftail = &f->fr_next; + f = NULL; + } + + if (req == SIOCDELFR || req == SIOCRMIFR) { + if (!f) + error = ESRCH; + else { + if (f->fr_ref > 1) + return EBUSY; + if (fg && fg->fg_head) + fg->fg_head->fr_ref--; + if (unit == IPL_LOGAUTH) + return fr_auth_ioctl(data, req, f, ftail); + if (f->fr_grhead) + fr_delgroup((u_int)f->fr_grhead, fp->fr_flags, + unit, set); + fixskip(fprev, f, -1); + *ftail = f->fr_next; + KFREE(f); + } + } else { + if (f) + error = EEXIST; + else { + if (unit == IPL_LOGAUTH) + return fr_auth_ioctl(data, req, f, ftail); + KMALLOC(f, frentry_t *); + if (f != NULL) { + if (fg && fg->fg_head) + fg->fg_head->fr_ref++; + bcopy((char *)fp, (char *)f, sizeof(*f)); + f->fr_ref = 1; + f->fr_hits = 0; + f->fr_next = *ftail; + *ftail = f; + if (req == SIOCINIFR || req == SIOCINAFR) + fixskip(fprev, f, 1); + f->fr_grp = NULL; + if ((group = f->fr_grhead)) + fg = fr_addgroup(group, f, unit, set); + } else + error = ENOMEM; + } + } + return (error); +} + + +#ifdef _KERNEL +/* + * routines below for saving IP headers to buffer + */ +# ifdef __sgi +# ifdef _KERNEL +int IPL_EXTERN(open)(dev_t *pdev, int flags, int devtype, cred_t *cp) +# else +int IPL_EXTERN(open)(dev_t dev, int flags) +# endif +# else +int IPL_EXTERN(open)(dev, flags +# if ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || (NetBSD >= 199511) || \ + (__FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL) +, devtype, p) +int devtype; +struct proc *p; +# else +) +# endif +dev_t dev; +int flags; +# endif /* __sgi */ +{ +# if defined(__sgi) && defined(_KERNEL) + u_int min = geteminor(*pdev); +# else + u_int min = GET_MINOR(dev); +# endif + + if (IPL_LOGMAX < min) + min = ENXIO; + else + min = 0; + return min; +} + + +# ifdef __sgi +int IPL_EXTERN(close)(dev_t dev, int flags, int devtype, cred_t *cp) +#else +int IPL_EXTERN(close)(dev, flags +# if ((_BSDI_VERSION >= 199510) || (BSD >= 199506) || (NetBSD >= 199511) || \ + (__FreeBSD_version >= 220000) || defined(__OpenBSD__)) && defined(_KERNEL) +, devtype, p) +int devtype; +struct proc *p; +# else +) +# endif +dev_t dev; +int flags; +# endif /* __sgi */ +{ + u_int min = GET_MINOR(dev); + + if (IPL_LOGMAX < min) + min = ENXIO; + else + min = 0; + return min; +} + +/* + * iplread/ipllog + * both of these must operate with at least splnet() lest they be + * called during packet processing and cause an inconsistancy to appear in + * the filter lists. + */ +# ifdef __sgi +int IPL_EXTERN(read)(dev_t dev, uio_t *uio, cred_t *crp) +# else +# if BSD >= 199306 +int IPL_EXTERN(read)(dev, uio, ioflag) +int ioflag; +# else +int IPL_EXTERN(read)(dev, uio) +# endif +dev_t dev; +register struct uio *uio; +# endif /* __sgi */ +{ +# ifdef IPFILTER_LOG + return ipflog_read(GET_MINOR(dev), uio); +# else + return ENXIO; +# endif +} + + +/* + * send_reset - this could conceivably be a call to tcp_respond(), but that + * requires a large amount of setting up and isn't any more efficient. + */ +int send_reset(fin, oip) +fr_info_t *fin; +struct ip *oip; +{ + struct tcphdr *tcp, *tcp2; + struct tcpiphdr *tp; + struct mbuf *m; + int tlen = 0; + ip_t *ip; + + tcp = (struct tcphdr *)fin->fin_dp; + if (tcp->th_flags & TH_RST) + return -1; /* feedback loop */ +# if (BSD < 199306) || defined(__sgi) + m = m_get(M_DONTWAIT, MT_HEADER); +# else + m = m_gethdr(M_DONTWAIT, MT_HEADER); +# endif + if (m == NULL) + return ENOBUFS; + if (m == NULL) + return -1; + + if (tcp->th_flags & TH_SYN) + tlen = 1; + m->m_len = sizeof(*tcp2) + sizeof(*ip); +# if BSD >= 199306 + m->m_data += max_linkhdr; + m->m_pkthdr.len = m->m_len; + m->m_pkthdr.rcvif = (struct ifnet *)0; +# endif + bzero(mtod(m, char *), sizeof(struct tcpiphdr)); + ip = mtod(m, struct ip *); + tp = mtod(m, struct tcpiphdr *); + tcp2 = (struct tcphdr *)((char *)ip + sizeof(*ip)); + + ip->ip_src.s_addr = oip->ip_dst.s_addr; + ip->ip_dst.s_addr = oip->ip_src.s_addr; + tcp2->th_dport = tcp->th_sport; + tcp2->th_sport = tcp->th_dport; + tcp2->th_ack = ntohl(tcp->th_seq); + tcp2->th_ack += tlen; + tcp2->th_ack = htonl(tcp2->th_ack); + tcp2->th_off = sizeof(*tcp2) >> 2; + tcp2->th_flags = TH_RST|TH_ACK; + tp->ti_pr = oip->ip_p; + tp->ti_len = htons(sizeof(struct tcphdr)); + tcp2->th_sum = in_cksum(m, sizeof(*ip) + sizeof(*tcp2)); + + ip->ip_tos = oip->ip_tos; + ip->ip_p = oip->ip_p; + ip->ip_len = sizeof(*ip) + sizeof(*tcp2); + + return send_ip(m, ip); +} + + +static int send_ip(m, ip) +struct mbuf *m; +ip_t *ip; +{ +# if (defined(__FreeBSD_version) && (__FreeBSD_version >= 220000)) || \ + (defined(_BSDI_VERSION) && (_BSDI_VERSION >= 199802)) + struct route ro; +# endif + +# if (BSD < 199306) || defined(__sgi) + ip->ip_ttl = tcp_ttl; +# else + ip->ip_ttl = ip_defttl; +# endif + +# if defined(__FreeBSD_version) && (__FreeBSD_version >= 220000) + { + int err; + + bzero((char *)&ro, sizeof(ro)); + err = ip_output(m, (struct mbuf *)0, &ro, 0, 0); + if (ro.ro_rt) + RTFREE(ro.ro_rt); + return err; + } +# else + /* + * extra 0 in case of multicast + */ +# if _BSDI_VERSION >= 199802 + return ip_output(m, (struct mbuf *)0, &ro, 0, 0, NULL); +# else + return ip_output(m, (struct mbuf *)0, 0, 0, 0); +# endif +# endif +} + + +int send_icmp_err(oip, type, code, ifp, dst) +ip_t *oip; +int type, code; +void *ifp; +struct in_addr dst; +{ + struct icmp *icmp; + struct mbuf *m; + ip_t *nip; + +# if (BSD < 199306) || defined(__sgi) + m = m_get(M_DONTWAIT, MT_HEADER); +# else + m = m_gethdr(M_DONTWAIT, MT_HEADER); +# endif + if (m == NULL) + return ENOBUFS; + m->m_len = sizeof(*nip) + sizeof(*icmp) + 8; +# if BSD >= 199306 + m->m_data += max_linkhdr; + m->m_pkthdr.len = sizeof(*nip) + sizeof(*icmp) + 8; + m->m_pkthdr.rcvif = (struct ifnet *)0; +# endif + + bzero(mtod(m, char *), (size_t)sizeof(*nip) + sizeof(*icmp) + 8); + nip = mtod(m, ip_t *); + icmp = (struct icmp *)(nip + 1); + + nip->ip_v = IPVERSION; + nip->ip_hl = (sizeof(*nip) >> 2); + nip->ip_p = IPPROTO_ICMP; + nip->ip_id = oip->ip_id; + nip->ip_sum = 0; + nip->ip_ttl = 60; + nip->ip_tos = oip->ip_tos; + nip->ip_len = sizeof(*nip) + sizeof(*icmp) + 8; + if (dst.s_addr == 0) { + if (fr_ifpaddr(ifp, &dst) == -1) + return -1; + dst.s_addr = htonl(dst.s_addr); + } + nip->ip_src = dst; + nip->ip_dst = oip->ip_src; + + icmp->icmp_type = type; + icmp->icmp_code = code; + icmp->icmp_cksum = 0; + bcopy((char *)oip, (char *)&icmp->icmp_ip, sizeof(*oip)); + bcopy((char *)oip + (oip->ip_hl << 2), + (char *)&icmp->icmp_ip + sizeof(*oip), 8); /* 64 bits */ +# ifndef sparc + { + register u_short __iplen, __ipoff; + ip_t *ip = &icmp->icmp_ip; + + __iplen = ip->ip_len; + __ipoff = ip->ip_off; + ip->ip_len = htons(__iplen); + ip->ip_off = htons(__ipoff); + } +# endif + icmp->icmp_cksum = ipf_cksum((u_short *)icmp, sizeof(*icmp) + 8); + return send_ip(m, nip); +} + + +# if !defined(IPFILTER_LKM) && (__FreeBSD_version < 300000) && !defined(__sgi) +# if (BSD < 199306) +int iplinit __P((void)); + +int +# else +void iplinit __P((void)); + +void +# endif +iplinit() +{ + if (iplattach() != 0) + printf("IP Filter failed to attach\n"); + ip_init(); +} +# endif /* ! __NetBSD__ */ + + +size_t mbufchainlen(m0) +register struct mbuf *m0; +{ + register size_t len = 0; + + for (; m0; m0 = m0->m_next) + len += m0->m_len; + return len; +} + + +int ipfr_fastroute(m0, fin, fdp) +struct mbuf *m0; +fr_info_t *fin; +frdest_t *fdp; +{ + register struct ip *ip, *mhip; + register struct mbuf *m = m0; + register struct route *ro; + int len, off, error = 0, hlen; + struct sockaddr_in *dst; + struct route iproute; + struct ifnet *ifp; + frentry_t *fr; + + hlen = fin->fin_hlen; + ip = mtod(m0, struct ip *); + /* + * Route packet. + */ + ro = &iproute; + bzero((caddr_t)ro, sizeof (*ro)); + dst = (struct sockaddr_in *)&ro->ro_dst; + dst->sin_family = AF_INET; + + fr = fin->fin_fr; + ifp = fdp->fd_ifp; + /* + * In case we're here due to "to <if>" being used with "keep state", + * check that we're going in the correct direction. + */ + if ((fr != NULL) && (ifp != NULL) && (fin->fin_rev != 0) && + (fdp == &fr->fr_tif)) + return -1; +# ifdef __bsdi__ + dst->sin_len = sizeof(*dst); +# endif +# if (BSD >= 199306) && !defined(__NetBSD__) && !defined(__bsdi__) && \ + !defined(__OpenBSD__) +# ifdef RTF_CLONING + rtalloc_ign(ro, RTF_CLONING); +# else + rtalloc_ign(ro, RTF_PRCLONING); +# endif +# else + rtalloc(ro); +# endif + if (!ifp) { + if (!(fin->fin_fr->fr_flags & FR_FASTROUTE)) { + error = -2; + goto bad; + } + if (ro->ro_rt == 0 || (ifp = ro->ro_rt->rt_ifp) == 0) { + if (in_localaddr(ip->ip_dst)) + error = EHOSTUNREACH; + else + error = ENETUNREACH; + goto bad; + } + if (ro->ro_rt->rt_flags & RTF_GATEWAY) + dst = (struct sockaddr_in *)&ro->ro_rt->rt_gateway; + } + if (ro->ro_rt) + ro->ro_rt->rt_use++; + + /* + * For input packets which are being "fastrouted", they won't + * go back through output filtering and miss their chance to get + * NAT'd and counted. + */ + fin->fin_ifp = ifp; + if (fin->fin_out == 0) { + fin->fin_out = 1; + if ((fin->fin_fr = ipacct[1][fr_active]) && + (fr_scanlist(FR_NOMATCH, ip, fin, m) & FR_ACCOUNT)) { + ATOMIC_INC(frstats[1].fr_acct); + } + fin->fin_fr = NULL; + (void) fr_checkstate(ip, fin); + (void) ip_natout(ip, fin); + } else + ip->ip_sum = 0; + /* + * If small enough for interface, can just send directly. + */ + if (ip->ip_len <= ifp->if_mtu) { +# ifndef sparc + ip->ip_id = htons(ip->ip_id); + ip->ip_len = htons(ip->ip_len); + ip->ip_off = htons(ip->ip_off); +# endif + if (!ip->ip_sum) + ip->ip_sum = in_cksum(m, hlen); +# if BSD >= 199306 + error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst, + ro->ro_rt); +# else + error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst); +# endif + goto done; + } + /* + * Too large for interface; fragment if possible. + * Must be able to put at least 8 bytes per fragment. + */ + if (ip->ip_off & IP_DF) { + error = EMSGSIZE; + goto bad; + } + len = (ifp->if_mtu - hlen) &~ 7; + if (len < 8) { + error = EMSGSIZE; + goto bad; + } + + { + int mhlen, firstlen = len; + struct mbuf **mnext = &m->m_act; + + /* + * Loop through length of segment after first fragment, + * make new header and copy data of each part and link onto chain. + */ + m0 = m; + mhlen = sizeof (struct ip); + for (off = hlen + len; off < ip->ip_len; off += len) { +# ifdef MGETHDR + MGETHDR(m, M_DONTWAIT, MT_HEADER); +# else + MGET(m, M_DONTWAIT, MT_HEADER); +# endif + if (m == 0) { + error = ENOBUFS; + goto bad; + } +# if BSD >= 199306 + m->m_data += max_linkhdr; +# else + m->m_off = MMAXOFF - hlen; +# endif + mhip = mtod(m, struct ip *); + bcopy((char *)ip, (char *)mhip, sizeof(*ip)); + if (hlen > sizeof (struct ip)) { + mhlen = ip_optcopy(ip, mhip) + sizeof (struct ip); + mhip->ip_hl = mhlen >> 2; + } + m->m_len = mhlen; + mhip->ip_off = ((off - hlen) >> 3) + (ip->ip_off & ~IP_MF); + if (ip->ip_off & IP_MF) + mhip->ip_off |= IP_MF; + if (off + len >= ip->ip_len) + len = ip->ip_len - off; + else + mhip->ip_off |= IP_MF; + mhip->ip_len = htons((u_short)(len + mhlen)); + m->m_next = m_copy(m0, off, len); + if (m->m_next == 0) { + error = ENOBUFS; /* ??? */ + goto sendorfree; + } +# ifndef sparc + mhip->ip_off = htons((u_short)mhip->ip_off); +# endif + mhip->ip_sum = 0; + mhip->ip_sum = in_cksum(m, mhlen); + *mnext = m; + mnext = &m->m_act; + } + /* + * Update first fragment by trimming what's been copied out + * and updating header, then send each fragment (in order). + */ + m_adj(m0, hlen + firstlen - ip->ip_len); + ip->ip_len = htons((u_short)(hlen + firstlen)); + ip->ip_off = htons((u_short)(ip->ip_off | IP_MF)); + ip->ip_sum = 0; + ip->ip_sum = in_cksum(m0, hlen); +sendorfree: + for (m = m0; m; m = m0) { + m0 = m->m_act; + m->m_act = 0; + if (error == 0) +# if BSD >= 199306 + error = (*ifp->if_output)(ifp, m, + (struct sockaddr *)dst, ro->ro_rt); +# else + error = (*ifp->if_output)(ifp, m, + (struct sockaddr *)dst); +# endif + else + m_freem(m); + } + } +done: + if (!error) + ipl_frouteok[0]++; + else + ipl_frouteok[1]++; + + if (ro->ro_rt) + RTFREE(ro->ro_rt); + return 0; +bad: + m_freem(m); + goto done; +} +#else /* #ifdef _KERNEL */ + + +# ifdef __sgi +static int no_output __P((struct ifnet *ifp, struct mbuf *m, + struct sockaddr *s)) +# else +static int no_output __P((struct ifnet *ifp, struct mbuf *m, + struct sockaddr *s, struct rtentry *rt)) +# endif +{ + return 0; +} + + +# ifdef __STDC__ +# ifdef __sgi +static int write_output __P((struct ifnet *ifp, struct mbuf *m, + struct sockaddr *s)) +# else +static int write_output __P((struct ifnet *ifp, struct mbuf *m, + struct sockaddr *s, struct rtentry *rt)) +# endif +{ + ip_t *ip = (ip_t *)m; +# else +static int write_output(ifp, ip) +struct ifnet *ifp; +ip_t *ip; +{ +# endif + char fname[32]; + int fd; + +# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199606)) || \ + (defined(OpenBSD) && (OpenBSD >= 199603)) + snprintf(fname, sizeof(fname), "/tmp/%s", ifp->if_xname); +# else + snprintf(fname, sizeof(fname), "/tmp/%s%d", ifp->if_name, ifp->if_unit); +# endif + fd = open(fname, O_WRONLY|O_APPEND); + if (fd == -1) { + perror("open"); + return -1; + } + write(fd, (char *)ip, ntohs(ip->ip_len)); + close(fd); + return 0; +} + + +struct ifnet *get_unit(name) +char *name; +{ + struct ifnet *ifp, **ifa; +# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199606)) || \ + (defined(OpenBSD) && (OpenBSD >= 199603)) + for (ifa = ifneta; ifa && (ifp = *ifa); ifa++) { + if (!strcmp(name, ifp->if_xname)) + return ifp; + } +# else + char ifname[32], *s; + + for (ifa = ifneta; ifa && (ifp = *ifa); ifa++) { + (void) snprintf(ifname, sizeof(ifname), "%s%d", + ifp->if_name, ifp->if_unit); + if (!strcmp(name, ifname)) + return ifp; + } +# endif + + if (!ifneta) { + ifneta = (struct ifnet **)malloc(sizeof(ifp) * 2); + ifneta[1] = NULL; + ifneta[0] = (struct ifnet *)calloc(1, sizeof(*ifp)); + nifs = 1; + } else { + nifs++; + ifneta = (struct ifnet **)realloc(ifneta, + (nifs + 1) * sizeof(*ifa)); + ifneta[nifs] = NULL; + ifneta[nifs - 1] = (struct ifnet *)malloc(sizeof(*ifp)); + } + ifp = ifneta[nifs - 1]; + +# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199606)) || \ + (defined(OpenBSD) && (OpenBSD >= 199603)) + strncpy(ifp->if_xname, name, sizeof(ifp->if_xname)); +# else + for (s = name; *s && !isdigit(*s); s++) + ; + if (*s && isdigit(*s)) { + ifp->if_unit = atoi(s); + ifp->if_name = (char *)malloc(s - name + 1); + strncpy(ifp->if_name, name, s - name); + ifp->if_name[s - name] = '\0'; + } else { + ifp->if_name = strdup(name); + ifp->if_unit = -1; + } +# endif + ifp->if_output = no_output; + return ifp; +} + + + +void init_ifp() +{ + struct ifnet *ifp, **ifa; + char fname[32]; + int fd; + +# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199606)) || \ + (defined(OpenBSD) && (OpenBSD >= 199603)) + for (ifa = ifneta; ifa && (ifp = *ifa); ifa++) { + ifp->if_output = write_output; + snprintf(fname, sizeof(fname), "/tmp/%s", ifp->if_xname); + fd = open(fname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600); + if (fd == -1) + perror("open"); + else + close(fd); + } +# else + + for (ifa = ifneta; ifa && (ifp = *ifa); ifa++) { + ifp->if_output = write_output; + snprintf(fname, sizeof(fname), "/tmp/%s%d", ifp->if_name, ifp->if_unit); + fd = open(fname, O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600); + if (fd == -1) + perror("open"); + else + close(fd); + } +# endif +} + + +int ipfr_fastroute(ip, fin, fdp) +ip_t *ip; +fr_info_t *fin; +frdest_t *fdp; +{ + struct ifnet *ifp = fdp->fd_ifp; + + if (!ifp) + return 0; /* no routing table out here */ + + ip->ip_len = htons((u_short)ip->ip_len); + ip->ip_off = htons((u_short)(ip->ip_off | IP_MF)); + ip->ip_sum = 0; +#ifdef __sgi + (*ifp->if_output)(ifp, (void *)ip, NULL); +#else + (*ifp->if_output)(ifp, (void *)ip, NULL, 0); +#endif + return 0; +} + + +int ipllog __P((void)) +{ + verbose("l"); + return 0; +} + + +int send_reset(ip, ifp) +ip_t *ip; +struct ifnet *ifp; +{ + verbose("- TCP RST sent\n"); + return 0; +} + + +int icmp_error(ip, ifp) +ip_t *ip; +struct ifnet *ifp; +{ + verbose("- TCP RST sent\n"); + return 0; +} +#endif /* _KERNEL */ diff --git a/sys/contrib/ipfilter/netinet/ip_fil.h b/sys/contrib/ipfilter/netinet/ip_fil.h new file mode 100644 index 0000000..aef96ca --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_fil.h @@ -0,0 +1,566 @@ +/* + * Copyright (C) 1993-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + * + * @(#)ip_fil.h 1.35 6/5/96 + * $Id: ip_fil.h,v 2.3.2.4 1999/10/15 13:42:37 darrenr Exp $ + * $FreeBSD$ + */ + +#ifndef __IP_FIL_H__ +#define __IP_FIL_H__ + +/* + * Pathnames for various IP Filter control devices. Used by LKM + * and userland, so defined here. + */ +#define IPNAT_NAME "/dev/ipnat" +#define IPSTATE_NAME "/dev/ipstate" +#define IPAUTH_NAME "/dev/ipauth" + +#ifndef SOLARIS +# define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4))) +#endif + +#if defined(KERNEL) && !defined(_KERNEL) +# define _KERNEL +#endif + +#ifndef __P +# ifdef __STDC__ +# define __P(x) x +# else +# define __P(x) () +# endif +#endif + +#if defined(__STDC__) || defined(__GNUC__) +# define SIOCADAFR _IOW('r', 60, struct frentry) +# define SIOCRMAFR _IOW('r', 61, struct frentry) +# define SIOCSETFF _IOW('r', 62, u_int) +# define SIOCGETFF _IOR('r', 63, u_int) +# define SIOCGETFS _IOR('r', 64, struct friostat) +# define SIOCIPFFL _IOWR('r', 65, int) +# define SIOCIPFFB _IOR('r', 66, int) +# define SIOCADIFR _IOW('r', 67, struct frentry) +# define SIOCRMIFR _IOW('r', 68, struct frentry) +# define SIOCSWAPA _IOR('r', 69, u_int) +# define SIOCINAFR _IOW('r', 70, struct frentry) +# define SIOCINIFR _IOW('r', 71, struct frentry) +# define SIOCFRENB _IOW('r', 72, u_int) +# define SIOCFRSYN _IOW('r', 73, u_int) +# define SIOCFRZST _IOWR('r', 74, struct friostat) +# define SIOCZRLST _IOWR('r', 75, struct frentry) +# define SIOCAUTHW _IOWR('r', 76, struct fr_info) +# define SIOCAUTHR _IOWR('r', 77, struct fr_info) +# define SIOCATHST _IOWR('r', 78, struct fr_authstat) +#else +# define SIOCADAFR _IOW(r, 60, struct frentry) +# define SIOCRMAFR _IOW(r, 61, struct frentry) +# define SIOCSETFF _IOW(r, 62, u_int) +# define SIOCGETFF _IOR(r, 63, u_int) +# define SIOCGETFS _IOR(r, 64, struct friostat) +# define SIOCIPFFL _IOWR(r, 65, int) +# define SIOCIPFFB _IOR(r, 66, int) +# define SIOCADIFR _IOW(r, 67, struct frentry) +# define SIOCRMIFR _IOW(r, 68, struct frentry) +# define SIOCSWAPA _IOR(r, 69, u_int) +# define SIOCINAFR _IOW(r, 70, struct frentry) +# define SIOCINIFR _IOW(r, 71, struct frentry) +# define SIOCFRENB _IOW(r, 72, u_int) +# define SIOCFRSYN _IOW(r, 73, u_int) +# define SIOCFRZST _IOWR(r, 74, struct friostat) +# define SIOCZRLST _IOWR(r, 75, struct frentry) +# define SIOCAUTHW _IOWR(r, 76, struct fr_info) +# define SIOCAUTHR _IOWR(r, 77, struct fr_info) +# define SIOCATHST _IOWR(r, 78, struct fr_authstat) +#endif +#define SIOCADDFR SIOCADAFR +#define SIOCDELFR SIOCRMAFR +#define SIOCINSFR SIOCINAFR + +typedef struct fr_ip { + u_char fi_v:4; /* IP version */ + u_char fi_fl:4; /* packet flags */ + u_char fi_tos; /* IP packet TOS */ + u_char fi_ttl; /* IP packet TTL */ + u_char fi_p; /* IP packet protocol */ + struct in_addr fi_src; /* source address from packet */ + struct in_addr fi_dst; /* destination address from packet */ + u_32_t fi_optmsk; /* bitmask composed from IP options */ + u_short fi_secmsk; /* bitmask composed from IP security options */ + u_short fi_auth; /* authentication code from IP sec. options */ +} fr_ip_t; + +#define FI_OPTIONS (FF_OPTIONS >> 24) +#define FI_TCPUDP (FF_TCPUDP >> 24) /* TCP/UCP implied comparison*/ +#define FI_FRAG (FF_FRAG >> 24) +#define FI_SHORT (FF_SHORT >> 24) +#define FI_CMP (FI_OPTIONS|FI_TCPUDP|FI_SHORT) + +/* + * These are both used by the state and NAT code to indicate that one port or + * the other should be treated as a wildcard. + */ +#define FI_W_SPORT 0x00000100 +#define FI_W_DPORT 0x00000200 + +typedef struct fr_info { + void *fin_ifp; /* interface packet is `on' */ + struct fr_ip fin_fi; /* IP Packet summary */ + u_short fin_data[2]; /* TCP/UDP ports, ICMP code/type */ + u_char fin_out; /* in or out ? 1 == out, 0 == in */ + u_char fin_rev; /* state only: 1 = reverse */ + u_short fin_hlen; /* length of IP header in bytes */ + u_char fin_tcpf; /* TCP header flags (SYN, ACK, etc) */ + /* From here on is packet specific */ + u_char fin_icode; /* ICMP error to return */ + u_short fin_rule; /* rule # last matched */ + u_short fin_group; /* group number, -1 for none */ + struct frentry *fin_fr; /* last matching rule */ + char *fin_dp; /* start of data past IP header */ + u_short fin_dlen; /* length of data portion of packet */ + u_short fin_id; /* IP packet id field */ + void *fin_mp; /* pointer to pointer to mbuf */ +#if SOLARIS && defined(_KERNEL) + void *fin_qfm; /* pointer to mblk where pkt starts */ + void *fin_qif; +#endif +} fr_info_t; + +/* + * Size for compares on fr_info structures + */ +#define FI_CSIZE offsetof(fr_info_t, fin_icode) + +/* + * Size for copying cache fr_info structure + */ +#define FI_COPYSIZE offsetof(fr_info_t, fin_dp) + +typedef struct frdest { + void *fd_ifp; + struct in_addr fd_ip; + char fd_ifname[IFNAMSIZ]; +} frdest_t; + +typedef struct frentry { + struct frentry *fr_next; + u_short fr_group; /* group to which this rule belongs */ + u_short fr_grhead; /* group # which this rule starts */ + struct frentry *fr_grp; + int fr_ref; /* reference count - for grouping */ + void *fr_ifa; +#if BSD >= 199306 + void *fr_oifa; +#endif + /* + * These are only incremented when a packet matches this rule and + * it is the last match + */ + U_QUAD_T fr_hits; + U_QUAD_T fr_bytes; + /* + * Fields after this may not change whilst in the kernel. + */ + struct fr_ip fr_ip; + struct fr_ip fr_mip; /* mask structure */ + + u_char fr_tcpfm; /* tcp flags mask */ + u_char fr_tcpf; /* tcp flags */ + + u_short fr_icmpm; /* data for ICMP packets (mask) */ + u_short fr_icmp; + + u_char fr_scmp; /* data for port comparisons */ + u_char fr_dcmp; + u_short fr_dport; + u_short fr_sport; + u_short fr_stop; /* top port for <> and >< */ + u_short fr_dtop; /* top port for <> and >< */ + u_32_t fr_flags; /* per-rule flags && options (see below) */ + u_short fr_skip; /* # of rules to skip */ + u_short fr_loglevel; /* syslog log facility + priority */ + int (*fr_func) __P((int, ip_t *, fr_info_t *)); /* call this function */ + char fr_icode; /* return ICMP code */ + char fr_ifname[IFNAMSIZ]; +#if BSD >= 199306 + char fr_oifname[IFNAMSIZ]; +#endif + struct frdest fr_tif; /* "to" interface */ + struct frdest fr_dif; /* duplicate packet interfaces */ +} frentry_t; + +#define fr_proto fr_ip.fi_p +#define fr_ttl fr_ip.fi_ttl +#define fr_tos fr_ip.fi_tos +#define fr_dst fr_ip.fi_dst +#define fr_src fr_ip.fi_src +#define fr_dmsk fr_mip.fi_dst +#define fr_smsk fr_mip.fi_src + +#ifndef offsetof +#define offsetof(t,m) (int)((&((t *)0L)->m)) +#endif +#define FR_CMPSIZ (sizeof(struct frentry) - offsetof(frentry_t, fr_ip)) + +/* + * fr_flags + */ +#define FR_BLOCK 0x00001 /* do not allow packet to pass */ +#define FR_PASS 0x00002 /* allow packet to pass */ +#define FR_OUTQUE 0x00004 /* outgoing packets */ +#define FR_INQUE 0x00008 /* ingoing packets */ +#define FR_LOG 0x00010 /* Log */ +#define FR_LOGB 0x00011 /* Log-fail */ +#define FR_LOGP 0x00012 /* Log-pass */ +#define FR_LOGBODY 0x00020 /* Log the body */ +#define FR_LOGFIRST 0x00040 /* Log the first byte if state held */ +#define FR_RETRST 0x00080 /* Return TCP RST packet - reset connection */ +#define FR_RETICMP 0x00100 /* Return ICMP unreachable packet */ +#define FR_FAKEICMP 0x00180 /* Return ICMP unreachable with fake source */ +#define FR_NOMATCH 0x00200 /* no match occured */ +#define FR_ACCOUNT 0x00400 /* count packet bytes */ +#define FR_KEEPFRAG 0x00800 /* keep fragment information */ +#define FR_KEEPSTATE 0x01000 /* keep `connection' state information */ +#define FR_INACTIVE 0x02000 +#define FR_QUICK 0x04000 /* match & stop processing list */ +#define FR_FASTROUTE 0x08000 /* bypass normal routing */ +#define FR_CALLNOW 0x10000 /* call another function (fr_func) if matches */ +#define FR_DUP 0x20000 /* duplicate packet */ +#define FR_LOGORBLOCK 0x40000 /* block the packet if it can't be logged */ +#define FR_NOTSRCIP 0x80000 /* not the src IP# */ +#define FR_NOTDSTIP 0x100000 /* not the dst IP# */ +#define FR_AUTH 0x200000 /* use authentication */ +#define FR_PREAUTH 0x400000 /* require preauthentication */ +#define FR_DONTCACHE 0x800000 /* don't cache the result */ + +#define FR_LOGMASK (FR_LOG|FR_LOGP|FR_LOGB) +#define FR_RETMASK (FR_RETICMP|FR_RETRST|FR_FAKEICMP) + +/* + * These correspond to #define's for FI_* and are stored in fr_flags + */ +#define FF_OPTIONS 0x01000000 +#define FF_TCPUDP 0x02000000 +#define FF_FRAG 0x04000000 +#define FF_SHORT 0x08000000 +/* + * recognized flags for SIOCGETFF and SIOCSETFF, and get put in fr_flags + */ +#define FF_LOGPASS 0x10000000 +#define FF_LOGBLOCK 0x20000000 +#define FF_LOGNOMATCH 0x40000000 +#define FF_LOGGING (FF_LOGPASS|FF_LOGBLOCK|FF_LOGNOMATCH) +#define FF_BLOCKNONIP 0x80000000 /* Solaris2 Only */ + +#define FR_NONE 0 +#define FR_EQUAL 1 +#define FR_NEQUAL 2 +#define FR_LESST 3 +#define FR_GREATERT 4 +#define FR_LESSTE 5 +#define FR_GREATERTE 6 +#define FR_OUTRANGE 7 +#define FR_INRANGE 8 + +typedef struct filterstats { + u_long fr_pass; /* packets allowed */ + u_long fr_block; /* packets denied */ + u_long fr_nom; /* packets which don't match any rule */ + u_long fr_ppkl; /* packets allowed and logged */ + u_long fr_bpkl; /* packets denied and logged */ + u_long fr_npkl; /* packets unmatched and logged */ + u_long fr_pkl; /* packets logged */ + u_long fr_skip; /* packets to be logged but buffer full */ + u_long fr_ret; /* packets for which a return is sent */ + u_long fr_acct; /* packets for which counting was performed */ + u_long fr_bnfr; /* bad attempts to allocate fragment state */ + u_long fr_nfr; /* new fragment state kept */ + u_long fr_cfr; /* add new fragment state but complete pkt */ + u_long fr_bads; /* bad attempts to allocate packet state */ + u_long fr_ads; /* new packet state kept */ + u_long fr_chit; /* cached hit */ + u_long fr_tcpbad; /* TCP checksum check failures */ + u_long fr_pull[2]; /* good and bad pullup attempts */ +#if SOLARIS + u_long fr_notdata; /* PROTO/PCPROTO that have no data */ + u_long fr_nodata; /* mblks that have no data */ + u_long fr_bad; /* bad IP packets to the filter */ + u_long fr_notip; /* packets passed through no on ip queue */ + u_long fr_drop; /* packets dropped - no info for them! */ +#endif +} filterstats_t; + +/* + * For SIOCGETFS + */ +typedef struct friostat { + struct filterstats f_st[2]; + struct frentry *f_fin[2]; + struct frentry *f_fout[2]; + struct frentry *f_acctin[2]; + struct frentry *f_acctout[2]; + struct frentry *f_auth; + struct frgroup *f_groups[3][2]; + u_long f_froute[2]; + int f_active; /* 1 or 0 - active rule set */ + int f_defpass; /* default pass - from fr_pass */ + int f_running; /* 1 if running, else 0 */ + int f_logging; /* 1 if enabled, else 0 */ + char f_version[32]; /* version string */ +} friostat_t; + +typedef struct optlist { + u_short ol_val; + int ol_bit; +} optlist_t; + + +/* + * Group list structure. + */ +typedef struct frgroup { + u_short fg_num; + struct frgroup *fg_next; + struct frentry *fg_head; + struct frentry **fg_start; +} frgroup_t; + + +/* + * Log structure. Each packet header logged is prepended by one of these. + * Following this in the log records read from the device will be an ipflog + * structure which is then followed by any packet data. + */ +typedef struct iplog { + u_32_t ipl_magic; + u_int ipl_count; + u_long ipl_sec; + u_long ipl_usec; + size_t ipl_dsize; + struct iplog *ipl_next; +} iplog_t; + +#define IPL_MAGIC 0x49504c4d /* 'IPLM' */ + +typedef struct ipflog { +#if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199603)) || \ + (defined(OpenBSD) && (OpenBSD >= 199603)) + u_char fl_ifname[IFNAMSIZ]; +#else + u_int fl_unit; + u_char fl_ifname[4]; +#endif + u_char fl_plen; /* extra data after hlen */ + u_char fl_hlen; /* length of IP headers saved */ + u_short fl_rule; /* assume never more than 64k rules, total */ + u_short fl_group; + u_short fl_loglevel; /* syslog log level */ + u_32_t fl_flags; + u_32_t fl_lflags; +} ipflog_t; + + +#ifndef ICMP_UNREACH_FILTER +# define ICMP_UNREACH_FILTER 13 +#endif + +#ifndef IPF_LOGGING +# define IPF_LOGGING 0 +#endif +#ifndef IPF_DEFAULT_PASS +# define IPF_DEFAULT_PASS FR_PASS +#endif + +#define IPMINLEN(i, h) ((i)->ip_len >= ((i)->ip_hl * 4 + sizeof(struct h))) +#define IPLLOGSIZE 8192 + +/* + * Device filenames for reading log information. Use ipf on Solaris2 because + * ipl is already a name used by something else. + */ +#ifndef IPL_NAME +# if SOLARIS +# define IPL_NAME "/dev/ipf" +# else +# define IPL_NAME "/dev/ipl" +# endif +#endif +#define IPL_NAT IPNAT_NAME +#define IPL_STATE IPSTATE_NAME +#define IPL_AUTH IPAUTH_NAME + +#define IPL_LOGIPF 0 /* Minor device #'s for accessing logs */ +#define IPL_LOGNAT 1 +#define IPL_LOGSTATE 2 +#define IPL_LOGAUTH 3 +#define IPL_LOGMAX 3 + +#if !defined(CDEV_MAJOR) && defined (__FreeBSD_version) && \ + (__FreeBSD_version >= 220000) +# define CDEV_MAJOR 79 +#endif + +/* + * Post NetBSD 1.2 has the PFIL interface for packet filters. This turns + * on those hooks. We don't need any special mods in non-IP Filter code + * with this! + */ +#if (defined(NetBSD) && (NetBSD > 199609) && (NetBSD <= 1991011)) || \ + (defined(NetBSD1_2) && NetBSD1_2 > 1) +# if (NetBSD >= 199905) +# define PFIL_HOOKS +# endif +# ifdef PFIL_HOOKS +# define NETBSD_PF +# endif +#endif + + +#ifndef _KERNEL +extern int fr_check __P((ip_t *, int, void *, int, mb_t **)); +extern int (*fr_checkp) __P((ip_t *, int, void *, int, mb_t **)); +extern int send_reset __P((ip_t *, struct ifnet *)); +extern int icmp_error __P((ip_t *, struct ifnet *)); +extern int ipf_log __P((void)); +extern int ipfr_fastroute __P((ip_t *, fr_info_t *, frdest_t *)); +extern struct ifnet *get_unit __P((char *)); +# if defined(__NetBSD__) || defined(__OpenBSD__) || \ + (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 300000) +extern int iplioctl __P((dev_t, u_long, caddr_t, int)); +# else +extern int iplioctl __P((dev_t, int, caddr_t, int)); +# endif +extern int iplopen __P((dev_t, int)); +extern int iplclose __P((dev_t, int)); +#else /* #ifndef _KERNEL */ +# if defined(__NetBSD__) && defined(PFIL_HOOKS) +extern void ipfilterattach __P((int)); +# endif +extern int iplattach __P((void)); +extern int ipl_enable __P((void)); +extern int ipl_disable __P((void)); +extern void ipflog_init __P((void)); +extern int ipflog_clear __P((minor_t)); +extern int ipflog_read __P((minor_t, struct uio *)); +extern int ipflog __P((u_int, ip_t *, fr_info_t *, mb_t *)); +extern int ipllog __P((int, fr_info_t *, void **, size_t *, int *, int)); +# if SOLARIS +extern int fr_check __P((ip_t *, int, void *, int, qif_t *, mb_t **)); +extern int (*fr_checkp) __P((ip_t *, int, void *, + int, qif_t *, mb_t **)); +extern int icmp_error __P((ip_t *, int, int, qif_t *, struct in_addr)); +# if SOLARIS2 >= 7 +extern int iplioctl __P((dev_t, int, intptr_t, int, cred_t *, int *)); +# else +extern int iplioctl __P((dev_t, int, int *, int, cred_t *, int *)); +# endif +extern int iplopen __P((dev_t *, int, int, cred_t *)); +extern int iplclose __P((dev_t, int, int, cred_t *)); +extern int ipfsync __P((void)); +extern int send_reset __P((fr_info_t *, ip_t *, qif_t *)); +extern int ipfr_fastroute __P((qif_t *, ip_t *, mblk_t *, mblk_t **, + fr_info_t *, frdest_t *)); +extern void copyin_mblk __P((mblk_t *, size_t, size_t, char *)); +extern void copyout_mblk __P((mblk_t *, size_t, size_t, char *)); +extern int fr_qin __P((queue_t *, mblk_t *)); +extern int fr_qout __P((queue_t *, mblk_t *)); +# ifdef IPFILTER_LOG +extern int iplread __P((dev_t, struct uio *, cred_t *)); +# endif +# else /* SOLARIS */ +extern int fr_check __P((ip_t *, int, void *, int, mb_t **)); +extern int (*fr_checkp) __P((ip_t *, int, void *, int, mb_t **)); +# ifdef linux +extern int send_reset __P((tcpiphdr_t *, struct ifnet *)); +# else +extern int send_reset __P((fr_info_t *, struct ip *)); +extern int send_icmp_err __P((ip_t *, int, int, void *, struct in_addr)); +# endif +extern int ipfr_fastroute __P((mb_t *, fr_info_t *, frdest_t *)); +extern size_t mbufchainlen __P((mb_t *)); +# ifdef __sgi +# include <sys/cred.h> +extern int iplioctl __P((dev_t, int, caddr_t, int, cred_t *, int *)); +extern int iplopen __P((dev_t *, int, int, cred_t *)); +extern int iplclose __P((dev_t, int, int, cred_t *)); +extern int iplread __P((dev_t, struct uio *, cred_t *)); +extern int ipfsync __P((void)); +extern int ipfilter_sgi_attach __P((void)); +extern void ipfilter_sgi_detach __P((void)); +extern void ipfilter_sgi_intfsync __P((void)); +# else +# ifdef IPFILTER_LKM +extern int iplidentify __P((char *)); +# endif +# if (_BSDI_VERSION >= 199510) || (__FreeBSD_version >= 220000) || \ + (NetBSD >= 199511) || defined(__OpenBSD__) +# if defined(__NetBSD__) || (_BSDI_VERSION >= 199701) || \ + defined(__OpenBSD__) || (__FreeBSD_version >= 300000) +extern int iplioctl __P((dev_t, u_long, caddr_t, int, struct proc *)); +# else +extern int iplioctl __P((dev_t, int, caddr_t, int, struct proc *)); +# endif +extern int iplopen __P((dev_t, int, int, struct proc *)); +extern int iplclose __P((dev_t, int, int, struct proc *)); +# else +# ifndef linux +extern int iplopen __P((dev_t, int)); +extern int iplclose __P((dev_t, int)); +extern int iplioctl __P((dev_t, int, caddr_t, int)); +# else +extern int iplioctl(struct inode *, struct file *, u_int, u_long); +extern int iplopen __P((struct inode *, struct file *)); +extern void iplclose __P((struct inode *, struct file *)); +# endif /* !linux */ +# endif /* (_BSDI_VERSION >= 199510) */ +# if BSD >= 199306 +extern int iplread __P((dev_t, struct uio *, int)); +# else +# ifndef linux +extern int iplread __P((dev_t, struct uio *)); +# else +extern int iplread(struct inode *, struct file *, char *, int); +# endif /* !linux */ +# endif /* BSD >= 199306 */ +# endif /* __ sgi */ +# endif /* SOLARIS */ +#endif /* #ifndef _KERNEL */ + +extern void fixskip __P((frentry_t **, frentry_t *, int)); +extern int countbits __P((u_32_t)); +extern int ipldetach __P((void)); +extern u_short fr_tcpsum __P((mb_t *, ip_t *, tcphdr_t *)); +extern int fr_scanlist __P((u_32_t, ip_t *, fr_info_t *, void *)); +extern u_short ipf_cksum __P((u_short *, int)); +extern int fr_copytolog __P((int, char *, int)); +extern void fr_forgetifp __P((void *)); +extern int frflush __P((minor_t, int)); +extern void frsync __P((void)); +extern frgroup_t *fr_addgroup __P((u_int, frentry_t *, minor_t, int)); +extern frgroup_t *fr_findgroup __P((u_int, u_32_t, minor_t, int, frgroup_t ***)); +extern void fr_delgroup __P((u_int, u_32_t, minor_t, int)); +extern void fr_makefrip __P((int, ip_t *, fr_info_t *)); +extern int fr_ifpaddr __P((void *, struct in_addr *)); +extern char *memstr __P((char *, char *, int, int)); +extern int ipl_unreach; +extern int ipl_inited; +extern u_long ipl_frouteok[2]; +extern int fr_pass; +extern int fr_flags; +extern int fr_active; +extern fr_info_t frcache[2]; +extern char ipfilter_version[]; +#ifdef IPFILTER_LOG +extern iplog_t **iplh[IPL_LOGMAX+1], *iplt[IPL_LOGMAX+1]; +extern size_t iplused[IPL_LOGMAX + 1]; +#endif +extern struct frentry *ipfilter[2][2], *ipacct[2][2]; +extern struct frgroup *ipfgroups[3][2]; +extern struct filterstats frstats[]; + +#endif /* __IP_FIL_H__ */ diff --git a/sys/contrib/ipfilter/netinet/ip_frag.c b/sys/contrib/ipfilter/netinet/ip_frag.c new file mode 100644 index 0000000..af07c3d --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_frag.c @@ -0,0 +1,525 @@ +/* + * Copyright (C) 1993-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + */ +#if !defined(lint) +static const char sccsid[] = "@(#)ip_frag.c 1.11 3/24/96 (C) 1993-1995 Darren Reed"; +/*static const char rcsid[] = "@(#)$Id: ip_frag.c,v 2.4.2.3 1999/09/18 15:03:54 darrenr Exp $";*/ +static const char rcsid[] = "@(#)$FreeBSD$"; +#endif + +#if defined(KERNEL) && !defined(_KERNEL) +# define _KERNEL +#endif + +#include <sys/errno.h> +#include <sys/types.h> +#include <sys/param.h> +#include <sys/time.h> +#include <sys/file.h> +#if !defined(_KERNEL) && !defined(KERNEL) +# include <stdio.h> +# include <string.h> +# include <stdlib.h> +#endif +#if defined(KERNEL) && (__FreeBSD_version >= 220000) +# include <sys/filio.h> +# include <sys/fcntl.h> +#else +# include <sys/ioctl.h> +#endif +#include <sys/uio.h> +#ifndef linux +# include <sys/protosw.h> +#endif +#include <sys/socket.h> +#if defined(_KERNEL) && !defined(linux) +# include <sys/systm.h> +#endif +#if !defined(__SVR4) && !defined(__svr4__) +# if defined(_KERNEL) && !defined(__sgi) +# include <sys/kernel.h> +# endif +# ifndef linux +# include <sys/mbuf.h> +# endif +#else +# include <sys/byteorder.h> +# ifdef _KERNEL +# include <sys/dditypes.h> +# endif +# include <sys/stream.h> +# include <sys/kmem.h> +#endif +#include <net/if.h> +#ifdef sun +# include <net/af.h> +#endif +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#ifndef linux +# include <netinet/ip_var.h> +#endif +#include <netinet/tcp.h> +#include <netinet/udp.h> +#include <netinet/ip_icmp.h> +#include "netinet/ip_compat.h" +#include <netinet/tcpip.h> +#include "netinet/ip_fil.h" +#include "netinet/ip_proxy.h" +#include "netinet/ip_nat.h" +#include "netinet/ip_frag.h" +#include "netinet/ip_state.h" +#include "netinet/ip_auth.h" +#if (__FreeBSD_version >= 300000) +# include <sys/malloc.h> +# if (defined(KERNEL) || defined(_KERNEL)) +# ifndef IPFILTER_LKM +# include <sys/libkern.h> +# include <sys/systm.h> +# endif +extern struct callout_handle ipfr_slowtimer_ch; +# endif +#endif + + +static ipfr_t *ipfr_heads[IPFT_SIZE]; +static ipfr_t *ipfr_nattab[IPFT_SIZE]; +static ipfrstat_t ipfr_stats; +static int ipfr_inuse = 0; + +int fr_ipfrttl = 120; /* 60 seconds */ + +#ifdef _KERNEL +# if SOLARIS2 >= 7 +extern timeout_id_t ipfr_timer_id; +# else +extern int ipfr_timer_id; +# endif +#endif +#if (SOLARIS || defined(__sgi)) && defined(_KERNEL) +extern KRWLOCK_T ipf_frag, ipf_natfrag, ipf_nat, ipf_mutex; +# if SOLARIS +extern KRWLOCK_T ipf_solaris; +# else +KRWLOCK_T ipf_solaris; +# endif +extern kmutex_t ipf_rw; +#endif + + +static ipfr_t *ipfr_new __P((ip_t *, fr_info_t *, u_int, ipfr_t **)); +static ipfr_t *ipfr_lookup __P((ip_t *, fr_info_t *, ipfr_t **)); +static void ipfr_delete __P((ipfr_t *)); + + +ipfrstat_t *ipfr_fragstats() +{ + ipfr_stats.ifs_table = ipfr_heads; + ipfr_stats.ifs_nattab = ipfr_nattab; + ipfr_stats.ifs_inuse = ipfr_inuse; + return &ipfr_stats; +} + + +/* + * add a new entry to the fragment cache, registering it as having come + * through this box, with the result of the filter operation. + */ +static ipfr_t *ipfr_new(ip, fin, pass, table) +ip_t *ip; +fr_info_t *fin; +u_int pass; +ipfr_t *table[]; +{ + ipfr_t **fp, *fra, frag; + u_int idx; + + frag.ipfr_p = ip->ip_p; + idx = ip->ip_p; + frag.ipfr_id = ip->ip_id; + idx += ip->ip_id; + frag.ipfr_tos = ip->ip_tos; + frag.ipfr_src.s_addr = ip->ip_src.s_addr; + idx += ip->ip_src.s_addr; + frag.ipfr_dst.s_addr = ip->ip_dst.s_addr; + idx += ip->ip_dst.s_addr; + idx *= 127; + idx %= IPFT_SIZE; + + /* + * first, make sure it isn't already there... + */ + for (fp = &table[idx]; (fra = *fp); fp = &fra->ipfr_next) + if (!bcmp((char *)&frag.ipfr_src, (char *)&fra->ipfr_src, + IPFR_CMPSZ)) { + ATOMIC_INC(ipfr_stats.ifs_exists); + return NULL; + } + + /* + * allocate some memory, if possible, if not, just record that we + * failed to do so. + */ + KMALLOC(fra, ipfr_t *); + if (fra == NULL) { + ATOMIC_INC(ipfr_stats.ifs_nomem); + return NULL; + } + + if ((fra->ipfr_rule = fin->fin_fr) != NULL) { + ATOMIC_INC(fin->fin_fr->fr_ref); + } + + + /* + * Instert the fragment into the fragment table, copy the struct used + * in the search using bcopy rather than reassign each field. + * Set the ttl to the default and mask out logging from "pass" + */ + if ((fra->ipfr_next = table[idx])) + table[idx]->ipfr_prev = fra; + fra->ipfr_prev = NULL; + fra->ipfr_data = NULL; + table[idx] = fra; + bcopy((char *)&frag.ipfr_src, (char *)&fra->ipfr_src, IPFR_CMPSZ); + fra->ipfr_ttl = fr_ipfrttl; + /* + * Compute the offset of the expected start of the next packet. + */ + fra->ipfr_off = (ip->ip_off & IP_OFFMASK) + (fin->fin_dlen >> 3); + ATOMIC_INC(ipfr_stats.ifs_new); + ATOMIC_INC(ipfr_inuse); + return fra; +} + + +int ipfr_newfrag(ip, fin, pass) +ip_t *ip; +fr_info_t *fin; +u_int pass; +{ + ipfr_t *ipf; + + WRITE_ENTER(&ipf_frag); + ipf = ipfr_new(ip, fin, pass, ipfr_heads); + RWLOCK_EXIT(&ipf_frag); + return ipf ? 0 : -1; +} + + +int ipfr_nat_newfrag(ip, fin, pass, nat) +ip_t *ip; +fr_info_t *fin; +u_int pass; +nat_t *nat; +{ + ipfr_t *ipf; + + WRITE_ENTER(&ipf_natfrag); + ipf = ipfr_new(ip, fin, pass, ipfr_nattab); + if (ipf != NULL) { + ipf->ipfr_data = nat; + nat->nat_data = ipf; + } + RWLOCK_EXIT(&ipf_natfrag); + return ipf ? 0 : -1; +} + + +/* + * check the fragment cache to see if there is already a record of this packet + * with its filter result known. + */ +static ipfr_t *ipfr_lookup(ip, fin, table) +ip_t *ip; +fr_info_t *fin; +ipfr_t *table[]; +{ + ipfr_t *f, frag; + u_int idx; + + /* + * For fragments, we record protocol, packet id, TOS and both IP#'s + * (these should all be the same for all fragments of a packet). + * + * build up a hash value to index the table with. + */ + frag.ipfr_p = ip->ip_p; + idx = ip->ip_p; + frag.ipfr_id = ip->ip_id; + idx += ip->ip_id; + frag.ipfr_tos = ip->ip_tos; + frag.ipfr_src.s_addr = ip->ip_src.s_addr; + idx += ip->ip_src.s_addr; + frag.ipfr_dst.s_addr = ip->ip_dst.s_addr; + idx += ip->ip_dst.s_addr; + idx *= 127; + idx %= IPFT_SIZE; + + /* + * check the table, careful to only compare the right amount of data + */ + for (f = table[idx]; f; f = f->ipfr_next) + if (!bcmp((char *)&frag.ipfr_src, (char *)&f->ipfr_src, + IPFR_CMPSZ)) { + u_short atoff, off; + + if (f != table[idx]) { + /* + * move fragment info. to the top of the list + * to speed up searches. + */ + if ((f->ipfr_prev->ipfr_next = f->ipfr_next)) + f->ipfr_next->ipfr_prev = f->ipfr_prev; + f->ipfr_next = table[idx]; + table[idx]->ipfr_prev = f; + f->ipfr_prev = NULL; + table[idx] = f; + } + off = ip->ip_off; + atoff = off + (fin->fin_dlen >> 3); + /* + * If we've follwed the fragments, and this is the + * last (in order), shrink expiration time. + */ + if ((off & IP_OFFMASK) == f->ipfr_off) { + if (!(off & IP_MF)) + f->ipfr_ttl = 1; + else + f->ipfr_off = atoff; + } + ATOMIC_INC(ipfr_stats.ifs_hits); + return f; + } + return NULL; +} + + +/* + * functional interface for NAT lookups of the NAT fragment cache + */ +nat_t *ipfr_nat_knownfrag(ip, fin) +ip_t *ip; +fr_info_t *fin; +{ + nat_t *nat; + ipfr_t *ipf; + + READ_ENTER(&ipf_natfrag); + ipf = ipfr_lookup(ip, fin, ipfr_nattab); + if (ipf != NULL) { + nat = ipf->ipfr_data; + /* + * This is the last fragment for this packet. + */ + if ((ipf->ipfr_ttl == 1) && (nat != NULL)) { + nat->nat_data = NULL; + ipf->ipfr_data = NULL; + } + } else + nat = NULL; + RWLOCK_EXIT(&ipf_natfrag); + return nat; +} + + +/* + * functional interface for normal lookups of the fragment cache + */ +frentry_t *ipfr_knownfrag(ip, fin) +ip_t *ip; +fr_info_t *fin; +{ + frentry_t *fr = NULL; + ipfr_t *fra; + + READ_ENTER(&ipf_frag); + fra = ipfr_lookup(ip, fin, ipfr_heads); + if (fra != NULL) + fr = fra->ipfr_rule; + RWLOCK_EXIT(&ipf_frag); + return fr; +} + + +/* + * forget any references to this external object. + */ +void ipfr_forget(nat) +void *nat; +{ + ipfr_t *fr; + int idx; + + WRITE_ENTER(&ipf_natfrag); + for (idx = IPFT_SIZE - 1; idx >= 0; idx--) + for (fr = ipfr_heads[idx]; fr; fr = fr->ipfr_next) + if (fr->ipfr_data == nat) + fr->ipfr_data = NULL; + + RWLOCK_EXIT(&ipf_natfrag); +} + + +static void ipfr_delete(fra) +ipfr_t *fra; +{ + frentry_t *fr; + + fr = fra->ipfr_rule; + if (fr != NULL) { + ATOMIC_DEC(fr->fr_ref); + if (fr->fr_ref == 0) + KFREE(fr); + } + if (fra->ipfr_prev) + fra->ipfr_prev->ipfr_next = fra->ipfr_next; + if (fra->ipfr_next) + fra->ipfr_next->ipfr_prev = fra->ipfr_prev; + KFREE(fra); +} + + +/* + * Free memory in use by fragment state info. kept. + */ +void ipfr_unload() +{ + ipfr_t **fp, *fra; + nat_t *nat; + int idx; + + WRITE_ENTER(&ipf_frag); + for (idx = IPFT_SIZE - 1; idx >= 0; idx--) + for (fp = &ipfr_heads[idx]; (fra = *fp); ) { + *fp = fra->ipfr_next; + ipfr_delete(fra); + } + RWLOCK_EXIT(&ipf_frag); + + WRITE_ENTER(&ipf_nat); + WRITE_ENTER(&ipf_natfrag); + for (idx = IPFT_SIZE - 1; idx >= 0; idx--) + for (fp = &ipfr_nattab[idx]; (fra = *fp); ) { + *fp = fra->ipfr_next; + nat = fra->ipfr_data; + if (nat != NULL) { + if (nat->nat_data == fra) + nat->nat_data = NULL; + } + ipfr_delete(fra); + } + RWLOCK_EXIT(&ipf_natfrag); + RWLOCK_EXIT(&ipf_nat); +} + + +#ifdef _KERNEL +/* + * Slowly expire held state for fragments. Timeouts are set * in expectation + * of this being called twice per second. + */ +# if (BSD >= 199306) || SOLARIS || defined(__sgi) +# if defined(SOLARIS2) && (SOLARIS2 < 7) +void ipfr_slowtimer() +# else +void ipfr_slowtimer __P((void *ptr)) +# endif +# else +int ipfr_slowtimer() +# endif +{ + ipfr_t **fp, *fra; + nat_t *nat; + int idx; +#if defined(_KERNEL) +# if !SOLARIS + int s; +# else + extern int fr_running; + + if (fr_running <= 0) + return; +# endif +#endif + + READ_ENTER(&ipf_solaris); +#ifdef __sgi + ipfilter_sgi_intfsync(); +#endif + + SPL_NET(s); + WRITE_ENTER(&ipf_frag); + + /* + * Go through the entire table, looking for entries to expire, + * decreasing the ttl by one for each entry. If it reaches 0, + * remove it from the chain and free it. + */ + for (idx = IPFT_SIZE - 1; idx >= 0; idx--) + for (fp = &ipfr_heads[idx]; (fra = *fp); ) { + --fra->ipfr_ttl; + if (fra->ipfr_ttl == 0) { + *fp = fra->ipfr_next; + ipfr_delete(fra); + ATOMIC_INC(ipfr_stats.ifs_expire); + ATOMIC_DEC(ipfr_inuse); + } else + fp = &fra->ipfr_next; + } + RWLOCK_EXIT(&ipf_frag); + + /* + * Same again for the NAT table, except that if the structure also + * still points to a NAT structure, and the NAT structure points back + * at the one to be free'd, NULL the reference from the NAT struct. + * NOTE: We need to grab both mutex's early, and in this order so as + * to prevent a deadlock if both try to expire at the same time. + */ + WRITE_ENTER(&ipf_nat); + WRITE_ENTER(&ipf_natfrag); + for (idx = IPFT_SIZE - 1; idx >= 0; idx--) + for (fp = &ipfr_nattab[idx]; (fra = *fp); ) { + --fra->ipfr_ttl; + if (fra->ipfr_ttl == 0) { + ATOMIC_INC(ipfr_stats.ifs_expire); + ATOMIC_DEC(ipfr_inuse); + nat = fra->ipfr_data; + if (nat != NULL) { + if (nat->nat_data == fra) + nat->nat_data = NULL; + } + *fp = fra->ipfr_next; + ipfr_delete(fra); + } else + fp = &fra->ipfr_next; + } + RWLOCK_EXIT(&ipf_natfrag); + RWLOCK_EXIT(&ipf_nat); + SPL_X(s); + fr_timeoutstate(); + ip_natexpire(); + fr_authexpire(); +# if SOLARIS + ipfr_timer_id = timeout(ipfr_slowtimer, NULL, drv_usectohz(500000)); +# else +# ifndef linux +# if (__FreeBSD_version >= 300000) + ipfr_slowtimer_ch = timeout(ipfr_slowtimer, NULL, hz/2); +# else + timeout(ipfr_slowtimer, NULL, hz/2); +# endif +# endif +# if (BSD < 199306) && !defined(__sgi) + return 0; +# endif +# endif + RWLOCK_EXIT(&ipf_solaris); +} +#endif /* defined(_KERNEL) */ diff --git a/sys/contrib/ipfilter/netinet/ip_frag.h b/sys/contrib/ipfilter/netinet/ip_frag.h new file mode 100644 index 0000000..0494e9c --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_frag.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 1993-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + * + * @(#)ip_frag.h 1.5 3/24/96 + * $Id: ip_frag.h,v 2.2 1999/08/06 06:26:38 darrenr Exp $ + * $FreeBSD$ + */ + +#ifndef __IP_FRAG_H__ +#define __IP_FRAG_H__ + +#define IPFT_SIZE 257 + +typedef struct ipfr { + struct ipfr *ipfr_next, *ipfr_prev; + void *ipfr_data; + struct in_addr ipfr_src; + struct in_addr ipfr_dst; + u_short ipfr_id; + u_char ipfr_p; + u_char ipfr_tos; + u_short ipfr_off; + u_short ipfr_ttl; + frentry_t *ipfr_rule; +} ipfr_t; + + +typedef struct ipfrstat { + u_long ifs_exists; /* add & already exists */ + u_long ifs_nomem; + u_long ifs_new; + u_long ifs_hits; + u_long ifs_expire; + u_long ifs_inuse; + struct ipfr **ifs_table; + struct ipfr **ifs_nattab; +} ipfrstat_t; + +#define IPFR_CMPSZ (4 + 4 + 2 + 1 + 1) + +extern int fr_ipfrttl; +extern ipfrstat_t *ipfr_fragstats __P((void)); +extern int ipfr_newfrag __P((ip_t *, fr_info_t *, u_int)); +extern int ipfr_nat_newfrag __P((ip_t *, fr_info_t *, u_int, struct nat *)); +extern nat_t *ipfr_nat_knownfrag __P((ip_t *, fr_info_t *)); +extern frentry_t *ipfr_knownfrag __P((ip_t *, fr_info_t *)); +extern void ipfr_forget __P((void *)); +extern void ipfr_unload __P((void)); + +#if (BSD >= 199306) || SOLARIS || defined(__sgi) +# if defined(SOLARIS2) && (SOLARIS2 < 7) +extern void ipfr_slowtimer __P((void)); +# else +extern void ipfr_slowtimer __P((void *)); +# endif +#else +extern int ipfr_slowtimer __P((void)); +#endif + +#endif /* __IP_FIL_H__ */ diff --git a/sys/contrib/ipfilter/netinet/ip_ftp_pxy.c b/sys/contrib/ipfilter/netinet/ip_ftp_pxy.c new file mode 100644 index 0000000..0600617 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_ftp_pxy.c @@ -0,0 +1,460 @@ +/* + * Simple FTP transparent proxy for in-kernel use. For use with the NAT + * code. + * + * $Id$ + * $FreeBSD$ + */ +#if SOLARIS && defined(_KERNEL) +extern kmutex_t ipf_rw; +#endif + +#define isdigit(x) ((x) >= '0' && (x) <= '9') + +#define IPF_FTP_PROXY + +#define IPF_MINPORTLEN 18 +#define IPF_MAXPORTLEN 30 +#define IPF_MIN227LEN 39 +#define IPF_MAX227LEN 51 + + +int ippr_ftp_init __P((void)); +int ippr_ftp_out __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *)); +int ippr_ftp_in __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *)); +int ippr_ftp_portmsg __P((fr_info_t *, ip_t *, nat_t *)); +int ippr_ftp_pasvmsg __P((fr_info_t *, ip_t *, nat_t *)); + +u_short ipf_ftp_atoi __P((char **)); + +static frentry_t natfr; + + +/* + * Initialize local structures. + */ +int ippr_ftp_init() +{ + bzero((char *)&natfr, sizeof(natfr)); + natfr.fr_ref = 1; + natfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE; + return 0; +} + + +/* + * ipf_ftp_atoi - implement a version of atoi which processes numbers in + * pairs separated by commas (which are expected to be in the range 0 - 255), + * returning a 16 bit number combining either side of the , as the MSB and + * LSB. + */ +u_short ipf_ftp_atoi(ptr) +char **ptr; +{ + register char *s = *ptr, c; + register u_char i = 0, j = 0; + + while ((c = *s++) && isdigit(c)) { + i *= 10; + i += c - '0'; + } + if (c != ',') { + *ptr = NULL; + return 0; + } + while ((c = *s++) && isdigit(c)) { + j *= 10; + j += c - '0'; + } + *ptr = s; + return (i << 8) | j; +} + + +int ippr_ftp_portmsg(fin, ip, nat) +fr_info_t *fin; +ip_t *ip; +nat_t *nat; +{ + char portbuf[IPF_MAXPORTLEN + 1], newbuf[IPF_MAXPORTLEN + 1], *s; + tcphdr_t *tcp, tcph, *tcp2 = &tcph; + size_t nlen = 0, dlen, olen; + u_short a5, a6, sp, dp; + u_int a1, a2, a3, a4; + struct in_addr swip; + int off, inc = 0; + fr_info_t fi; + nat_t *ipn; + mb_t *m; +#if SOLARIS + mb_t *m1; +#endif + + tcp = (tcphdr_t *)fin->fin_dp; + bzero(portbuf, sizeof(portbuf)); + off = (ip->ip_hl << 2) + (tcp->th_off << 2); + +#if SOLARIS + m = fin->fin_qfm; + + dlen = msgdsize(m) - off; + if (dlen > 0) + copyout_mblk(m, off, MIN(sizeof(portbuf), dlen), portbuf); +#else + m = *(mb_t **)fin->fin_mp; + + dlen = mbufchainlen(m) - off; + if (dlen > 0) + m_copydata(m, off, MIN(sizeof(portbuf), dlen), portbuf); +#endif + if (dlen == 0) + return 0; + portbuf[sizeof(portbuf) - 1] = '\0'; + *newbuf = '\0'; + if (!strncmp(portbuf, "PORT ", 5)) { + if (dlen < IPF_MINPORTLEN) + return 0; + } else + return 0; + + /* + * Skip the PORT command + space + */ + s = portbuf + 5; + /* + * Pick out the address components, two at a time. + */ + a1 = ipf_ftp_atoi(&s); + if (!s) + return 0; + a2 = ipf_ftp_atoi(&s); + if (!s) + return 0; + + /* + * check that IP address in the PORT/PASV reply is the same as the + * sender of the command - prevents using PORT for port scanning. + */ + a1 <<= 16; + a1 |= a2; + if (a1 != ntohl(nat->nat_inip.s_addr)) + return 0; + + a5 = ipf_ftp_atoi(&s); + if (!s) + return 0; + if (*s == ')') + s++; + + /* + * check for CR-LF at the end. + */ + if (*s == '\n') + s--; + if ((*s == '\r') && (*(s + 1) == '\n')) { + s += 2; + a6 = a5 & 0xff; + } else + return 0; + a5 >>= 8; + /* + * Calculate new address parts for PORT command + */ + a1 = ntohl(ip->ip_src.s_addr); + a2 = (a1 >> 16) & 0xff; + a3 = (a1 >> 8) & 0xff; + a4 = a1 & 0xff; + a1 >>= 24; + olen = s - portbuf; + (void) snprintf(newbuf, sizeof(newbuf), "%s %u,%u,%u,%u,%u,%u\r\n", + "PORT", a1, a2, a3, a4, a5, a6); + + nlen = strlen(newbuf); + inc = nlen - olen; +#if SOLARIS + for (m1 = m; m1->b_cont; m1 = m1->b_cont) + ; + if ((inc > 0) && (m1->b_datap->db_lim - m1->b_wptr < inc)) { + mblk_t *nm; + + /* alloc enough to keep same trailer space for lower driver */ + nm = allocb(nlen, BPRI_MED); + PANIC((!nm),("ippr_ftp_out: allocb failed")); + + nm->b_band = m1->b_band; + nm->b_wptr += nlen; + + m1->b_wptr -= olen; + PANIC((m1->b_wptr < m1->b_rptr), + ("ippr_ftp_out: cannot handle fragmented data block")); + + linkb(m1, nm); + } else { + if (m1->b_datap->db_struiolim == m1->b_wptr) + m1->b_datap->db_struiolim += inc; + m1->b_datap->db_struioflag &= ~STRUIO_IP; + m1->b_wptr += inc; + } + copyin_mblk(m, off, nlen, newbuf); +#else + if (inc < 0) + m_adj(m, inc); + /* the mbuf chain will be extended if necessary by m_copyback() */ + m_copyback(m, off, nlen, newbuf); +#endif + if (inc != 0) { +#if SOLARIS || defined(__sgi) + register u_32_t sum1, sum2; + + sum1 = ip->ip_len; + sum2 = ip->ip_len + inc; + + /* Because ~1 == -2, We really need ~1 == -1 */ + if (sum1 > sum2) + sum2--; + sum2 -= sum1; + sum2 = (sum2 & 0xffff) + (sum2 >> 16); + + fix_outcksum(&ip->ip_sum, sum2); +#endif + ip->ip_len += inc; + } + + /* + * Add skeleton NAT entry for connection which will come back the + * other way. + */ + sp = htons(a5 << 8 | a6); + /* + * The server may not make the connection back from port 20, but + * it is the most likely so use it here to check for a conflicting + * mapping. + */ + dp = htons(fin->fin_data[1] - 1); + ipn = nat_outlookup(fin->fin_ifp, IPN_TCP, nat->nat_p, nat->nat_inip, + ip->ip_dst, (dp << 16) | sp); + if (ipn == NULL) { + bcopy((char *)fin, (char *)&fi, sizeof(fi)); + bzero((char *)tcp2, sizeof(*tcp2)); + tcp2->th_win = htons(8192); + tcp2->th_sport = sp; + tcp2->th_dport = 0; /* XXX - don't specify remote port */ + fi.fin_data[0] = ntohs(sp); + fi.fin_data[1] = 0; + fi.fin_dp = (char *)tcp2; + swip = ip->ip_src; + ip->ip_src = nat->nat_inip; + ipn = nat_new(nat->nat_ptr, ip, &fi, IPN_TCP|FI_W_DPORT, + NAT_OUTBOUND); + if (ipn != NULL) { + ipn->nat_age = fr_defnatage; + (void) fr_addstate(ip, &fi, FI_W_DPORT); + } + ip->ip_src = swip; + } + return inc; +} + + +int ippr_ftp_out(fin, ip, aps, nat) +fr_info_t *fin; +ip_t *ip; +ap_session_t *aps; +nat_t *nat; +{ + return ippr_ftp_portmsg(fin, ip, nat); +} + + +int ippr_ftp_pasvmsg(fin, ip, nat) +fr_info_t *fin; +ip_t *ip; +nat_t *nat; +{ + char portbuf[IPF_MAX227LEN + 1], newbuf[IPF_MAX227LEN + 1], *s; + int off, olen, dlen, nlen = 0, inc = 0; + tcphdr_t tcph, *tcp2 = &tcph; + struct in_addr swip, swip2; + u_short a5, a6, dp, sp; + u_int a1, a2, a3, a4; + tcphdr_t *tcp; + fr_info_t fi; + nat_t *ipn; + mb_t *m; +#if SOLARIS + mb_t *m1; +#endif + + tcp = (tcphdr_t *)fin->fin_dp; + off = (ip->ip_hl << 2) + (tcp->th_off << 2); + m = *(mb_t **)fin->fin_mp; + bzero(portbuf, sizeof(portbuf)); + +#if SOLARIS + m = fin->fin_qfm; + + dlen = msgdsize(m) - off; + if (dlen > 0) + copyout_mblk(m, off, MIN(sizeof(portbuf), dlen), portbuf); +#else + dlen = mbufchainlen(m) - off; + if (dlen > 0) + m_copydata(m, off, MIN(sizeof(portbuf), dlen), portbuf); +#endif + if (dlen == 0) + return 0; + portbuf[sizeof(portbuf) - 1] = '\0'; + *newbuf = '\0'; + + if (!strncmp(portbuf, "227 ", 4)) { + if (dlen < IPF_MIN227LEN) + return 0; + else if (strncmp(portbuf, "227 Entering Passive Mode", 25)) + return 0; + } else + return 0; + /* + * Skip the PORT command + space + */ + s = portbuf + 25; + while (*s && !isdigit(*s)) + s++; + /* + * Pick out the address components, two at a time. + */ + a1 = ipf_ftp_atoi(&s); + if (!s) + return 0; + a2 = ipf_ftp_atoi(&s); + if (!s) + return 0; + + /* + * check that IP address in the PORT/PASV reply is the same as the + * sender of the command - prevents using PORT for port scanning. + */ + a1 <<= 16; + a1 |= a2; + if (a1 != ntohl(nat->nat_oip.s_addr)) + return 0; + + a5 = ipf_ftp_atoi(&s); + if (!s) + return 0; + + if (*s == ')') + s++; + if (*s == '\n') + s--; + /* + * check for CR-LF at the end. + */ + if ((*s == '\r') && (*(s + 1) == '\n')) { + s += 2; + a6 = a5 & 0xff; + } else + return 0; + a5 >>= 8; + /* + * Calculate new address parts for 227 reply + */ + a1 = ntohl(ip->ip_src.s_addr); + a2 = (a1 >> 16) & 0xff; + a3 = (a1 >> 8) & 0xff; + a4 = a1 & 0xff; + a1 >>= 24; + olen = s - portbuf; + (void) sprintf(newbuf, "%s %u,%u,%u,%u,%u,%u\r\n", + "227 Entering Passive Mode", a1, a2, a3, a4, a5, a6); + + nlen = strlen(newbuf); + inc = nlen - olen; +#if SOLARIS + for (m1 = m; m1->b_cont; m1 = m1->b_cont) + ; + if ((inc > 0) && (m1->b_datap->db_lim - m1->b_wptr < inc)) { + mblk_t *nm; + + /* alloc enough to keep same trailer space for lower driver */ + nm = allocb(nlen, BPRI_MED); + PANIC((!nm),("ippr_ftp_out: allocb failed")); + + nm->b_band = m1->b_band; + nm->b_wptr += nlen; + + m1->b_wptr -= olen; + PANIC((m1->b_wptr < m1->b_rptr), + ("ippr_ftp_out: cannot handle fragmented data block")); + + linkb(m1, nm); + } else { + m1->b_wptr += inc; + } + copyin_mblk(m, off, nlen, newbuf); +#else + if (inc < 0) + m_adj(m, inc); + /* the mbuf chain will be extended if necessary by m_copyback() */ + m_copyback(m, off, nlen, newbuf); +#endif + if (inc != 0) { +#if SOLARIS || defined(__sgi) + register u_32_t sum1, sum2; + + sum1 = ip->ip_len; + sum2 = ip->ip_len + inc; + + /* Because ~1 == -2, We really need ~1 == -1 */ + if (sum1 > sum2) + sum2--; + sum2 -= sum1; + sum2 = (sum2 & 0xffff) + (sum2 >> 16); + + fix_outcksum(&ip->ip_sum, sum2); +#endif + ip->ip_len += inc; + } + + /* + * Add skeleton NAT entry for connection which will come back the + * other way. + */ + sp = 0; + dp = htons(fin->fin_data[1] - 1); + ipn = nat_outlookup(fin->fin_ifp, IPN_TCP, nat->nat_p, nat->nat_inip, + ip->ip_dst, (dp << 16) | sp); + if (ipn == NULL) { + bcopy((char *)fin, (char *)&fi, sizeof(fi)); + bzero((char *)tcp2, sizeof(*tcp2)); + tcp2->th_win = htons(8192); + tcp2->th_sport = 0; /* XXX - fake it for nat_new */ + fi.fin_data[0] = a5 << 8 | a6; + tcp2->th_dport = htons(fi.fin_data[0]); + fi.fin_data[1] = 0; + fi.fin_dp = (char *)tcp2; + swip = ip->ip_src; + swip2 = ip->ip_dst; + ip->ip_dst = ip->ip_src; + ip->ip_src = nat->nat_inip; + ipn = nat_new(nat->nat_ptr, ip, &fi, IPN_TCP|FI_W_SPORT, + NAT_OUTBOUND); + if (ipn != NULL) { + ipn->nat_age = fr_defnatage; + (void) fr_addstate(ip, &fi, FI_W_SPORT); + } + ip->ip_src = swip; + ip->ip_dst = swip2; + } + return inc; +} + + +int ippr_ftp_in(fin, ip, aps, nat) +fr_info_t *fin; +ip_t *ip; +ap_session_t *aps; +nat_t *nat; +{ + + return ippr_ftp_pasvmsg(fin, ip, nat); +} diff --git a/sys/contrib/ipfilter/netinet/ip_log.c b/sys/contrib/ipfilter/netinet/ip_log.c new file mode 100644 index 0000000..73a411a --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_log.c @@ -0,0 +1,496 @@ +/* + * Copyright (C) 1997-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + * + * $Id: ip_log.c,v 2.1.2.2 1999/09/21 11:55:44 darrenr Exp $ + * $FreeBSD$ + */ +#include <sys/param.h> +#if defined(KERNEL) && !defined(_KERNEL) +# define _KERNEL +#endif +#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) +# include "opt_ipfilter_log.h" +#endif +#ifdef __FreeBSD__ +# if defined(_KERNEL) && !defined(IPFILTER_LKM) +# if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000) +# include "opt_ipfilter.h" +# endif +# endif +#endif +#ifdef IPFILTER_LOG +# ifndef SOLARIS +# define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4))) +# endif +# ifndef _KERNEL +# include <stdio.h> +# include <string.h> +# include <stdlib.h> +# include <ctype.h> +# endif +# include <sys/errno.h> +# include <sys/types.h> +# include <sys/file.h> +# if __FreeBSD_version >= 220000 && defined(_KERNEL) +# include <sys/fcntl.h> +# include <sys/filio.h> +# else +# include <sys/ioctl.h> +# endif +# include <sys/time.h> +# if defined(_KERNEL) && !defined(linux) +# include <sys/systm.h> +# endif +# include <sys/uio.h> +# if !SOLARIS +# if (NetBSD > 199609) || (OpenBSD > 199603) || (__FreeBSD_version >= 300000) +# include <sys/dirent.h> +# else +# include <sys/dir.h> +# endif +# ifndef linux +# include <sys/mbuf.h> +# endif +# else +# include <sys/filio.h> +# include <sys/cred.h> +# include <sys/ddi.h> +# include <sys/sunddi.h> +# include <sys/ksynch.h> +# include <sys/kmem.h> +# include <sys/mkdev.h> +# include <sys/dditypes.h> +# include <sys/cmn_err.h> +# endif +# ifndef linux +# include <sys/protosw.h> +# endif +# include <sys/socket.h> + +# include <net/if.h> +# ifdef sun +# include <net/af.h> +# endif +# if __FreeBSD_version >= 300000 +# include <net/if_var.h> +# endif +# include <net/route.h> +# include <netinet/in.h> +# ifdef __sgi +# include <sys/ddi.h> +# ifdef IFF_DRVRLOCK /* IRIX6 */ +# include <sys/hashing.h> +# endif +# endif +# if !defined(linux) && !(defined(__sgi) && !defined(IFF_DRVRLOCK)) /*IRIX<6*/ +# include <netinet/in_var.h> +# endif +# include <netinet/in_systm.h> +# include <netinet/ip.h> +# include <netinet/tcp.h> +# include <netinet/udp.h> +# include <netinet/ip_icmp.h> +# ifndef linux +# include <netinet/ip_var.h> +# endif +# ifndef _KERNEL +# include <syslog.h> +# endif +# include "netinet/ip_compat.h" +# include <netinet/tcpip.h> +# include "netinet/ip_fil.h" +# include "netinet/ip_proxy.h" +# include "netinet/ip_nat.h" +# include "netinet/ip_frag.h" +# include "netinet/ip_state.h" +# include "netinet/ip_auth.h" +# if (__FreeBSD_version >= 300000) +# include <sys/malloc.h> +# endif + +# ifndef MIN +# define MIN(a,b) (((a)<(b))?(a):(b)) +# endif + + +# if SOLARIS || defined(__sgi) +extern kmutex_t ipl_mutex; +# if SOLARIS +extern kcondvar_t iplwait; +# endif +# endif + +iplog_t **iplh[IPL_LOGMAX+1], *iplt[IPL_LOGMAX+1], *ipll[IPL_LOGMAX+1]; +size_t iplused[IPL_LOGMAX+1]; +static fr_info_t iplcrc[IPL_LOGMAX+1]; +# ifdef linux +static struct wait_queue *iplwait[IPL_LOGMAX+1]; +# endif + + +/* + * Initialise log buffers & pointers. Also iniialised the CRC to a local + * secret for use in calculating the "last log checksum". + */ +void ipflog_init() +{ + int i; + + for (i = IPL_LOGMAX; i >= 0; i--) { + iplt[i] = NULL; + ipll[i] = NULL; + iplh[i] = &iplt[i]; + iplused[i] = 0; + bzero((char *)&iplcrc[i], sizeof(iplcrc[i])); + } +} + + +/* + * ipflog + * Create a log record for a packet given that it has been triggered by a + * rule (or the default setting). Calculate the transport protocol header + * size using predetermined size of a couple of popular protocols and thus + * how much data to copy into the log, including part of the data body if + * requested. + */ +int ipflog(flags, ip, fin, m) +u_int flags; +ip_t *ip; +fr_info_t *fin; +mb_t *m; +{ + ipflog_t ipfl; + register size_t mlen, hlen; + size_t sizes[2]; + void *ptrs[2]; + int types[2]; +# if SOLARIS + ill_t *ifp = fin->fin_ifp; +# else + struct ifnet *ifp = fin->fin_ifp; +# endif + + /* + * calculate header size. + */ + hlen = fin->fin_hlen; + if ((ip->ip_off & IP_OFFMASK) == 0) { + if (ip->ip_p == IPPROTO_TCP) + hlen += MIN(sizeof(tcphdr_t), fin->fin_dlen); + else if (ip->ip_p == IPPROTO_UDP) + hlen += MIN(sizeof(udphdr_t), fin->fin_dlen); + else if (ip->ip_p == IPPROTO_ICMP) { + struct icmp *icmp; + + icmp = (struct icmp *)((char *)ip + hlen); + + /* + * For ICMP, if the packet is an error packet, also + * include the information about the packet which + * caused the error. + */ + switch (icmp->icmp_type) + { + case ICMP_UNREACH : + case ICMP_SOURCEQUENCH : + case ICMP_REDIRECT : + case ICMP_TIMXCEED : + case ICMP_PARAMPROB : + hlen += MIN(sizeof(struct icmp) + 8, + fin->fin_dlen); + break; + default : + hlen += MIN(sizeof(struct icmp), + fin->fin_dlen); + break; + } + } + } + /* + * Get the interface number and name to which this packet is + * currently associated. + */ +# if SOLARIS + ipfl.fl_unit = (u_char)ifp->ill_ppa; + bcopy(ifp->ill_name, ipfl.fl_ifname, MIN(ifp->ill_name_length, 4)); + mlen = (flags & FR_LOGBODY) ? MIN(msgdsize(m) - hlen, 128) : 0; +# else +# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199603)) || \ + (defined(OpenBSD) && (OpenBSD >= 199603)) + strncpy(ipfl.fl_ifname, ifp->if_xname, IFNAMSIZ); +# else +# ifndef linux + ipfl.fl_unit = (u_char)ifp->if_unit; +# endif + if ((ipfl.fl_ifname[0] = ifp->if_name[0])) + if ((ipfl.fl_ifname[1] = ifp->if_name[1])) + if ((ipfl.fl_ifname[2] = ifp->if_name[2])) + ipfl.fl_ifname[3] = ifp->if_name[3]; +# endif + mlen = (flags & FR_LOGBODY) ? MIN(ip->ip_len - hlen, 128) : 0; +# endif + ipfl.fl_plen = (u_char)mlen; + ipfl.fl_hlen = (u_char)hlen; + ipfl.fl_rule = fin->fin_rule; + ipfl.fl_group = fin->fin_group; + if (fin->fin_fr != NULL) + ipfl.fl_loglevel = fin->fin_fr->fr_loglevel; + else + ipfl.fl_loglevel = 0xffff; + ipfl.fl_flags = flags; + ptrs[0] = (void *)&ipfl; + sizes[0] = sizeof(ipfl); + types[0] = 0; +# if SOLARIS + /* + * Are we copied from the mblk or an aligned array ? + */ + if (ip == (ip_t *)m->b_rptr) { + ptrs[1] = m; + sizes[1] = hlen + mlen; + types[1] = 1; + } else { + ptrs[1] = ip; + sizes[1] = hlen + mlen; + types[1] = 0; + } +# else + ptrs[1] = m; + sizes[1] = hlen + mlen; + types[1] = 1; +# endif + return ipllog(IPL_LOGIPF, fin, ptrs, sizes, types, 2); +} + + +/* + * ipllog + */ +int ipllog(dev, fin, items, itemsz, types, cnt) +int dev; +fr_info_t *fin; +void **items; +size_t *itemsz; +int *types, cnt; +{ + caddr_t buf, s; + iplog_t *ipl; + size_t len; + int i; + + /* + * Check to see if this log record has a CRC which matches the last + * record logged. If it does, just up the count on the previous one + * rather than create a new one. + */ + MUTEX_ENTER(&ipl_mutex); + if (fin != NULL) { + if ((ipll[dev] != NULL) && + bcmp((char *)fin, (char *)&iplcrc[dev], FI_CSIZE) == 0) { + ipll[dev]->ipl_count++; + MUTEX_EXIT(&ipl_mutex); + return 1; + } + bcopy((char *)fin, (char *)&iplcrc[dev], FI_CSIZE); + } else + bzero((char *)&iplcrc[dev], FI_CSIZE); + MUTEX_EXIT(&ipl_mutex); + + /* + * Get the total amount of data to be logged. + */ + for (i = 0, len = sizeof(iplog_t); i < cnt; i++) + len += itemsz[i]; + + /* + * check that we have space to record this information and can + * allocate that much. + */ + KMALLOCS(buf, caddr_t, len); + if (!buf) + return 0; + MUTEX_ENTER(&ipl_mutex); + if ((iplused[dev] + len) > IPLLOGSIZE) { + MUTEX_EXIT(&ipl_mutex); + KFREES(buf, len); + return 0; + } + iplused[dev] += len; + MUTEX_EXIT(&ipl_mutex); + + /* + * advance the log pointer to the next empty record and deduct the + * amount of space we're going to use. + */ + ipl = (iplog_t *)buf; + ipl->ipl_magic = IPL_MAGIC; + ipl->ipl_count = 1; + ipl->ipl_next = NULL; + ipl->ipl_dsize = len; +# if SOLARIS || defined(sun) || defined(linux) + uniqtime((struct timeval *)&ipl->ipl_sec); +# else +# if BSD >= 199306 || defined(__FreeBSD__) || defined(__sgi) + microtime((struct timeval *)&ipl->ipl_sec); +# endif +# endif + + /* + * Loop through all the items to be logged, copying each one to the + * buffer. Use bcopy for normal data or the mb_t copyout routine. + */ + for (i = 0, s = buf + sizeof(*ipl); i < cnt; i++) { + if (types[i] == 0) + bcopy(items[i], s, itemsz[i]); + else if (types[i] == 1) { +# if SOLARIS + copyout_mblk(items[i], 0, itemsz[i], s); +# else + m_copydata(items[i], 0, itemsz[i], s); +# endif + } + s += itemsz[i]; + } + MUTEX_ENTER(&ipl_mutex); + ipll[dev] = ipl; + *iplh[dev] = ipl; + iplh[dev] = &ipl->ipl_next; +# if SOLARIS + cv_signal(&iplwait); + mutex_exit(&ipl_mutex); +# else + MUTEX_EXIT(&ipl_mutex); +# ifdef linux + wake_up_interruptible(&iplwait[dev]); +# else + wakeup(&iplh[dev]); +# endif +# endif + return 1; +} + + +int ipflog_read(unit, uio) +minor_t unit; +struct uio *uio; +{ + size_t dlen, copied; + int error = 0; + iplog_t *ipl; +# if defined(_KERNEL) && !SOLARIS + int s; +# endif + + /* + * Sanity checks. Make sure the minor # is valid and we're copying + * a valid chunk of data. + */ + if (IPL_LOGMAX < unit) + return ENXIO; + if (!uio->uio_resid) + return 0; + if ((uio->uio_resid < sizeof(iplog_t)) || + (uio->uio_resid > IPLLOGSIZE)) + return EINVAL; + + /* + * Lock the log so we can snapshot the variables. Wait for a signal + * if the log is empty. + */ + SPL_NET(s); + MUTEX_ENTER(&ipl_mutex); + + while (!iplused[unit] || !iplt[unit]) { +# if SOLARIS && defined(_KERNEL) + if (!cv_wait_sig(&iplwait, &ipl_mutex)) { + MUTEX_EXIT(&ipl_mutex); + return EINTR; + } +# else +# ifdef linux + interruptible_sleep_on(&iplwait[unit]); + if (current->signal & ~current->blocked) + return -EINTR; +# else + MUTEX_EXIT(&ipl_mutex); + SPL_X(s); + error = SLEEP(&iplh[unit], "ipl sleep"); + if (error) + return error; + SPL_NET(s); + MUTEX_ENTER(&ipl_mutex); +# endif /* linux */ +# endif /* SOLARIS */ + } + +# if BSD >= 199306 || defined(__FreeBSD__) + uio->uio_rw = UIO_READ; +# endif + + for (copied = 0; (ipl = iplt[unit]); copied += dlen) { + dlen = ipl->ipl_dsize; + if (dlen > uio->uio_resid) + break; + /* + * Don't hold the mutex over the uiomove call. + */ + iplt[unit] = ipl->ipl_next; + iplused[unit] -= dlen; + MUTEX_EXIT(&ipl_mutex); + SPL_X(s); + error = UIOMOVE((caddr_t)ipl, dlen, UIO_READ, uio); + if (error) { + SPL_NET(s); + MUTEX_ENTER(&ipl_mutex); + ipl->ipl_next = iplt[unit]; + iplt[unit] = ipl; + iplused[unit] += dlen; + break; + } + KFREES((caddr_t)ipl, dlen); + SPL_NET(s); + MUTEX_ENTER(&ipl_mutex); + } + if (!iplt[unit]) { + iplused[unit] = 0; + iplh[unit] = &iplt[unit]; + ipll[unit] = NULL; + } + + MUTEX_EXIT(&ipl_mutex); + SPL_X(s); +# ifdef linux + if (!error) + return (int)copied; + return -error; +# else + return error; +# endif +} + + +int ipflog_clear(unit) +minor_t unit; +{ + iplog_t *ipl; + int used; + + MUTEX_ENTER(&ipl_mutex); + while ((ipl = iplt[unit])) { + iplt[unit] = ipl->ipl_next; + KFREES((caddr_t)ipl, ipl->ipl_dsize); + } + iplh[unit] = &iplt[unit]; + ipll[unit] = NULL; + used = iplused[unit]; + iplused[unit] = 0; + bzero((char *)&iplcrc[unit], FI_CSIZE); + MUTEX_EXIT(&ipl_mutex); + return used; +} +#endif /* IPFILTER_LOG */ diff --git a/sys/contrib/ipfilter/netinet/ip_nat.c b/sys/contrib/ipfilter/netinet/ip_nat.c new file mode 100644 index 0000000..e85bc57 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_nat.c @@ -0,0 +1,1741 @@ +/* + * Copyright (C) 1995-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + * + * Added redirect stuff and a LOT of bug fixes. (mcn@EnGarde.com) + */ +#if !defined(lint) +static const char sccsid[] = "@(#)ip_nat.c 1.11 6/5/96 (C) 1995 Darren Reed"; +/*static const char rcsid[] = "@(#)$Id: ip_nat.c,v 2.2.2.5 1999/10/05 12:58:33 darrenr Exp $";*/ +static const char rcsid[] = "@(#)$FreeBSD$"; +#endif + +#if defined(__FreeBSD__) && defined(KERNEL) && !defined(_KERNEL) +#define _KERNEL +#endif + +#include <sys/errno.h> +#include <sys/types.h> +#include <sys/param.h> +#include <sys/time.h> +#include <sys/file.h> +#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \ + defined(_KERNEL) +# include "opt_ipfilter_log.h" +#endif +#if !defined(_KERNEL) && !defined(KERNEL) +# include <stdio.h> +# include <string.h> +# include <stdlib.h> +#endif +#if defined(KERNEL) && (__FreeBSD_version >= 220000) +# include <sys/filio.h> +# include <sys/fcntl.h> +#else +# include <sys/ioctl.h> +#endif +#include <sys/fcntl.h> +#include <sys/uio.h> +#ifndef linux +# include <sys/protosw.h> +#endif +#include <sys/socket.h> +#if defined(_KERNEL) && !defined(linux) +# include <sys/systm.h> +#endif +#if !defined(__SVR4) && !defined(__svr4__) +# ifndef linux +# include <sys/mbuf.h> +# endif +#else +# include <sys/filio.h> +# include <sys/byteorder.h> +# ifdef _KERNEL +# include <sys/dditypes.h> +# endif +# include <sys/stream.h> +# include <sys/kmem.h> +#endif +#if __FreeBSD_version >= 300000 +# include <sys/queue.h> +#endif +#include <net/if.h> +#if __FreeBSD_version >= 300000 +# include <net/if_var.h> +# if defined(_KERNEL) && !defined(IPFILTER_LKM) +# include "opt_ipfilter.h" +# endif +#endif +#ifdef sun +# include <net/af.h> +#endif +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> + +#ifdef __sgi +# ifdef IFF_DRVRLOCK /* IRIX6 */ +#include <sys/hashing.h> +#include <netinet/in_var.h> +# endif +#endif + +#ifdef RFC1825 +# include <vpn/md5.h> +# include <vpn/ipsec.h> +extern struct ifnet vpnif; +#endif + +#ifndef linux +# include <netinet/ip_var.h> +#endif +#include <netinet/tcp.h> +#include <netinet/udp.h> +#include <netinet/ip_icmp.h> +#include "netinet/ip_compat.h" +#include <netinet/tcpip.h> +#include "netinet/ip_fil.h" +#include "netinet/ip_proxy.h" +#include "netinet/ip_nat.h" +#include "netinet/ip_frag.h" +#include "netinet/ip_state.h" +#if (__FreeBSD_version >= 300000) +# include <sys/malloc.h> +#endif +#ifndef MIN +# define MIN(a,b) (((a)<(b))?(a):(b)) +#endif +#undef SOCKADDR_IN +#define SOCKADDR_IN struct sockaddr_in + +nat_t **nat_table[2] = { NULL, NULL }, + *nat_instances = NULL; +#if (SOLARIS || defined(__sgi)) && defined(_KERNEL) +ipnat_t *nat_list = NULL; +#else +static ipnat_t *nat_list = NULL; +#endif +u_int ipf_nattable_sz = NAT_TABLE_SZ; +u_int ipf_natrules_sz = NAT_SIZE; +u_int ipf_rdrrules_sz = RDR_SIZE; +u_32_t nat_masks = 0; +u_32_t rdr_masks = 0; +ipnat_t **nat_rules = NULL; +ipnat_t **rdr_rules = NULL; + +u_long fr_defnatage = DEF_NAT_AGE, + fr_defnaticmpage = 6; /* 3 seconds */ +static natstat_t nat_stats; +#if (SOLARIS || defined(__sgi)) && defined(_KERNEL) +extern kmutex_t ipf_rw; +extern KRWLOCK_T ipf_nat; +#endif + +static int nat_flushtable __P((void)); +static int nat_clearlist __P((void)); +static void nat_delete __P((struct nat *)); +static void nat_delrdr __P((struct ipnat *)); +static void nat_delnat __P((struct ipnat *)); + + +int nat_init() +{ + KMALLOCS(nat_table[0], nat_t **, sizeof(nat_t *) * ipf_nattable_sz); + if (nat_table[0] != NULL) + bzero((char *)nat_table[0], ipf_nattable_sz * sizeof(nat_t *)); + else + return -1; + + KMALLOCS(nat_table[1], nat_t **, sizeof(nat_t *) * ipf_nattable_sz); + if (nat_table[1] != NULL) + bzero((char *)nat_table[1], ipf_nattable_sz * sizeof(nat_t *)); + else + return -1; + + KMALLOCS(nat_rules, ipnat_t **, sizeof(ipnat_t *) * ipf_natrules_sz); + if (nat_rules != NULL) + bzero((char *)nat_rules, ipf_natrules_sz * sizeof(ipnat_t *)); + else + return -1; + + KMALLOCS(rdr_rules, ipnat_t **, sizeof(ipnat_t *) * ipf_rdrrules_sz); + if (rdr_rules != NULL) + bzero((char *)rdr_rules, ipf_rdrrules_sz * sizeof(ipnat_t *)); + else + return -1; + return 0; +} + + +void nat_delrdr(n) +ipnat_t *n; +{ + ipnat_t **n1; + u_32_t iph; + u_int hv; + + iph = n->in_outip & n->in_outmsk; + hv = NAT_HASH_FN(iph, ipf_rdrrules_sz); + for (n1 = &rdr_rules[hv]; *n1 && (*n1 != n); n1 = &(*n1)->in_rnext) + ; + if (*n1) + *n1 = n->in_rnext; +} + + +static void nat_delnat(n) +ipnat_t *n; +{ + ipnat_t **n1; + u_32_t iph; + u_int hv; + + iph = n->in_inip & n->in_inmsk; + hv = NAT_HASH_FN(iph, ipf_natrules_sz); + for (n1 = &nat_rules[hv]; *n1 && (*n1 != n); n1 = &(*n1)->in_mnext) + ; + if (*n1) + *n1 = n->in_mnext; +} + + +void fix_outcksum(sp, n) +u_short *sp; +u_32_t n; +{ + register u_short sumshort; + register u_32_t sum1; + + if (!n) + return; + sum1 = (~ntohs(*sp)) & 0xffff; + sum1 += (n); + sum1 = (sum1 >> 16) + (sum1 & 0xffff); + /* Again */ + sum1 = (sum1 >> 16) + (sum1 & 0xffff); + sumshort = ~(u_short)sum1; + *(sp) = htons(sumshort); +} + + +void fix_incksum(sp, n) +u_short *sp; +u_32_t n; +{ + register u_short sumshort; + register u_32_t sum1; + + if (!n) + return; +#ifdef sparc + sum1 = (~(*sp)) & 0xffff; +#else + sum1 = (~ntohs(*sp)) & 0xffff; +#endif + sum1 += ~(n) & 0xffff; + sum1 = (sum1 >> 16) + (sum1 & 0xffff); + /* Again */ + sum1 = (sum1 >> 16) + (sum1 & 0xffff); + sumshort = ~(u_short)sum1; + *(sp) = htons(sumshort); +} + + +/* + * How the NAT is organised and works. + * + * Inside (interface y) NAT Outside (interface x) + * -------------------- -+- ------------------------------------- + * Packet going | out, processsed by ip_natout() for x + * ------------> | ------------> + * src=10.1.1.1 | src=192.1.1.1 + * | + * | in, processed by ip_natin() for x + * <------------ | <------------ + * dst=10.1.1.1 | dst=192.1.1.1 + * -------------------- -+- ------------------------------------- + * ip_natout() - changes ip_src and if required, sport + * - creates a new mapping, if required. + * ip_natin() - changes ip_dst and if required, dport + * + * In the NAT table, internal source is recorded as "in" and externally + * seen as "out". + */ + +/* + * Handle ioctls which manipulate the NAT. + */ +int nat_ioctl(data, cmd, mode) +#if defined(__NetBSD__) || defined(__OpenBSD__) || (__FreeBSD_version >= 300003) +u_long cmd; +#else +int cmd; +#endif +caddr_t data; +int mode; +{ + register ipnat_t *nat, *nt, *n = NULL, **np = NULL; + int error = 0, ret, k; + ipnat_t natd; + u_32_t i, j; +#if defined(_KERNEL) && !SOLARIS + int s; +#endif + +#if (BSD >= 199306) && defined(_KERNEL) + if ((securelevel >= 2) && (mode & FWRITE)) + return EPERM; +#endif + + nat = NULL; /* XXX gcc -Wuninitialized */ + KMALLOC(nt, ipnat_t *); + if ((cmd == SIOCADNAT) || (cmd == SIOCRMNAT)) + IRCOPY(data, (char *)&natd, sizeof(natd)); + + /* + * For add/delete, look to see if the NAT entry is already present + */ + SPL_NET(s); + WRITE_ENTER(&ipf_nat); + if ((cmd == SIOCADNAT) || (cmd == SIOCRMNAT)) { + nat = &natd; + nat->in_flags &= IPN_USERFLAGS; + if ((nat->in_redir & NAT_MAPBLK) == 0) { + nat->in_inip &= nat->in_inmsk; + if ((nat->in_flags & IPN_RANGE) == 0) + nat->in_outip &= nat->in_outmsk; + } + for (np = &nat_list; (n = *np); np = &n->in_next) + if (!bcmp((char *)&nat->in_flags, (char *)&n->in_flags, + IPN_CMPSIZ)) + break; + } + + switch (cmd) + { + case SIOCADNAT : + if (!(mode & FWRITE)) { + error = EPERM; + break; + } + if (n) { + error = EEXIST; + break; + } + if (nt == NULL) { + error = ENOMEM; + break; + } + n = nt; + nt = NULL; + bcopy((char *)nat, (char *)n, sizeof(*n)); + n->in_ifp = (void *)GETUNIT(n->in_ifname); + if (!n->in_ifp) + n->in_ifp = (void *)-1; + if (n->in_plabel[0] != '\0') { + n->in_apr = appr_match(n->in_p, n->in_plabel); + if (!n->in_apr) { + error = ENOENT; + break; + } + } + n->in_next = NULL; + *np = n; + + if (n->in_redir & NAT_REDIRECT) { + u_int hv; + + k = countbits(n->in_outmsk); + if ((k >= 0) && (k != 32)) + rdr_masks |= 1 << k; + j = (n->in_outip & n->in_outmsk); + hv = NAT_HASH_FN(j, ipf_rdrrules_sz); + np = rdr_rules + hv; + while (*np != NULL) + np = &(*np)->in_rnext; + n->in_rnext = NULL; + *np = n; + } + if (n->in_redir & (NAT_MAP|NAT_MAPBLK)) { + u_int hv; + + k = countbits(n->in_inmsk); + if ((k >= 0) && (k != 32)) + nat_masks |= 1 << k; + j = (n->in_inip & n->in_inmsk); + hv = NAT_HASH_FN(j, ipf_natrules_sz); + np = nat_rules + hv; + while (*np != NULL) + np = &(*np)->in_mnext; + n->in_mnext = NULL; + *np = n; + } + + n->in_use = 0; + if (n->in_redir & NAT_MAPBLK) + n->in_space = USABLE_PORTS * ~ntohl(n->in_outmsk); + else if (n->in_flags & IPN_AUTOPORTMAP) + n->in_space = USABLE_PORTS * ~ntohl(n->in_inmsk); + else if (n->in_flags & IPN_RANGE) + n->in_space = ntohl(n->in_outmsk) - ntohl(n->in_outip); + else + n->in_space = ~ntohl(n->in_outmsk); + /* + * Calculate the number of valid IP addresses in the output + * mapping range. In all cases, the range is inclusive of + * the start and ending IP addresses. + * If to a CIDR address, lose 2: broadcast + network address + * (so subtract 1) + * If to a range, add one. + * If to a single IP address, set to 1. + */ + if (n->in_space) { + if ((n->in_flags & IPN_RANGE) != 0) + n->in_space += 1; + else + n->in_space -= 1; + } else + n->in_space = 1; + if ((n->in_outmsk != 0xffffffff) && (n->in_outmsk != 0) && + ((n->in_flags & IPN_RANGE) == 0)) + n->in_nip = ntohl(n->in_outip) + 1; + else + n->in_nip = ntohl(n->in_outip); + if (n->in_redir & NAT_MAP) { + n->in_pnext = ntohs(n->in_pmin); + /* + * Multiply by the number of ports made available. + */ + if (ntohs(n->in_pmax) >= ntohs(n->in_pmin)) { + n->in_space *= (ntohs(n->in_pmax) - + ntohs(n->in_pmin) + 1); + /* + * Because two different sources can map to + * different destinations but use the same + * local IP#/port #. + * If the result is smaller than in_space, then + * we may have wrapped around 32bits. + */ + i = n->in_inmsk; + if ((i != 0) && (i != 0xffffffff)) { + j = n->in_space * (~ntohl(i) + 1); + if (j >= n->in_space) + n->in_space = j; + else + n->in_space = 0xffffffff; + } + } + /* + * If no protocol is specified, multiple by 256. + */ + if ((n->in_flags & IPN_TCPUDP) == 0) { + j = n->in_space * 256; + if (j >= n->in_space) + n->in_space = j; + else + n->in_space = 0xffffffff; + } + } + /* Otherwise, these fields are preset */ + n = NULL; + nat_stats.ns_rules++; + break; + case SIOCRMNAT : + if (!(mode & FWRITE)) { + error = EPERM; + n = NULL; + break; + } + if (!n) { + error = ESRCH; + break; + } + if (n->in_redir & NAT_REDIRECT) + nat_delrdr(n); + if (n->in_redir & (NAT_MAPBLK|NAT_MAP)) + nat_delnat(n); + if (nat_list == NULL) { + nat_masks = 0; + rdr_masks = 0; + } + *np = n->in_next; + if (!n->in_use) { + if (n->in_apr) + appr_free(n->in_apr); + KFREE(n); + nat_stats.ns_rules--; + } else { + n->in_flags |= IPN_DELETE; + n->in_next = NULL; + } + n = NULL; + break; + case SIOCGNATS : + MUTEX_DOWNGRADE(&ipf_nat); + nat_stats.ns_table[0] = nat_table[0]; + nat_stats.ns_table[1] = nat_table[1]; + nat_stats.ns_list = nat_list; + nat_stats.ns_nattab_sz = ipf_nattable_sz; + nat_stats.ns_rultab_sz = ipf_natrules_sz; + nat_stats.ns_rdrtab_sz = ipf_rdrrules_sz; + nat_stats.ns_instances = nat_instances; + nat_stats.ns_apslist = ap_sess_list; + IWCOPY((char *)&nat_stats, (char *)data, sizeof(nat_stats)); + break; + case SIOCGNATL : + { + natlookup_t nl; + + MUTEX_DOWNGRADE(&ipf_nat); + IRCOPY((char *)data, (char *)&nl, sizeof(nl)); + + if (nat_lookupredir(&nl)) { + IWCOPY((char *)&nl, (char *)data, sizeof(nl)); + } else + error = ESRCH; + break; + } + case SIOCFLNAT : + if (!(mode & FWRITE)) { + error = EPERM; + break; + } + ret = nat_flushtable(); + MUTEX_DOWNGRADE(&ipf_nat); + IWCOPY((caddr_t)&ret, data, sizeof(ret)); + break; + case SIOCCNATL : + if (!(mode & FWRITE)) { + error = EPERM; + break; + } + ret = nat_clearlist(); + MUTEX_DOWNGRADE(&ipf_nat); + IWCOPY((caddr_t)&ret, data, sizeof(ret)); + break; + case FIONREAD : +#ifdef IPFILTER_LOG + MUTEX_DOWNGRADE(&ipf_nat); + IWCOPY((caddr_t)&iplused[IPL_LOGNAT], (caddr_t)data, + sizeof(iplused[IPL_LOGNAT])); +#endif + break; + default : + error = EINVAL; + break; + } + RWLOCK_EXIT(&ipf_nat); /* READ/WRITE */ + SPL_X(s); + if (nt) + KFREE(nt); + return error; +} + + +/* + * Delete a nat entry from the various lists and table. + */ +static void nat_delete(natd) +struct nat *natd; +{ + register struct nat **natp, *nat; + struct ipnat *ipn; + + for (natp = natd->nat_hstart[0]; (nat = *natp); + natp = &nat->nat_hnext[0]) + if (nat == natd) { + *natp = nat->nat_hnext[0]; + break; + } + + for (natp = natd->nat_hstart[1]; (nat = *natp); + natp = &nat->nat_hnext[1]) + if (nat == natd) { + *natp = nat->nat_hnext[1]; + break; + } + + if (natd->nat_fr != NULL) { + ATOMIC_DEC(natd->nat_fr->fr_ref); + } + /* + * If there is an active reference from the nat entry to its parent + * rule, decrement the rule's reference count and free it too if no + * longer being used. + */ + ipn = natd->nat_ptr; + if (ipn != NULL) { + ipn->in_space++; + ipn->in_use--; + if (!ipn->in_use && (ipn->in_flags & IPN_DELETE)) { + if (ipn->in_apr) + appr_free(ipn->in_apr); + KFREE(ipn); + nat_stats.ns_rules--; + } + } + + /* + * If there's a fragment table entry too for this nat entry, then + * dereference that as well. + */ + ipfr_forget((void *)natd); + aps_free(natd->nat_aps); + nat_stats.ns_inuse--; + KFREE(natd); +} + + +/* + * nat_flushtable - clear the NAT table of all mapping entries. + */ +static int nat_flushtable() +{ + register nat_t *nat, **natp; + register int j = 0; + + /* + * ALL NAT mappings deleted, so lets just make the deletions + * quicker. + */ + if (nat_table[0] != NULL) + bzero((char *)nat_table[0], + sizeof(nat_table[0]) * ipf_nattable_sz); + if (nat_table[1] != NULL) + bzero((char *)nat_table[1], + sizeof(nat_table[1]) * ipf_nattable_sz); + + for (natp = &nat_instances; (nat = *natp); ) { + *natp = nat->nat_next; + nat_delete(nat); + j++; + } + nat_stats.ns_inuse = 0; + return j; +} + + +/* + * nat_clearlist - delete all rules in the active NAT mapping list. + */ +static int nat_clearlist() +{ + register ipnat_t *n, **np = &nat_list; + int i = 0; + + if (nat_rules != NULL) + bzero((char *)nat_rules, sizeof(*nat_rules) * ipf_natrules_sz); + if (rdr_rules != NULL) + bzero((char *)rdr_rules, sizeof(*rdr_rules) * ipf_rdrrules_sz); + + while ((n = *np)) { + *np = n->in_next; + if (!n->in_use) { + if (n->in_apr) + appr_free(n->in_apr); + KFREE(n); + nat_stats.ns_rules--; + } else { + n->in_flags |= IPN_DELETE; + n->in_next = NULL; + } + i++; + } + nat_masks = 0; + rdr_masks = 0; + return i; +} + + +/* + * Create a new NAT table entry. + * NOTE: assumes write lock on ipf_nat has been obtained already. + */ +nat_t *nat_new(np, ip, fin, flags, direction) +ipnat_t *np; +ip_t *ip; +fr_info_t *fin; +u_int flags; +int direction; +{ + register u_32_t sum1, sum2, sumd, l; + u_short port = 0, sport = 0, dport = 0, nport = 0; + nat_t *nat, **natp, *natl = NULL; + struct in_addr in, inb; + tcphdr_t *tcp = NULL; + u_short nflags; + u_int hv; + + nflags = flags & np->in_flags; + if (flags & IPN_TCPUDP) { + tcp = (tcphdr_t *)fin->fin_dp; + sport = tcp->th_sport; + dport = tcp->th_dport; + } + + /* Give me a new nat */ + KMALLOC(nat, nat_t *); + if (nat == NULL) + return NULL; + + bzero((char *)nat, sizeof(*nat)); + nat->nat_flags = flags; + /* + * Search the current table for a match. + */ + if (direction == NAT_OUTBOUND) { + /* + * Values at which the search for a free resouce starts. + */ + u_32_t st_ip; + u_short st_port; + + /* + * If it's an outbound packet which doesn't match any existing + * record, then create a new port + */ + l = 0; + st_ip = np->in_nip; + st_port = np->in_pnext; + + do { + port = 0; + in.s_addr = np->in_nip; + if (l == 0) { + natl = nat_maplookup(fin->fin_ifp, flags, + ip->ip_src, ip->ip_dst); + if (natl != NULL) { + in = natl->nat_outip; +#ifndef sparc + in.s_addr = ntohl(in.s_addr); +#endif + } + } + + if ((np->in_outmsk == 0xffffffff) && + (np->in_pnext == 0)) { + if (l > 0) { + KFREE(nat); + return NULL; + } + } + + if (np->in_redir & NAT_MAPBLK) { + if ((l >= np->in_ppip) || ((l > 0) && + !(flags & IPN_TCPUDP))) { + KFREE(nat); + return NULL; + } + /* + * map-block - Calculate destination address. + */ + in.s_addr = ntohl(ip->ip_src.s_addr); + in.s_addr &= ntohl(~np->in_inmsk); + inb.s_addr = in.s_addr; + in.s_addr /= np->in_ippip; + in.s_addr &= ntohl(~np->in_outmsk); + in.s_addr += ntohl(np->in_outip); + /* + * Calculate destination port. + */ + if ((flags & IPN_TCPUDP) && + (np->in_ppip != 0)) { + port = ntohs(sport) + l; + port %= np->in_ppip; + port += np->in_ppip * + (inb.s_addr % np->in_ippip); + port += MAPBLK_MINPORT; + port = htons(port); + } + } else if (!in.s_addr && + (np->in_outmsk == 0xffffffff)) { + /* + * 0/32 - use the interface's IP address. + */ + if ((l > 0) || + fr_ifpaddr(fin->fin_ifp, &in) == -1) { + KFREE(nat); + return NULL; + } + } else if (!in.s_addr && !np->in_outmsk) { + /* + * 0/0 - use the original source address/port. + */ + if (l > 0) { + KFREE(nat); + return NULL; + } + in.s_addr = ntohl(ip->ip_src.s_addr); + } else if ((np->in_outmsk != 0xffffffff) && + (np->in_pnext == 0) && + ((l > 0) || (natl == NULL))) + np->in_nip++; + natl = NULL; + + if ((nflags & IPN_TCPUDP) && + ((np->in_redir & NAT_MAPBLK) == 0) && + (np->in_flags & IPN_AUTOPORTMAP)) { + if ((l > 0) && (l % np->in_ppip == 0)) { + if (l > np->in_space) { + KFREE(nat); + return NULL; + } else if ((l > np->in_ppip) && + np->in_outmsk != 0xffffffff) + np->in_nip++; + } + if (np->in_ppip != 0) { + port = ntohs(sport); + port += (l % np->in_ppip); + port %= np->in_ppip; + port += np->in_ppip * + (ntohl(ip->ip_src.s_addr) % + np->in_ippip); + port += MAPBLK_MINPORT; + port = htons(port); + } + } else if (((np->in_redir & NAT_MAPBLK) == 0) && + (nflags & IPN_TCPUDP) && + (np->in_pnext != 0)) { + port = htons(np->in_pnext++); + if (np->in_pnext > ntohs(np->in_pmax)) { + np->in_pnext = ntohs(np->in_pmin); + if (np->in_outmsk != 0xffffffff) + np->in_nip++; + } + } + + if (np->in_flags & IPN_RANGE) { + if (np->in_nip >= ntohl(np->in_outmsk)) + np->in_nip = ntohl(np->in_outip); + } else { + if ((np->in_outmsk != 0xffffffff) && + ((np->in_nip + 1) & ntohl(np->in_outmsk)) > + ntohl(np->in_outip)) + np->in_nip = ntohl(np->in_outip) + 1; + } + + if (!port && (flags & IPN_TCPUDP)) + port = sport; + + /* + * Here we do a lookup of the connection as seen from + * the outside. If an IP# pair already exists, try + * again. So if you have A->B becomes C->B, you can + * also have D->E become C->E but not D->B causing + * another C->B. Also take protocol and ports into + * account when determining whether a pre-existing + * NAT setup will cause an external conflict where + * this is appropriate. + */ + inb.s_addr = htonl(in.s_addr); + natl = nat_inlookup(fin->fin_ifp, flags, + (u_int)ip->ip_p, ip->ip_dst, inb, + (port << 16) | dport); + + /* + * Has the search wrapped around and come back to the + * start ? + */ + if ((natl != NULL) && + (np->in_pnext != 0) && (st_port == np->in_pnext) && + (np->in_nip != 0) && (st_ip == np->in_nip)) { + KFREE(nat); + return NULL; + } + l++; + } while (natl != NULL); + + if (np->in_space > 0) + np->in_space--; + + /* Setup the NAT table */ + nat->nat_inip = ip->ip_src; + nat->nat_outip.s_addr = htonl(in.s_addr); + nat->nat_oip = ip->ip_dst; + + sum1 = LONG_SUM(ntohl(ip->ip_src.s_addr)) + ntohs(sport); + sum2 = LONG_SUM(in.s_addr) + ntohs(port); + + if (flags & IPN_TCPUDP) { + nat->nat_inport = sport; + nat->nat_outport = port; /* sport */ + nat->nat_oport = dport; + } + } else { + /* + * Otherwise, it's an inbound packet. Most likely, we don't + * want to rewrite source ports and source addresses. Instead, + * we want to rewrite to a fixed internal address and fixed + * internal port. + */ + in.s_addr = ntohl(np->in_inip); + if (!(nport = np->in_pnext)) + nport = dport; + + /* + * When the redirect-to address is set to 0.0.0.0, just + * assume a blank `forwarding' of the packet. We don't + * setup any translation for this either. + */ + if ((in.s_addr == 0) && (nport == dport)) { + KFREE(nat); + return NULL; + } + + nat->nat_inip.s_addr = htonl(in.s_addr); + nat->nat_outip = ip->ip_dst; + nat->nat_oip = ip->ip_src; + + sum1 = LONG_SUM(ntohl(ip->ip_dst.s_addr)) + ntohs(dport); + sum2 = LONG_SUM(in.s_addr) + ntohs(nport); + + if (flags & IPN_TCPUDP) { + nat->nat_inport = nport; + nat->nat_outport = dport; + nat->nat_oport = sport; + } + } + + CALC_SUMD(sum1, sum2, sumd); + nat->nat_sumd = (sumd & 0xffff) + (sumd >> 16); + + if ((flags & IPN_TCPUDP) && ((sport != port) || (dport != nport))) { + if (direction == NAT_OUTBOUND) + sum1 = LONG_SUM(ntohl(ip->ip_src.s_addr)); + else + sum1 = LONG_SUM(ntohl(ip->ip_dst.s_addr)); + + sum2 = LONG_SUM(in.s_addr); + + CALC_SUMD(sum1, sum2, sumd); + nat->nat_ipsumd = (sumd & 0xffff) + (sumd >> 16); + } else + nat->nat_ipsumd = nat->nat_sumd; + + in.s_addr = htonl(in.s_addr); + nat->nat_next = nat_instances; + nat_instances = nat; + hv = NAT_HASH_FN(nat->nat_inip.s_addr, ipf_nattable_sz); + natp = &nat_table[0][hv]; + nat->nat_hstart[0] = natp; + nat->nat_hnext[0] = *natp; + *natp = nat; + hv = NAT_HASH_FN(nat->nat_outip.s_addr, ipf_nattable_sz); + natp = &nat_table[1][hv]; + nat->nat_hstart[1] = natp; + nat->nat_hnext[1] = *natp; + *natp = nat; + nat->nat_dir = direction; + nat->nat_ifp = fin->fin_ifp; + nat->nat_ptr = np; + nat->nat_p = ip->ip_p; + nat->nat_bytes = 0; + nat->nat_pkts = 0; + nat->nat_age = fr_defnatage; + nat->nat_fr = fin->fin_fr; + if (nat->nat_fr != NULL) { + ATOMIC_INC(nat->nat_fr->fr_ref); + } + if (direction == NAT_OUTBOUND) { + if (flags & IPN_TCPUDP) + tcp->th_sport = port; + } else { + if (flags & IPN_TCPUDP) + tcp->th_dport = nport; + } + nat_stats.ns_added++; + nat_stats.ns_inuse++; + np->in_use++; + return nat; +} + + +nat_t *nat_icmpinlookup(ip, fin) +ip_t *ip; +fr_info_t *fin; +{ + icmphdr_t *icmp; + tcphdr_t *tcp = NULL; + ip_t *oip; + int flags = 0, type; + + icmp = (icmphdr_t *)fin->fin_dp; + /* + * Does it at least have the return (basic) IP header ? + * Only a basic IP header (no options) should be with an ICMP error + * header. + */ + if ((ip->ip_hl != 5) || (ip->ip_len < ICMPERR_MINPKTLEN)) + return NULL; + type = icmp->icmp_type; + /* + * If it's not an error type, then return. + */ + if ((type != ICMP_UNREACH) && (type != ICMP_SOURCEQUENCH) && + (type != ICMP_REDIRECT) && (type != ICMP_TIMXCEED) && + (type != ICMP_PARAMPROB)) + return NULL; + + oip = (ip_t *)((char *)fin->fin_dp + 8); + if (ip->ip_len < ICMPERR_MAXPKTLEN + ((oip->ip_hl - 5) << 2)) + return NULL; + if (oip->ip_p == IPPROTO_TCP) + flags = IPN_TCP; + else if (oip->ip_p == IPPROTO_UDP) + flags = IPN_UDP; + if (flags & IPN_TCPUDP) { + tcp = (tcphdr_t *)((char *)oip + (oip->ip_hl << 2)); + return nat_inlookup(fin->fin_ifp, flags, (u_int)oip->ip_p, + oip->ip_dst, oip->ip_src, + (tcp->th_sport << 16) | tcp->th_dport); + } + return nat_inlookup(fin->fin_ifp, 0, (u_int)oip->ip_p, oip->ip_dst, + oip->ip_src, 0); +} + + +/* + * This should *ONLY* be used for incoming packets to make sure a NAT'd ICMP + * packet gets correctly recognised. + */ +nat_t *nat_icmpin(ip, fin, nflags) +ip_t *ip; +fr_info_t *fin; +u_int *nflags; +{ + u_32_t sum1, sum2, sumd; + struct in_addr in; + icmphdr_t *icmp; + nat_t *nat; + ip_t *oip; + int flags = 0; + + if (!(nat = nat_icmpinlookup(ip, fin))) + return NULL; + *nflags = IPN_ICMPERR; + icmp = (icmphdr_t *)fin->fin_dp; + oip = (ip_t *)&icmp->icmp_ip; + if (oip->ip_p == IPPROTO_TCP) + flags = IPN_TCP; + else if (oip->ip_p == IPPROTO_UDP) + flags = IPN_UDP; + /* + * Need to adjust ICMP header to include the real IP#'s and + * port #'s. Only apply a checksum change relative to the + * IP address change is it will be modified again in ip_natout + * for both address and port. Two checksum changes are + * necessary for the two header address changes. Be careful + * to only modify the checksum once for the port # and twice + * for the IP#. + */ + if (nat->nat_dir == NAT_OUTBOUND) { + sum1 = LONG_SUM(ntohl(oip->ip_src.s_addr)); + in = nat->nat_inip; + oip->ip_src = in; + } else { + sum1 = LONG_SUM(ntohl(oip->ip_dst.s_addr)); + in = nat->nat_outip; + oip->ip_dst = in; + } + + sum2 = LONG_SUM(ntohl(in.s_addr)); + + CALC_SUMD(sum1, sum2, sumd); + + if (nat->nat_dir == NAT_OUTBOUND) { + fix_incksum(&oip->ip_sum, sumd); + + sumd += (sumd & 0xffff); + while (sumd > 0xffff) + sumd = (sumd & 0xffff) + (sumd >> 16); + fix_outcksum(&icmp->icmp_cksum, sumd); + } else { + fix_outcksum(&oip->ip_sum, sumd); + + sumd += (sumd & 0xffff); + while (sumd > 0xffff) + sumd = (sumd & 0xffff) + (sumd >> 16); + fix_incksum(&icmp->icmp_cksum, sumd); + } + + + if ((flags & IPN_TCPUDP) != 0) { + tcphdr_t *tcp; + + /* XXX - what if this is bogus hl and we go off the end ? */ + tcp = (tcphdr_t *)((((char *)oip) + (oip->ip_hl << 2))); + + if (nat->nat_dir == NAT_OUTBOUND) { + if (tcp->th_sport != nat->nat_inport) { + sum1 = ntohs(tcp->th_sport); + sum2 = ntohs(nat->nat_inport); + CALC_SUMD(sum1, sum2, sumd); + tcp->th_sport = nat->nat_inport; + fix_outcksum(&icmp->icmp_cksum, sumd); + } + } else { + if (tcp->th_dport != nat->nat_outport) { + sum1 = ntohs(tcp->th_dport); + sum2 = ntohs(nat->nat_outport); + CALC_SUMD(sum1, sum2, sumd); + tcp->th_dport = nat->nat_outport; + fix_incksum(&icmp->icmp_cksum, sumd); + } + } + } + nat->nat_age = fr_defnaticmpage; + return nat; +} + + +/* + * NB: these lookups don't lock access to the list, it assume it has already + * been done! + */ +/* + * Lookup a nat entry based on the mapped destination ip address/port and + * real source address/port. We use this lookup when receiving a packet, + * we're looking for a table entry, based on the destination address. + * NOTE: THE PACKET BEING CHECKED (IF FOUND) HAS A MAPPING ALREADY. + */ +nat_t *nat_inlookup(ifp, flags, p, src, mapdst, ports) +void *ifp; +register u_int flags, p; +struct in_addr src , mapdst; +u_32_t ports; +{ + register u_short sport, mapdport; + register nat_t *nat; + register int nflags; + u_int hv; + + mapdport = ports >> 16; + sport = ports & 0xffff; + flags &= IPN_TCPUDP; + + hv = NAT_HASH_FN(mapdst.s_addr, ipf_nattable_sz); + nat = nat_table[1][hv]; + for (; nat; nat = nat->nat_hnext[1]) { + nflags = nat->nat_flags; + if ((!ifp || ifp == nat->nat_ifp) && + nat->nat_oip.s_addr == src.s_addr && + nat->nat_outip.s_addr == mapdst.s_addr && + (((p == 0) && (flags == (nat->nat_flags & IPN_TCPUDP))) + || (p == nat->nat_p)) && (!flags || + (((nat->nat_oport == sport) || (nflags & FI_W_DPORT)) && + ((nat->nat_outport == mapdport) || + (nflags & FI_W_SPORT))))) + return nat; + } + return NULL; +} + + +/* + * Lookup a nat entry based on the source 'real' ip address/port and + * destination address/port. We use this lookup when sending a packet out, + * we're looking for a table entry, based on the source address. + * NOTE: THE PACKET BEING CHECKED (IF FOUND) HAS A MAPPING ALREADY. + */ +nat_t *nat_outlookup(ifp, flags, p, src, dst, ports) +void *ifp; +register u_int flags, p; +struct in_addr src , dst; +u_32_t ports; +{ + register u_short sport, dport; + register nat_t *nat; + register int nflags; + u_int hv; + + sport = ports & 0xffff; + dport = ports >> 16; + flags &= IPN_TCPUDP; + + hv = NAT_HASH_FN(src.s_addr, ipf_nattable_sz); + nat = nat_table[0][hv]; + for (; nat; nat = nat->nat_hnext[0]) { + nflags = nat->nat_flags; + + if ((!ifp || ifp == nat->nat_ifp) && + nat->nat_inip.s_addr == src.s_addr && + nat->nat_oip.s_addr == dst.s_addr && + (((p == 0) && (flags == (nat->nat_flags & IPN_TCPUDP))) + || (p == nat->nat_p)) && (!flags || + ((nat->nat_inport == sport || nflags & FI_W_SPORT) && + (nat->nat_oport == dport || nflags & FI_W_DPORT)))) + return nat; + } + return NULL; +} + + +/* + * check if an ip address has already been allocated for a given mapping that + * is not doing port based translation. + */ +nat_t *nat_maplookup(ifp, flags, src, dst) +void *ifp; +register u_int flags; +struct in_addr src , dst; +{ + register nat_t *nat; + register int oflags; + u_int hv; + + hv = NAT_HASH_FN(src.s_addr, ipf_nattable_sz); + nat = nat_table[0][hv]; + for (; nat; nat = nat->nat_hnext[0]) { + oflags = (flags & IPN_TCPUDP) & nat->nat_ptr->in_flags; + if (oflags != 0) + continue; + + if ((!ifp || ifp == nat->nat_ifp) && + nat->nat_inip.s_addr == src.s_addr && + nat->nat_oip.s_addr == dst.s_addr) + return nat; + } + return NULL; +} + + +/* + * Lookup the NAT tables to search for a matching redirect + */ +nat_t *nat_lookupredir(np) +register natlookup_t *np; +{ + u_32_t ports; + nat_t *nat; + + ports = (np->nl_outport << 16) | np->nl_inport; + /* + * If nl_inip is non null, this is a lookup based on the real + * ip address. Else, we use the fake. + */ + if ((nat = nat_outlookup(NULL, np->nl_flags, 0, np->nl_inip, + np->nl_outip, ports))) { + np->nl_realip = nat->nat_outip; + np->nl_realport = nat->nat_outport; + } + return nat; +} + + +/* + * Packets going out on the external interface go through this. + * Here, the source address requires alteration, if anything. + */ +int ip_natout(ip, fin) +ip_t *ip; +fr_info_t *fin; +{ + register ipnat_t *np = NULL; + register u_32_t ipa; + tcphdr_t *tcp = NULL; + u_short nflags = 0, sport = 0, dport = 0, *csump = NULL; + struct ifnet *ifp; + int natadd = 1; + frentry_t *fr; + u_int hv, msk; + u_32_t iph; + nat_t *nat; + int i; + + if (nat_list == NULL) + return 0; + + if ((fr = fin->fin_fr) && !(fr->fr_flags & FR_DUP) && + fr->fr_tif.fd_ifp && fr->fr_tif.fd_ifp != (void *)-1) + ifp = fr->fr_tif.fd_ifp; + else + ifp = fin->fin_ifp; + + if (!(ip->ip_off & IP_OFFMASK) && !(fin->fin_fi.fi_fl & FI_SHORT)) { + if (ip->ip_p == IPPROTO_TCP) + nflags = IPN_TCP; + else if (ip->ip_p == IPPROTO_UDP) + nflags = IPN_UDP; + if ((nflags & IPN_TCPUDP)) { + tcp = (tcphdr_t *)fin->fin_dp; + sport = tcp->th_sport; + dport = tcp->th_dport; + } + } + + ipa = ip->ip_src.s_addr; + + READ_ENTER(&ipf_nat); + if ((ip->ip_off & (IP_OFFMASK|IP_MF)) && + (nat = ipfr_nat_knownfrag(ip, fin))) + natadd = 0; + else if ((nat = nat_outlookup(ifp, nflags, (u_int)ip->ip_p, ip->ip_src, + ip->ip_dst, (dport << 16) | sport))) { + nflags = nat->nat_flags; + if ((nflags & (FI_W_SPORT|FI_W_DPORT)) != 0) { + if ((nflags & FI_W_SPORT) && + (nat->nat_inport != sport)) + nat->nat_inport = sport; + else if ((nflags & FI_W_DPORT) && + (nat->nat_oport != dport)) + nat->nat_oport = dport; + if (nat->nat_outport == 0) + nat->nat_outport = sport; + nat->nat_flags &= ~(FI_W_DPORT|FI_W_SPORT); + nflags = nat->nat_flags; + } + } else { + RWLOCK_EXIT(&ipf_nat); + WRITE_ENTER(&ipf_nat); + /* + * If there is no current entry in the nat table for this IP#, + * create one for it (if there is a matching rule). + */ + msk = 0xffffffff; + i = 32; +maskloop: + iph = ipa & htonl(msk); + hv = NAT_HASH_FN(iph, ipf_natrules_sz); + for (np = nat_rules[hv]; np; np = np->in_mnext) + { + if ((np->in_ifp == ifp) && np->in_space && + (!(np->in_flags & IPN_RF) || + (np->in_flags & nflags)) && + ((ipa & np->in_inmsk) == np->in_inip) && + ((np->in_redir & (NAT_MAP|NAT_MAPBLK)) || + (np->in_pnext == sport))) { + if (*np->in_plabel && !appr_ok(ip, tcp, np)) + continue; + /* + * If it's a redirection, then we don't want to + * create new outgoing port stuff. + * Redirections are only for incoming + * connections. + */ + if (!(np->in_redir & (NAT_MAP|NAT_MAPBLK))) + continue; + if ((nat = nat_new(np, ip, fin, (u_int)nflags, + NAT_OUTBOUND))) { + np->in_hits++; +#ifdef IPFILTER_LOG + nat_log(nat, (u_int)np->in_redir); +#endif + break; + } + } + } + if ((np == NULL) && (i > 0)) { + do { + i--; + msk <<= 1; + } while ((i >= 0) && ((nat_masks & (1 << i)) == 0)); + if (i >= 0) + goto maskloop; + } + MUTEX_DOWNGRADE(&ipf_nat); + } + + if (nat) { + np = nat->nat_ptr; + if (natadd && fin->fin_fi.fi_fl & FI_FRAG) + ipfr_nat_newfrag(ip, fin, 0, nat); + ip->ip_src = nat->nat_outip; + MUTEX_ENTER(&ipf_rw); + nat->nat_age = fr_defnatage; + nat->nat_bytes += ip->ip_len; + nat->nat_pkts++; + MUTEX_EXIT(&ipf_rw); + + /* + * Fix up checksums, not by recalculating them, but + * simply computing adjustments. + */ +#if SOLARIS || defined(__sgi) + if (nat->nat_dir == NAT_OUTBOUND) + fix_outcksum(&ip->ip_sum, nat->nat_ipsumd); + else + fix_incksum(&ip->ip_sum, nat->nat_ipsumd); +#endif + + if (!(ip->ip_off & IP_OFFMASK) && + !(fin->fin_fi.fi_fl & FI_SHORT)) { + + if ((nat->nat_outport != 0) && (nflags & IPN_TCPUDP)) { + tcp->th_sport = nat->nat_outport; + fin->fin_data[0] = ntohs(tcp->th_sport); + } + + if (ip->ip_p == IPPROTO_TCP) { + csump = &tcp->th_sum; + MUTEX_ENTER(&ipf_rw); + fr_tcp_age(&nat->nat_age, + nat->nat_tcpstate, ip, fin, 1); + if (nat->nat_age < fr_defnaticmpage) + nat->nat_age = fr_defnaticmpage; +#ifdef LARGE_NAT + else if (nat->nat_age > DEF_NAT_AGE) + nat->nat_age = DEF_NAT_AGE; +#endif + /* + * Increase this because we may have + * "keep state" following this too and + * packet storms can occur if this is + * removed too quickly. + */ + if (nat->nat_age == fr_tcpclosed) + nat->nat_age = fr_tcplastack; + MUTEX_EXIT(&ipf_rw); + } else if (ip->ip_p == IPPROTO_UDP) { + udphdr_t *udp = (udphdr_t *)tcp; + + if (udp->uh_sum) + csump = &udp->uh_sum; + } + if (csump) { + if (nat->nat_dir == NAT_OUTBOUND) + fix_outcksum(csump, nat->nat_sumd); + else + fix_incksum(csump, nat->nat_sumd); + } + } + if ((np->in_apr != NULL) && (np->in_dport == 0 || + (tcp != NULL && dport == np->in_dport))) + (void) appr_check(ip, fin, nat); + ATOMIC_INC(nat_stats.ns_mapped[1]); + RWLOCK_EXIT(&ipf_nat); /* READ */ + return 1; + } + RWLOCK_EXIT(&ipf_nat); /* READ/WRITE */ + return 0; +} + + +/* + * Packets coming in from the external interface go through this. + * Here, the destination address requires alteration, if anything. + */ +int ip_natin(ip, fin) +ip_t *ip; +fr_info_t *fin; +{ + register struct in_addr src; + register struct in_addr in; + register ipnat_t *np; + u_int nflags = 0, natadd = 1, hv, msk; + struct ifnet *ifp = fin->fin_ifp; + tcphdr_t *tcp = NULL; + u_short sport = 0, dport = 0, *csump = NULL; + nat_t *nat; + u_32_t iph; + int i; + + if (nat_list == NULL) + return 0; + + if (!(ip->ip_off & IP_OFFMASK) && !(fin->fin_fi.fi_fl & FI_SHORT)) { + if (ip->ip_p == IPPROTO_TCP) + nflags = IPN_TCP; + else if (ip->ip_p == IPPROTO_UDP) + nflags = IPN_UDP; + if ((nflags & IPN_TCPUDP)) { + tcp = (tcphdr_t *)fin->fin_dp; + dport = tcp->th_dport; + sport = tcp->th_sport; + } + } + + in = ip->ip_dst; + /* make sure the source address is to be redirected */ + src = ip->ip_src; + + READ_ENTER(&ipf_nat); + + if ((ip->ip_p == IPPROTO_ICMP) && (nat = nat_icmpin(ip, fin, &nflags))) + ; + else if ((ip->ip_off & IP_OFFMASK) && + (nat = ipfr_nat_knownfrag(ip, fin))) + natadd = 0; + else if ((nat = nat_inlookup(fin->fin_ifp, nflags, (u_int)ip->ip_p, + ip->ip_src, in, (dport << 16) | sport))) { + nflags = nat->nat_flags; + if ((nflags & (FI_W_SPORT|FI_W_DPORT)) != 0) { + if ((nat->nat_oport != sport) && (nflags & FI_W_DPORT)) + nat->nat_oport = sport; + else if ((nat->nat_outport != dport) && + (nflags & FI_W_SPORT)) + nat->nat_outport = dport; + nat->nat_flags &= ~(FI_W_SPORT|FI_W_DPORT); + nflags = nat->nat_flags; + } + } else { + RWLOCK_EXIT(&ipf_nat); + WRITE_ENTER(&ipf_nat); + /* + * If there is no current entry in the nat table for this IP#, + * create one for it (if there is a matching rule). + */ + msk = 0xffffffff; + i = 32; +maskloop: + iph = in.s_addr & htonl(msk); + hv = NAT_HASH_FN(iph, ipf_rdrrules_sz); + for (np = rdr_rules[hv]; np; np = np->in_rnext) + if ((np->in_ifp == ifp) && + (!np->in_flags || (nflags & np->in_flags)) && + ((in.s_addr & np->in_outmsk) == np->in_outip) && + ((src.s_addr & np->in_srcmsk) == np->in_srcip) && + (np->in_redir & NAT_REDIRECT) && + (!np->in_pmin || np->in_pmin == dport)) { + if ((nat = nat_new(np, ip, fin, nflags, + NAT_INBOUND))) { + np->in_hits++; +#ifdef IPFILTER_LOG + nat_log(nat, (u_int)np->in_redir); +#endif + break; + } + } + if ((np == NULL) && (i > 0)) { + do { + i--; + msk <<= 1; + } while ((i >= 0) && ((rdr_masks & (1 << i)) == 0)); + if (i >= 0) + goto maskloop; + } + MUTEX_DOWNGRADE(&ipf_nat); + } + if (nat) { + np = nat->nat_ptr; + fin->fin_fr = nat->nat_fr; + if (natadd && fin->fin_fi.fi_fl & FI_FRAG) + ipfr_nat_newfrag(ip, fin, 0, nat); + if ((np->in_apr != NULL) && (np->in_dport == 0 || + (tcp != NULL && sport == np->in_dport))) + (void) appr_check(ip, fin, nat); + + MUTEX_ENTER(&ipf_rw); + if (nflags != IPN_ICMPERR) + nat->nat_age = fr_defnatage; + + nat->nat_bytes += ip->ip_len; + nat->nat_pkts++; + MUTEX_EXIT(&ipf_rw); + ip->ip_dst = nat->nat_inip; + fin->fin_fi.fi_dst = nat->nat_inip; + + /* + * Fix up checksums, not by recalculating them, but + * simply computing adjustments. + */ +#if SOLARIS || defined(__sgi) + if (nat->nat_dir == NAT_OUTBOUND) + fix_incksum(&ip->ip_sum, nat->nat_ipsumd); + else + fix_outcksum(&ip->ip_sum, nat->nat_ipsumd); +#endif + if (!(ip->ip_off & IP_OFFMASK) && + !(fin->fin_fi.fi_fl & FI_SHORT)) { + + if ((nat->nat_inport != 0) && (nflags & IPN_TCPUDP)) { + tcp->th_dport = nat->nat_inport; + fin->fin_data[1] = ntohs(tcp->th_dport); + } + + if (ip->ip_p == IPPROTO_TCP) { + csump = &tcp->th_sum; + MUTEX_ENTER(&ipf_rw); + fr_tcp_age(&nat->nat_age, + nat->nat_tcpstate, ip, fin, 0); + if (nat->nat_age < fr_defnaticmpage) + nat->nat_age = fr_defnaticmpage; +#ifdef LARGE_NAT + else if (nat->nat_age > DEF_NAT_AGE) + nat->nat_age = DEF_NAT_AGE; +#endif + /* + * Increase this because we may have + * "keep state" following this too and + * packet storms can occur if this is + * removed too quickly. + */ + if (nat->nat_age == fr_tcpclosed) + nat->nat_age = fr_tcplastack; + MUTEX_EXIT(&ipf_rw); + } else if (ip->ip_p == IPPROTO_UDP) { + udphdr_t *udp = (udphdr_t *)tcp; + + if (udp->uh_sum) + csump = &udp->uh_sum; + } + if (csump) { + if (nat->nat_dir == NAT_OUTBOUND) + fix_incksum(csump, nat->nat_sumd); + else + fix_outcksum(csump, nat->nat_sumd); + } + } + ATOMIC_INC(nat_stats.ns_mapped[0]); + RWLOCK_EXIT(&ipf_nat); /* READ */ + return 1; + } + RWLOCK_EXIT(&ipf_nat); /* READ/WRITE */ + return 0; +} + + +/* + * Free all memory used by NAT structures allocated at runtime. + */ +void ip_natunload() +{ + WRITE_ENTER(&ipf_nat); + (void) nat_clearlist(); + (void) nat_flushtable(); + RWLOCK_EXIT(&ipf_nat); + + if (nat_table[0] != NULL) { + KFREES(nat_table[0], sizeof(nat_t *) * ipf_nattable_sz); + nat_table[0] = NULL; + } + if (nat_table[1] != NULL) { + KFREES(nat_table[1], sizeof(nat_t *) * ipf_nattable_sz); + nat_table[1] = NULL; + } + if (nat_rules != NULL) { + KFREES(nat_rules, sizeof(ipnat_t *) * ipf_natrules_sz); + nat_rules = NULL; + } + if (rdr_rules != NULL) { + KFREES(rdr_rules, sizeof(ipnat_t *) * ipf_rdrrules_sz); + rdr_rules = NULL; + } +} + + +/* + * Slowly expire held state for NAT entries. Timeouts are set in + * expectation of this being called twice per second. + */ +void ip_natexpire() +{ + register struct nat *nat, **natp; +#if defined(_KERNEL) && !SOLARIS + int s; +#endif + + SPL_NET(s); + WRITE_ENTER(&ipf_nat); + for (natp = &nat_instances; (nat = *natp); ) { + nat->nat_age--; + if (nat->nat_age) { + natp = &nat->nat_next; + continue; + } + *natp = nat->nat_next; +#ifdef IPFILTER_LOG + nat_log(nat, NL_EXPIRE); +#endif + nat_delete(nat); + nat_stats.ns_expire++; + } + RWLOCK_EXIT(&ipf_nat); + SPL_X(s); +} + + +/* + */ +void ip_natsync(ifp) +void *ifp; +{ + register ipnat_t *n; + register nat_t *nat; + register u_32_t sum1, sum2, sumd; + struct in_addr in; + ipnat_t *np; + void *ifp2; +#if defined(_KERNEL) && !SOLARIS + int s; +#endif + + /* + * Change IP addresses for NAT sessions for any protocol except TCP + * since it will break the TCP connection anyway. + */ + SPL_NET(s); + WRITE_ENTER(&ipf_nat); + for (nat = nat_instances; nat; nat = nat->nat_next) + if (((ifp == NULL) || (ifp == nat->nat_ifp)) && + !(nat->nat_flags & IPN_TCP) && (np = nat->nat_ptr) && + (np->in_outmsk == 0xffffffff) && !np->in_nip) { + ifp2 = nat->nat_ifp; + /* + * Change the map-to address to be the same as the + * new one. + */ + sum1 = nat->nat_outip.s_addr; + if (fr_ifpaddr(ifp2, &in) != -1) + nat->nat_outip.s_addr = htonl(in.s_addr); + sum2 = nat->nat_outip.s_addr; + + if (sum1 == sum2) + continue; + /* + * Readjust the checksum adjustment to take into + * account the new IP#. + */ + CALC_SUMD(sum1, sum2, sumd); + sumd += nat->nat_sumd; + nat->nat_sumd = (sumd & 0xffff) + (sumd >> 16); + } + + for (n = nat_list; (n != NULL); n = n->in_next) + if (n->in_ifp == ifp) + n->in_ifp = (void *)GETUNIT(n->in_ifname); + RWLOCK_EXIT(&ipf_nat); + SPL_X(s); +} + + +#ifdef IPFILTER_LOG +void nat_log(nat, type) +struct nat *nat; +u_int type; +{ + struct ipnat *np; + struct natlog natl; + void *items[1]; + size_t sizes[1]; + int rulen, types[1]; + + natl.nl_inip = nat->nat_inip; + natl.nl_outip = nat->nat_outip; + natl.nl_origip = nat->nat_oip; + natl.nl_bytes = nat->nat_bytes; + natl.nl_pkts = nat->nat_pkts; + natl.nl_origport = nat->nat_oport; + natl.nl_inport = nat->nat_inport; + natl.nl_outport = nat->nat_outport; + natl.nl_type = type; + natl.nl_rule = -1; +#ifndef LARGE_NAT + if (nat->nat_ptr != NULL) { + for (rulen = 0, np = nat_list; np; np = np->in_next, rulen++) + if (np == nat->nat_ptr) { + natl.nl_rule = rulen; + break; + } + } +#endif + items[0] = &natl; + sizes[0] = sizeof(natl); + types[0] = 0; + + (void) ipllog(IPL_LOGNAT, NULL, items, sizes, types, 1); +} +#endif diff --git a/sys/contrib/ipfilter/netinet/ip_nat.h b/sys/contrib/ipfilter/netinet/ip_nat.h new file mode 100644 index 0000000..eeeebec --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_nat.h @@ -0,0 +1,247 @@ +/* + * Copyright (C) 1995-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + * + * @(#)ip_nat.h 1.5 2/4/96 + * $Id: ip_nat.h,v 2.1.2.1 1999/08/14 04:47:54 darrenr Exp $ + * $FreeBSD$ + */ + +#ifndef __IP_NAT_H__ +#define __IP_NAT_H__ + +#ifndef SOLARIS +#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4))) +#endif + +#if defined(__STDC__) || defined(__GNUC__) +#define SIOCADNAT _IOW('r', 80, struct ipnat) +#define SIOCRMNAT _IOW('r', 81, struct ipnat) +#define SIOCGNATS _IOR('r', 82, struct natstat) +#define SIOCGNATL _IOWR('r', 83, struct natlookup) +#define SIOCGFRST _IOR('r', 84, struct ipfrstat) +#define SIOCGIPST _IOR('r', 85, struct ips_stat) +#define SIOCFLNAT _IOWR('r', 86, int) +#define SIOCCNATL _IOWR('r', 87, int) +#else +#define SIOCADNAT _IOW(r, 80, struct ipnat) +#define SIOCRMNAT _IOW(r, 81, struct ipnat) +#define SIOCGNATS _IOR(r, 82, struct natstat) +#define SIOCGNATL _IOWR(r, 83, struct natlookup) +#define SIOCGFRST _IOR(r, 84, struct ipfrstat) +#define SIOCGIPST _IOR(r, 85, struct ips_stat) +#define SIOCFLNAT _IOWR(r, 86, int) +#define SIOCCNATL _IOWR(r, 87, int) +#endif + +#undef LARGE_NAT /* define this if you're setting up a system to NAT + * LARGE numbers of networks/hosts - i.e. in the + * hundreds or thousands. In such a case, you should + * also change the RDR_SIZE and NAT_SIZE below to more + * appropriate sizes. The figures below were used for + * a setup with 1000-2000 networks to NAT. + */ +#define NAT_SIZE 127 +#define RDR_SIZE 127 +#define NAT_TABLE_SZ 127 +#ifdef LARGE_NAT +#undef NAT_SIZE +#undef RDR_SIZE +#undef NAT_TABLE_SZ +#define NAT_SIZE 2047 +#define RDR_SIZE 2047 +#define NAT_TABLE_SZ 16383 +#endif +#ifndef APR_LABELLEN +#define APR_LABELLEN 16 +#endif + +#define DEF_NAT_AGE 1200 /* 10 minutes (600 seconds) */ + +typedef struct nat { + u_long nat_age; + int nat_flags; + u_32_t nat_sumd; + u_32_t nat_ipsumd; + void *nat_data; + void *nat_aps; /* proxy session */ + frentry_t *nat_fr; /* filter rule ptr if appropriate */ + struct in_addr nat_inip; + struct in_addr nat_outip; + struct in_addr nat_oip; /* other ip */ + U_QUAD_T nat_pkts; + U_QUAD_T nat_bytes; + u_short nat_oport; /* other port */ + u_short nat_inport; + u_short nat_outport; + u_short nat_use; + u_char nat_tcpstate[2]; + u_char nat_p; /* protocol for NAT */ + struct ipnat *nat_ptr; /* pointer back to the rule */ + struct nat *nat_next; + struct nat *nat_hnext[2]; + struct nat **nat_hstart[2]; + void *nat_ifp; + int nat_dir; +} nat_t; + +typedef struct ipnat { + struct ipnat *in_next; + struct ipnat *in_rnext; + struct ipnat *in_mnext; + void *in_ifp; + void *in_apr; + u_long in_space; + u_int in_use; + u_int in_hits; + struct in_addr in_nextip; + u_short in_pnext; + u_short in_ppip; /* ports per IP */ + u_short in_ippip; /* IP #'s per IP# */ + u_short in_flags; /* From here to in_dport must be reflected */ + u_short in_port[2]; /* correctly in IPN_CMPSIZ */ + struct in_addr in_in[2]; + struct in_addr in_out[2]; + struct in_addr in_src[2]; + int in_redir; /* 0 if it's a mapping, 1 if it's a hard redir */ + char in_ifname[IFNAMSIZ]; + char in_plabel[APR_LABELLEN]; /* proxy label */ + char in_p; /* protocol */ + u_short in_dport; +} ipnat_t; + +#define in_pmin in_port[0] /* Also holds static redir port */ +#define in_pmax in_port[1] +#define in_nip in_nextip.s_addr +#define in_inip in_in[0].s_addr +#define in_inmsk in_in[1].s_addr +#define in_outip in_out[0].s_addr +#define in_outmsk in_out[1].s_addr +#define in_srcip in_src[0].s_addr +#define in_srcmsk in_src[1].s_addr + +#define NAT_OUTBOUND 0 +#define NAT_INBOUND 1 + +#define NAT_MAP 0x01 +#define NAT_REDIRECT 0x02 +#define NAT_BIMAP (NAT_MAP|NAT_REDIRECT) +#define NAT_MAPBLK 0x04 + +#define MAPBLK_MINPORT 1024 /* don't use reserved ports for src port */ +#define USABLE_PORTS (65536 - MAPBLK_MINPORT) + +#define IPN_CMPSIZ (sizeof(ipnat_t) - offsetof(ipnat_t, in_flags)) + +typedef struct natlookup { + struct in_addr nl_inip; + struct in_addr nl_outip; + struct in_addr nl_realip; + int nl_flags; + u_short nl_inport; + u_short nl_outport; + u_short nl_realport; +} natlookup_t; + +typedef struct natstat { + u_long ns_mapped[2]; + u_long ns_rules; + u_long ns_added; + u_long ns_expire; + u_long ns_inuse; + u_long ns_logged; + u_long ns_logfail; + nat_t **ns_table[2]; + ipnat_t *ns_list; + void *ns_apslist; + u_int ns_nattab_sz; + u_int ns_rultab_sz; + u_int ns_rdrtab_sz; + nat_t *ns_instances; +} natstat_t; + +#define IPN_ANY 0x00 +#define IPN_TCP 0x01 +#define IPN_UDP 0x02 +#define IPN_TCPUDP (IPN_TCP|IPN_UDP) +#define IPN_DELETE 0x04 +#define IPN_ICMPERR 0x08 +#define IPN_RF (IPN_TCPUDP|IPN_DELETE|IPN_ICMPERR) +#define IPN_AUTOPORTMAP 0x10 +#define IPN_RANGE 0x20 +#define IPN_USERFLAGS (IPN_TCPUDP|IPN_AUTOPORTMAP|IPN_RANGE) + + +typedef struct natlog { + struct in_addr nl_origip; + struct in_addr nl_outip; + struct in_addr nl_inip; + u_short nl_origport; + u_short nl_outport; + u_short nl_inport; + u_short nl_type; + int nl_rule; + U_QUAD_T nl_pkts; + U_QUAD_T nl_bytes; +} natlog_t; + + +#define NL_NEWMAP NAT_MAP +#define NL_NEWRDR NAT_REDIRECT +#define NL_EXPIRE 0xffff + +#define NAT_HASH_FN(k,m) (((k) + ((k) >> 12)) % (m)) + +#define LONG_SUM(in) (((in) & 0xffff) + ((in) >> 16)) + +#define CALC_SUMD(s1, s2, sd) { \ + (s1) = ((s1) & 0xffff) + ((s1) >> 16); \ + (s2) = ((s2) & 0xffff) + ((s2) >> 16); \ + /* Do it twice */ \ + (s1) = ((s1) & 0xffff) + ((s1) >> 16); \ + (s2) = ((s2) & 0xffff) + ((s2) >> 16); \ + /* Because ~1 == -2, We really need ~1 == -1 */ \ + if ((s1) > (s2)) (s2)--; \ + (sd) = (s2) - (s1); \ + (sd) = ((sd) & 0xffff) + ((sd) >> 16); } + + +extern u_int ipf_nattable_sz; +extern u_int ipf_natrules_sz; +extern u_int ipf_rdrrules_sz; +extern void ip_natsync __P((void *)); +extern u_long fr_defnatage; +extern u_long fr_defnaticmpage; +extern nat_t **nat_table[2]; +extern nat_t *nat_instances; +extern ipnat_t **nat_rules; +extern ipnat_t **rdr_rules; +extern natstat_t nat_stats; +#if defined(__NetBSD__) || defined(__OpenBSD__) || (__FreeBSD_version >= 300003) +extern int nat_ioctl __P((caddr_t, u_long, int)); +#else +extern int nat_ioctl __P((caddr_t, int, int)); +#endif +extern int nat_init __P((void)); +extern nat_t *nat_new __P((ipnat_t *, ip_t *, fr_info_t *, u_int, int)); +extern nat_t *nat_outlookup __P((void *, u_int, u_int, struct in_addr, + struct in_addr, u_32_t)); +extern nat_t *nat_inlookup __P((void *, u_int, u_int, struct in_addr, + struct in_addr, u_32_t)); +extern nat_t *nat_maplookup __P((void *, u_int, struct in_addr, + struct in_addr)); +extern nat_t *nat_lookupredir __P((natlookup_t *)); +extern nat_t *nat_icmpinlookup __P((ip_t *, fr_info_t *)); +extern nat_t *nat_icmpin __P((ip_t *, fr_info_t *, u_int *)); + +extern int ip_natout __P((ip_t *, fr_info_t *)); +extern int ip_natin __P((ip_t *, fr_info_t *)); +extern void ip_natunload __P((void)), ip_natexpire __P((void)); +extern void nat_log __P((struct nat *, u_int)); +extern void fix_incksum __P((u_short *, u_32_t)); +extern void fix_outcksum __P((u_short *, u_32_t)); + +#endif /* __IP_NAT_H__ */ diff --git a/sys/contrib/ipfilter/netinet/ip_proxy.c b/sys/contrib/ipfilter/netinet/ip_proxy.c new file mode 100644 index 0000000..3a03863 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_proxy.c @@ -0,0 +1,388 @@ +/* + * Copyright (C) 1997-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + */ +#if !defined(lint) +/*static const char rcsid[] = "@(#)$Id: ip_proxy.c,v 2.2.2.1 1999/09/19 12:18:19 darrenr Exp $";*/ +static const char rcsid[] = "@(#)$FreeBSD$"; +#endif + +#if defined(__FreeBSD__) && defined(KERNEL) && !defined(_KERNEL) +# define _KERNEL +#endif + +#include <sys/errno.h> +#include <sys/types.h> +#include <sys/param.h> +#include <sys/time.h> +#include <sys/file.h> +#if !defined(__FreeBSD_version) +# include <sys/ioctl.h> +#endif +#include <sys/fcntl.h> +#include <sys/uio.h> +#if !defined(_KERNEL) && !defined(KERNEL) +# include <stdio.h> +# include <string.h> +# include <stdlib.h> +#endif +#ifndef linux +# include <sys/protosw.h> +#endif +#include <sys/socket.h> +#if defined(_KERNEL) +# if !defined(linux) +# include <sys/systm.h> +# else +# include <linux/string.h> +# endif +#endif +#if !defined(__SVR4) && !defined(__svr4__) +# ifndef linux +# include <sys/mbuf.h> +# endif +#else +# include <sys/byteorder.h> +# ifdef _KERNEL +# include <sys/dditypes.h> +# endif +# include <sys/stream.h> +# include <sys/kmem.h> +#endif +#if __FreeBSD__ > 2 +# include <sys/queue.h> +#endif +#include <net/if.h> +#ifdef sun +# include <net/af.h> +#endif +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#ifndef linux +# include <netinet/ip_var.h> +#endif +#include <netinet/tcp.h> +#include <netinet/udp.h> +#include <netinet/ip_icmp.h> +#include "netinet/ip_compat.h" +#include <netinet/tcpip.h> +#include "netinet/ip_fil.h" +#include "netinet/ip_proxy.h" +#include "netinet/ip_nat.h" +#include "netinet/ip_state.h" +#if (__FreeBSD_version >= 300000) +# include <sys/malloc.h> +#endif + + +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif + +static ap_session_t *appr_new_session __P((aproxy_t *, ip_t *, + fr_info_t *, nat_t *)); +static int appr_fixseqack __P((fr_info_t *, ip_t *, ap_session_t *, int )); + + +#define AP_SESS_SIZE 53 + +#if defined(_KERNEL) && !defined(linux) +#include "netinet/ip_ftp_pxy.c" +#include "netinet/ip_rcmd_pxy.c" +#include "netinet/ip_raudio_pxy.c" +#endif + +ap_session_t *ap_sess_tab[AP_SESS_SIZE]; +ap_session_t *ap_sess_list = NULL; +aproxy_t ap_proxies[] = { +#ifdef IPF_FTP_PROXY + { "ftp", (char)IPPROTO_TCP, 0, 0, ippr_ftp_init, NULL, + ippr_ftp_in, ippr_ftp_out }, +#endif +#ifdef IPF_RCMD_PROXY + { "rcmd", (char)IPPROTO_TCP, 0, 0, ippr_rcmd_init, ippr_rcmd_new, + NULL, ippr_rcmd_out }, +#endif +#ifdef IPF_RAUDIO_PROXY + { "raudio", (char)IPPROTO_TCP, 0, 0, ippr_raudio_init, + ippr_raudio_new, ippr_raudio_in, ippr_raudio_out }, +#endif + { "", '\0', 0, 0, NULL, NULL } +}; + + +int appr_ok(ip, tcp, nat) +ip_t *ip; +tcphdr_t *tcp; +ipnat_t *nat; +{ + aproxy_t *apr = nat->in_apr; + u_short dport = nat->in_dport; + + if (!apr || (apr->apr_flags & APR_DELETE) || + (ip->ip_p != apr->apr_p)) + return 0; + if ((tcp && (tcp->th_dport != dport)) || (!tcp && dport)) + return 0; + return 1; +} + + +/* + * Allocate a new application proxy structure and fill it in with the + * relevant details. call the init function once complete, prior to + * returning. + */ +static ap_session_t *appr_new_session(apr, ip, fin, nat) +aproxy_t *apr; +ip_t *ip; +fr_info_t *fin; +nat_t *nat; +{ + register ap_session_t *aps; + + if (!apr || (apr->apr_flags & APR_DELETE) || (ip->ip_p != apr->apr_p)) + return NULL; + + KMALLOC(aps, ap_session_t *); + if (!aps) + return NULL; + bzero((char *)aps, sizeof(*aps)); + aps->aps_next = ap_sess_list; + aps->aps_p = ip->ip_p; + aps->aps_data = NULL; + aps->aps_apr = apr; + aps->aps_psiz = 0; + ap_sess_list = aps; + aps->aps_nat = nat; + nat->nat_aps = aps; + if (apr->apr_new != NULL) + (void) (*apr->apr_new)(fin, ip, aps, nat); + return aps; +} + + +/* + * check to see if a packet should be passed through an active proxy routine + * if one has been setup for it. + */ +int appr_check(ip, fin, nat) +ip_t *ip; +fr_info_t *fin; +nat_t *nat; +{ + ap_session_t *aps; + aproxy_t *apr; + tcphdr_t *tcp = NULL; + u_32_t sum; + int err; + + if (nat->nat_aps == NULL) + nat->nat_aps = appr_new_session(nat->nat_ptr->in_apr, ip, + fin, nat); + aps = nat->nat_aps; + if ((aps != NULL) && (aps->aps_p == ip->ip_p)) { + if (ip->ip_p == IPPROTO_TCP) { + tcp = (tcphdr_t *)fin->fin_dp; + /* + * verify that the checksum is correct. If not, then + * don't do anything with this packet. + */ +#if SOLARIS && defined(_KERNEL) + sum = fr_tcpsum(fin->fin_qfm, ip, tcp); +#else + sum = fr_tcpsum(*(mb_t **)fin->fin_mp, ip, tcp); +#endif + if (sum != tcp->th_sum) { + frstats[fin->fin_out].fr_tcpbad++; + return -1; + } + } + + apr = aps->aps_apr; + err = 0; + if (fin->fin_out != 0) { + if (apr->apr_outpkt != NULL) + err = (*apr->apr_outpkt)(fin, ip, aps, nat); + } else { + if (apr->apr_inpkt != NULL) + err = (*apr->apr_inpkt)(fin, ip, aps, nat); + } + + if (tcp != NULL) { + err = appr_fixseqack(fin, ip, aps, err); +#if SOLARIS && defined(_KERNEL) + tcp->th_sum = fr_tcpsum(fin->fin_qfm, ip, tcp); +#else + tcp->th_sum = fr_tcpsum(*(mb_t **)fin->fin_mp, ip, tcp); +#endif + } + aps->aps_bytes += ip->ip_len; + aps->aps_pkts++; + return 2; + } + return -1; +} + + +aproxy_t *appr_match(pr, name) +u_int pr; +char *name; +{ + aproxy_t *ap; + + for (ap = ap_proxies; ap->apr_p; ap++) + if ((ap->apr_p == pr) && + !strncmp(name, ap->apr_label, sizeof(ap->apr_label))) { + ap->apr_ref++; + return ap; + } + return NULL; +} + + +void appr_free(ap) +aproxy_t *ap; +{ + ap->apr_ref--; +} + + +void aps_free(aps) +ap_session_t *aps; +{ + ap_session_t *a, **ap; + + if (!aps) + return; + + for (ap = &ap_sess_list; (a = *ap); ap = &a->aps_next) + if (a == aps) { + *ap = a->aps_next; + break; + } + + if (a) { + if ((aps->aps_data != NULL) && (aps->aps_psiz != 0)) + KFREES(aps->aps_data, aps->aps_psiz); + KFREE(aps); + } +} + + +static int appr_fixseqack(fin, ip, aps, inc) +fr_info_t *fin; +ip_t *ip; +ap_session_t *aps; +int inc; +{ + int sel, ch = 0, out, nlen; + u_32_t seq1, seq2; + tcphdr_t *tcp; + + tcp = (tcphdr_t *)fin->fin_dp; + out = fin->fin_out; + nlen = ip->ip_len; + nlen -= (ip->ip_hl << 2) + (tcp->th_off << 2); + + if (out != 0) { + seq1 = (u_32_t)ntohl(tcp->th_seq); + sel = aps->aps_sel[out]; + + /* switch to other set ? */ + if ((aps->aps_seqmin[!sel] > aps->aps_seqmin[sel]) && + (seq1 > aps->aps_seqmin[!sel])) + sel = aps->aps_sel[out] = !sel; + + if (aps->aps_seqoff[sel]) { + seq2 = aps->aps_seqmin[sel] - aps->aps_seqoff[sel]; + if (seq1 > seq2) { + seq2 = aps->aps_seqoff[sel]; + seq1 += seq2; + tcp->th_seq = htonl(seq1); + ch = 1; + } + } + + if (inc && (seq1 > aps->aps_seqmin[!sel])) { + aps->aps_seqmin[!sel] = seq1 + nlen - 1; + aps->aps_seqoff[!sel] = aps->aps_seqoff[sel] + inc; + } + + /***/ + + seq1 = ntohl(tcp->th_ack); + sel = aps->aps_sel[1 - out]; + + /* switch to other set ? */ + if ((aps->aps_ackmin[!sel] > aps->aps_ackmin[sel]) && + (seq1 > aps->aps_ackmin[!sel])) + sel = aps->aps_sel[1 - out] = !sel; + + if (aps->aps_ackoff[sel] && (seq1 > aps->aps_ackmin[sel])) { + seq2 = aps->aps_ackoff[sel]; + tcp->th_ack = htonl(seq1 - seq2); + ch = 1; + } + } else { + seq1 = ntohl(tcp->th_seq); + sel = aps->aps_sel[out]; + + /* switch to other set ? */ + if ((aps->aps_ackmin[!sel] > aps->aps_ackmin[sel]) && + (seq1 > aps->aps_ackmin[!sel])) + sel = aps->aps_sel[out] = !sel; + + if (aps->aps_ackoff[sel]) { + seq2 = aps->aps_ackmin[sel] - + aps->aps_ackoff[sel]; + if (seq1 > seq2) { + seq2 = aps->aps_ackoff[sel]; + seq1 += seq2; + tcp->th_seq = htonl(seq1); + ch = 1; + } + } + + if (inc && (seq1 > aps->aps_ackmin[!sel])) { + aps->aps_ackmin[!sel] = seq1 + nlen - 1; + aps->aps_ackoff[!sel] = aps->aps_ackoff[sel] + inc; + } + + /***/ + + seq1 = ntohl(tcp->th_ack); + sel = aps->aps_sel[1 - out]; + + /* switch to other set ? */ + if ((aps->aps_seqmin[!sel] > aps->aps_seqmin[sel]) && + (seq1 > aps->aps_seqmin[!sel])) + sel = aps->aps_sel[1 - out] = !sel; + + if (aps->aps_seqoff[sel] && (seq1 > aps->aps_seqmin[sel])) { + seq2 = aps->aps_seqoff[sel]; + tcp->th_ack = htonl(seq1 - seq2); + ch = 1; + } + } + return ch ? 2 : 0; +} + + +int appr_init() +{ + aproxy_t *ap; + int err = 0; + + for (ap = ap_proxies; ap->apr_p; ap++) { + err = (*ap->apr_init)(); + if (err != 0) + break; + } + return err; +} diff --git a/sys/contrib/ipfilter/netinet/ip_proxy.h b/sys/contrib/ipfilter/netinet/ip_proxy.h new file mode 100644 index 0000000..9ccd46a --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_proxy.h @@ -0,0 +1,130 @@ +/* + * Copyright (C) 1997-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + * + * $Id: ip_proxy.h,v 2.1.2.1 1999/09/19 12:18:20 darrenr Exp $ + * $FreeBSD$ + */ + +#ifndef __IP_PROXY_H__ +#define __IP_PROXY_H__ + +#ifndef SOLARIS +#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4))) +#endif + +#ifndef APR_LABELLEN +#define APR_LABELLEN 16 +#endif +#define AP_SESS_SIZE 53 + +struct nat; +struct ipnat; + +typedef struct ap_tcp { + u_short apt_sport; /* source port */ + u_short apt_dport; /* destination port */ + short apt_sel[2]; /* {seq,ack}{off,min} set selector */ + short apt_seqoff[2]; /* sequence # difference */ + tcp_seq apt_seqmin[2]; /* don't change seq-off until after this */ + short apt_ackoff[2]; /* sequence # difference */ + tcp_seq apt_ackmin[2]; /* don't change seq-off until after this */ + u_char apt_state[2]; /* connection state */ +} ap_tcp_t; + +typedef struct ap_udp { + u_short apu_sport; /* source port */ + u_short apu_dport; /* destination port */ +} ap_udp_t; + +typedef struct ap_session { + struct aproxy *aps_apr; + union { + struct ap_tcp apu_tcp; + struct ap_udp apu_udp; + } aps_un; + u_int aps_flags; + U_QUAD_T aps_bytes; /* bytes sent */ + U_QUAD_T aps_pkts; /* packets sent */ + void *aps_nat; /* pointer back to nat struct */ + void *aps_data; /* private data */ + int aps_p; /* protocol */ + int aps_psiz; /* size of private data */ + struct ap_session *aps_hnext; + struct ap_session *aps_next; +} ap_session_t ; + +#define aps_sport aps_un.apu_tcp.apt_sport +#define aps_dport aps_un.apu_tcp.apt_dport +#define aps_sel aps_un.apu_tcp.apt_sel +#define aps_seqoff aps_un.apu_tcp.apt_seqoff +#define aps_seqmin aps_un.apu_tcp.apt_seqmin +#define aps_state aps_un.apu_tcp.apt_state +#define aps_ackoff aps_un.apu_tcp.apt_ackoff +#define aps_ackmin aps_un.apu_tcp.apt_ackmin + + +typedef struct aproxy { + char apr_label[APR_LABELLEN]; /* Proxy label # */ + u_char apr_p; /* protocol */ + int apr_ref; /* +1 per rule referencing it */ + int apr_flags; + int (* apr_init) __P((void)); + int (* apr_new) __P((fr_info_t *, ip_t *, + ap_session_t *, struct nat *)); + int (* apr_inpkt) __P((fr_info_t *, ip_t *, + ap_session_t *, struct nat *)); + int (* apr_outpkt) __P((fr_info_t *, ip_t *, + ap_session_t *, struct nat *)); +} aproxy_t; + +#define APR_DELETE 1 + + +/* + * Real audio proxy structure and #defines + */ +typedef struct { + int rap_seenpna; + int rap_seenver; + int rap_version; + int rap_eos; /* End Of Startup */ + int rap_gotid; + int rap_gotlen; + int rap_mode; + int rap_sdone; + u_short rap_plport; + u_short rap_prport; + u_short rap_srport; + char rap_svr[19]; + u_32_t rap_sbf; /* flag to indicate which of the 19 bytes have + * been filled + */ + tcp_seq rap_sseq; +} raudio_t; + +#define RA_ID_END 0 +#define RA_ID_UDP 1 +#define RA_ID_ROBUST 7 + +#define RAP_M_UDP 1 +#define RAP_M_ROBUST 2 +#define RAP_M_TCP 4 +#define RAP_M_UDP_ROBUST (RAP_M_UDP|RAP_M_ROBUST) + + +extern ap_session_t *ap_sess_tab[AP_SESS_SIZE]; +extern ap_session_t *ap_sess_list; +extern aproxy_t ap_proxies[]; + +extern int appr_init __P((void)); +extern int appr_ok __P((ip_t *, tcphdr_t *, struct ipnat *)); +extern void appr_free __P((aproxy_t *)); +extern void aps_free __P((ap_session_t *)); +extern int appr_check __P((ip_t *, fr_info_t *, struct nat *)); +extern aproxy_t *appr_match __P((u_int, char *)); + +#endif /* __IP_PROXY_H__ */ diff --git a/sys/contrib/ipfilter/netinet/ip_raudio_pxy.c b/sys/contrib/ipfilter/netinet/ip_raudio_pxy.c new file mode 100644 index 0000000..b76eea5 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_raudio_pxy.c @@ -0,0 +1,274 @@ +/* + * $Id$ + * $FreeBSD$ + */ +#if SOLARIS && defined(_KERNEL) +extern kmutex_t ipf_rw; +#endif + +#define IPF_RAUDIO_PROXY + + +int ippr_raudio_init __P((void)); +int ippr_raudio_new __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *)); +int ippr_raudio_in __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *)); +int ippr_raudio_out __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *)); + +static frentry_t raudiofr; + + +/* + * Real Audio application proxy initialization. + */ +int ippr_raudio_init() +{ + bzero((char *)&raudiofr, sizeof(raudiofr)); + raudiofr.fr_ref = 1; + raudiofr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE; + return 0; +} + + +/* + * Setup for a new proxy to handle Real Audio. + */ +int ippr_raudio_new(fin, ip, aps, nat) +fr_info_t *fin; +ip_t *ip; +ap_session_t *aps; +nat_t *nat; +{ + raudio_t *rap; + + + KMALLOCS(aps->aps_data, void *, sizeof(raudio_t)); + if (aps->aps_data != NULL) { + bzero(aps->aps_data, sizeof(raudio_t)); + rap = aps->aps_data; + aps->aps_psiz = sizeof(raudio_t); + rap->rap_mode = RAP_M_TCP; /* default is for TCP */ + } + return 0; +} + + + +int ippr_raudio_out(fin, ip, aps, nat) +fr_info_t *fin; +ip_t *ip; +ap_session_t *aps; +nat_t *nat; +{ + char membuf[512 + 1], *s; + int off, dlen, inc = 0; + tcphdr_t *tcp, tcph, *tcp2 = &tcph; + raudio_t *rap = aps->aps_data; + u_short sp, dp, id = 0; + struct in_addr swip; + fr_info_t fi; + int len = 0; + nat_t *ipn; + mb_t *m; +#if SOLARIS + mb_t *m1; +#endif + + /* + * If we've already processed the start messages, then nothing left + * for the proxy to do. + */ + if (rap->rap_eos == 1) + return 0; + + tcp = (tcphdr_t *)fin->fin_dp; + off = (ip->ip_hl << 2) + (tcp->th_off << 2); + bzero(membuf, sizeof(membuf)); +#if SOLARIS + m = fin->fin_qfm; + + dlen = msgdsize(m) - off; + if (dlen <= 0) + return 0; + copyout_mblk(m, off, MIN(sizeof(membuf), dlen), membuf); +#else + m = *(mb_t **)fin->fin_mp; + + dlen = mbufchainlen(m) - off; + if (dlen <= 0) + return 0; + m_copydata(m, off, MIN(sizeof(membuf), dlen), membuf); +#endif + /* + * In all the startup parsing, ensure that we don't go outside + * the packet buffer boundary. + */ + /* + * Look for the start of connection "PNA" string if not seen yet. + */ + if (rap->rap_seenpna == 0) { + s = memstr("PNA", membuf, 3, dlen); + if (s == NULL) + return 0; + s += 3; + rap->rap_seenpna = 1; + } else + s = membuf; + + /* + * Directly after the PNA will be the version number of this + * connection. + */ + if (rap->rap_seenpna == 1 && rap->rap_seenver == 0) { + if ((s + 1) - membuf < dlen) { + rap->rap_version = (*s << 8) | *(s + 1); + s += 2; + rap->rap_seenver = 1; + } else + return 0; + } + + /* + * Now that we've been past the PNA and version number, we're into the + * startup messages block. This ends when a message with an ID of 0. + */ + while ((rap->rap_eos == 0) && ((s + 1) - membuf < dlen)) { + if (rap->rap_gotid == 0) { + id = (*s << 8) | *(s + 1); + s += 2; + rap->rap_gotid = 1; + if (id == RA_ID_END) { + rap->rap_eos = 1; + break; + } + } else if (rap->rap_gotlen == 0) { + len = (*s << 8) | *(s + 1); + s += 2; + rap->rap_gotlen = 1; + } + + if (rap->rap_gotid == 1 && rap->rap_gotlen == 1) { + if (id == RA_ID_UDP) { + rap->rap_mode &= ~RAP_M_TCP; + rap->rap_mode |= RAP_M_UDP; + rap->rap_plport = (*s << 8) | *(s + 1); + } else if (id == RA_ID_ROBUST) { + rap->rap_mode |= RAP_M_ROBUST; + rap->rap_prport = (*s << 8) | *(s + 1); + } + s += len; + rap->rap_gotlen = 0; + rap->rap_gotid = 0; + } + } + + /* + * Wait until we've seen the end of the start messages and even then + * only proceed further if we're using UDP. + */ + if ((rap->rap_eos == 0) || ((rap->rap_mode & RAP_M_UDP) != RAP_M_UDP)) + return 0; + sp = rap->rap_plport; + dp = 0; + + bcopy((char *)fin, (char *)&fi, sizeof(fi)); + bzero((char *)tcp2, sizeof(*tcp2)); + tcp2->th_sport = htons(sp); + tcp2->th_dport = 0; /* XXX - don't specify remote port */ + tcp2->th_win = htons(8192); + fi.fin_dp = (char *)tcp2; + fi.fin_data[0] = sp; + fi.fin_data[1] = 0; + fi.fin_fr = &raudiofr; + swip = ip->ip_src; + ip->ip_src = nat->nat_inip; + ipn = nat_new(nat->nat_ptr, ip, &fi, IPN_TCP|FI_W_DPORT, NAT_OUTBOUND); + if (ipn != NULL) { + ipn->nat_age = fr_defnatage; + (void) fr_addstate(ip, &fi, FI_W_DPORT); + } + ip->ip_src = swip; + + if ((rap->rap_mode & RAP_M_UDP_ROBUST) == RAP_M_UDP_ROBUST) { + sp = rap->rap_prport; + } + return inc; +} + + +int ippr_raudio_in(fin, ip, aps, nat) +fr_info_t *fin; +ip_t *ip; +ap_session_t *aps; +nat_t *nat; +{ + char membuf[IPF_MAXPORTLEN + 1], *s; + int off, dlen; + raudio_t *rap = aps->aps_data; + u_int a1, a2, a3, a4; + tcphdr_t *tcp; + tcp_seq seq; + mb_t *m; +#if SOLARIS + mb_t *m1; +#endif + + if ((rap->rap_sdone != 0) || + ((rap->rap_mode & RAP_M_UDP_ROBUST) != RAP_M_UDP_ROBUST)) + return 0; + + tcp = (tcphdr_t *)fin->fin_dp; + off = (ip->ip_hl << 2) + (tcp->th_off << 2); + m = *(mb_t **)fin->fin_mp; + +#if SOLARIS + m = fin->fin_qfm; + + dlen = msgdsize(m) - off; + if (dlen <= 0) + return 0; + bzero(membuf, sizeof(membuf)); + copyout_mblk(m, off, MIN(sizeof(membuf), dlen), membuf); +#else + dlen = mbufchainlen(m) - off; + if (dlen <= 0) + return 0; + bzero(membuf, sizeof(membuf)); + m_copydata(m, off, MIN(sizeof(membuf), dlen), membuf); +#endif + + seq = ntohl(tcp->th_seq); + /* + * Check to see if the data in this packet is of interest to us. + * We only care for the first 19 bytes coming back from the server. + */ + if (rap->rap_sseq == 0) { + s = memstr("PNA", membuf, 3, dlen); + if (s == NULL) + return 0; + a1 = s - membuf; + dlen -= a1; + a1 = 0; + rap->rap_sseq = seq; + a2 = MIN(dlen, sizeof(rap->rap_svr)); + } else if (seq <= rap->rap_sseq + sizeof(rap->rap_svr)) { + /* + * seq # which is the start of data and from that the offset + * into the buffer array. + */ + a1 = seq - rap->rap_sseq; + a2 = MIN(dlen, sizeof(rap->rap_svr)); + a2 -= a1; + s = membuf; + } else + return 0; + + for (a3 = a1, a4 = a2; a4 > 0; a4--, a3++) { + rap->rap_sbf |= (1 << a3); + rap->rap_svr[a3] = *s++; + } + if (rap->rap_sbf == 0x7ffff) { /* 19 bits */ + s = rap->rap_svr + 13; + rap->rap_srport = (*s << 8) | *(s + 1); + } + return 0; +} diff --git a/sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c b/sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c new file mode 100644 index 0000000..f9dc5b3 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c @@ -0,0 +1,160 @@ +/* + * $Id$ + * $FreeBSD$ + */ +/* + * Simple RCMD transparent proxy for in-kernel use. For use with the NAT + * code. + */ +#if SOLARIS && defined(_KERNEL) +extern kmutex_t ipf_rw; +#endif + +#define isdigit(x) ((x) >= '0' && (x) <= '9') + +#define IPF_RCMD_PROXY + + +int ippr_rcmd_init __P((void)); +int ippr_rcmd_new __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *)); +int ippr_rcmd_out __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *)); +u_short ipf_rcmd_atoi __P((char *)); +int ippr_rcmd_portmsg __P((fr_info_t *, ip_t *, ap_session_t *, nat_t *)); + +static frentry_t rcmdfr; + + +/* + * RCMD application proxy initialization. + */ +int ippr_rcmd_init() +{ + bzero((char *)&rcmdfr, sizeof(rcmdfr)); + rcmdfr.fr_ref = 1; + rcmdfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE; + return 0; +} + + +/* + * Setup for a new RCMD proxy. + */ +int ippr_rcmd_new(fin, ip, aps, nat) +fr_info_t *fin; +ip_t *ip; +ap_session_t *aps; +nat_t *nat; +{ + tcphdr_t *tcp = (tcphdr_t *)fin->fin_dp; + + aps->aps_psiz = sizeof(u_32_t); + KMALLOCS(aps->aps_data, u_32_t *, sizeof(u_32_t)); + if (aps->aps_data == NULL) + return -1; + *(u_32_t *)aps->aps_data = 0; + aps->aps_sport = tcp->th_sport; + aps->aps_dport = tcp->th_dport; + return 0; +} + + +/* + * ipf_rcmd_atoi - implement a simple version of atoi + */ +u_short ipf_rcmd_atoi(ptr) +char *ptr; +{ + register char *s = ptr, c; + register u_short i = 0; + + while ((c = *s++) && isdigit(c)) { + i *= 10; + i += c - '0'; + } + return i; +} + + +int ippr_rcmd_portmsg(fin, ip, aps, nat) +fr_info_t *fin; +ip_t *ip; +ap_session_t *aps; +nat_t *nat; +{ + char portbuf[8], *s; + struct in_addr swip; + u_short sp, dp; + int off, dlen; + tcphdr_t *tcp, tcph, *tcp2 = &tcph; + fr_info_t fi; + nat_t *ipn; + mb_t *m; +#if SOLARIS + mb_t *m1; +#endif + + tcp = (tcphdr_t *)fin->fin_dp; + off = (ip->ip_hl << 2) + (tcp->th_off << 2); + m = *(mb_t **)fin->fin_mp; + +#if SOLARIS + m = fin->fin_qfm; + + dlen = msgdsize(m) - off; + bzero(portbuf, sizeof(portbuf)); + copyout_mblk(m, off, MIN(sizeof(portbuf), dlen), portbuf); +#else + dlen = mbufchainlen(m) - off; + bzero(portbuf, sizeof(portbuf)); + m_copydata(m, off, MIN(sizeof(portbuf), dlen), portbuf); +#endif + if ((*(u_32_t *)aps->aps_data != 0) && + (tcp->th_seq != *(u_32_t *)aps->aps_data)) + return 0; + + portbuf[sizeof(portbuf) - 1] = '\0'; + s = portbuf; + sp = ipf_rcmd_atoi(s); + if (!sp) + return 0; + + /* + * Add skeleton NAT entry for connection which will come back the + * other way. + */ + sp = htons(sp); + dp = htons(fin->fin_data[1]); + ipn = nat_outlookup(fin->fin_ifp, IPN_TCP, nat->nat_p, nat->nat_inip, + ip->ip_dst, (dp << 16) | sp); + if (ipn == NULL) { + bcopy((char *)fin, (char *)&fi, sizeof(fi)); + bzero((char *)tcp2, sizeof(*tcp2)); + tcp2->th_win = htons(8192); + tcp2->th_sport = sp; + tcp2->th_dport = 0; /* XXX - don't specify remote port */ + fi.fin_data[0] = ntohs(sp); + fi.fin_data[1] = 0; + fi.fin_dp = (char *)tcp2; + swip = ip->ip_src; + ip->ip_src = nat->nat_inip; + ipn = nat_new(nat->nat_ptr, ip, &fi, IPN_TCP|FI_W_DPORT, + NAT_OUTBOUND); + if (ipn != NULL) { + ipn->nat_age = fr_defnatage; + fi.fin_fr = &rcmdfr; + (void) fr_addstate(ip, &fi, FI_W_DPORT); + } + ip->ip_src = swip; + } + return 0; +} + + +int ippr_rcmd_out(fin, ip, aps, nat) +fr_info_t *fin; +ip_t *ip; +ap_session_t *aps; +nat_t *nat; +{ + return ippr_rcmd_portmsg(fin, ip, aps, nat); +} diff --git a/sys/contrib/ipfilter/netinet/ip_state.c b/sys/contrib/ipfilter/netinet/ip_state.c new file mode 100644 index 0000000..95e8793 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_state.c @@ -0,0 +1,1105 @@ +/* + * Copyright (C) 1995-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + */ +#if !defined(lint) +static const char sccsid[] = "@(#)ip_state.c 1.8 6/5/96 (C) 1993-1995 Darren Reed"; +/*static const char rcsid[] = "@(#)$Id: ip_state.c,v 2.3.2.9 1999/10/21 14:31:09 darrenr Exp $";*/ +static const char rcsid[] = "@(#)$FreeBSD$"; +#endif + +#include <sys/errno.h> +#include <sys/types.h> +#include <sys/param.h> +#include <sys/file.h> +#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \ + defined(_KERNEL) +# include "opt_ipfilter_log.h" +#endif +#if !defined(_KERNEL) && !defined(KERNEL) && !defined(__KERNEL__) +# include <stdio.h> +# include <stdlib.h> +# include <string.h> +#else +# ifdef linux +# include <linux/kernel.h> +# include <linux/module.h> +# endif +#endif +#if defined(KERNEL) && (__FreeBSD_version >= 220000) +# include <sys/filio.h> +# include <sys/fcntl.h> +# if (__FreeBSD_version >= 300000) && !defined(IPFILTER_LKM) +# include "opt_ipfilter.h" +# endif +#else +# include <sys/ioctl.h> +#endif +#include <sys/time.h> +#include <sys/uio.h> +#ifndef linux +# include <sys/protosw.h> +#endif +#include <sys/socket.h> +#if (defined(_KERNEL) || defined(KERNEL)) && !defined(linux) +# include <sys/systm.h> +#endif +#if !defined(__SVR4) && !defined(__svr4__) +# ifndef linux +# include <sys/mbuf.h> +# endif +#else +# include <sys/filio.h> +# include <sys/byteorder.h> +# ifdef _KERNEL +# include <sys/dditypes.h> +# endif +# include <sys/stream.h> +# include <sys/kmem.h> +#endif + +#include <net/if.h> +#ifdef sun +# include <net/af.h> +#endif +#include <net/route.h> +#include <netinet/in.h> +#include <netinet/in_systm.h> +#include <netinet/ip.h> +#include <netinet/tcp.h> +#ifndef linux +# include <netinet/ip_var.h> +# include <netinet/tcp_fsm.h> +#endif +#include <netinet/udp.h> +#include <netinet/ip_icmp.h> +#include "netinet/ip_compat.h" +#include <netinet/tcpip.h> +#include "netinet/ip_fil.h" +#include "netinet/ip_nat.h" +#include "netinet/ip_frag.h" +#include "netinet/ip_proxy.h" +#include "netinet/ip_state.h" +#if (__FreeBSD_version >= 300000) +# include <sys/malloc.h> +# if (defined(_KERNEL) || defined(KERNEL)) && !defined(IPFILTER_LKM) +# include <sys/libkern.h> +# include <sys/systm.h> +# endif +#endif + +#ifndef MIN +# define MIN(a,b) (((a)<(b))?(a):(b)) +#endif + +#define TCP_CLOSE (TH_FIN|TH_RST) + +static ipstate_t **ips_table = NULL; +static int ips_num = 0; +static ips_stat_t ips_stats; +#if (SOLARIS || defined(__sgi)) && defined(_KERNEL) +extern KRWLOCK_T ipf_state, ipf_mutex; +extern kmutex_t ipf_rw; +#endif + +static int fr_matchsrcdst __P((ipstate_t *, struct in_addr, struct in_addr, + fr_info_t *, tcphdr_t *)); +static frentry_t *fr_checkicmpmatchingstate __P((ip_t *, fr_info_t *)); +static int fr_state_flush __P((int)); +static ips_stat_t *fr_statetstats __P((void)); +static void fr_delstate __P((ipstate_t *)); + + +#define FIVE_DAYS (2 * 5 * 86400) /* 5 days: half closed session */ + +#define TCP_MSL 240 /* 2 minutes */ +u_long fr_tcpidletimeout = FIVE_DAYS, + fr_tcpclosewait = 2 * TCP_MSL, + fr_tcplastack = 2 * TCP_MSL, + fr_tcptimeout = 2 * TCP_MSL, + fr_tcpclosed = 1, + fr_udptimeout = 240, + fr_icmptimeout = 120; +int fr_statemax = IPSTATE_MAX, + fr_statesize = IPSTATE_SIZE; +int fr_state_doflush = 0; + + +int fr_stateinit() +{ + KMALLOCS(ips_table, ipstate_t **, fr_statesize * sizeof(ipstate_t *)); + if (ips_table != NULL) + bzero((char *)ips_table, fr_statesize * sizeof(ipstate_t *)); + else + return -1; + return 0; +} + + +static ips_stat_t *fr_statetstats() +{ + ips_stats.iss_active = ips_num; + ips_stats.iss_table = ips_table; + return &ips_stats; +} + + +/* + * flush state tables. two actions currently defined: + * which == 0 : flush all state table entries + * which == 1 : flush TCP connections which have started to close but are + * stuck for some reason. + */ +static int fr_state_flush(which) +int which; +{ + register int i; + register ipstate_t *is, **isp; +#if defined(_KERNEL) && !SOLARIS + int s; +#endif + int delete, removed = 0; + + SPL_NET(s); + WRITE_ENTER(&ipf_state); + for (i = fr_statesize - 1; i >= 0; i--) + for (isp = &ips_table[i]; (is = *isp); ) { + delete = 0; + + switch (which) + { + case 0 : + delete = 1; + break; + case 1 : + if ((is->is_p == IPPROTO_TCP) && + (((is->is_state[0] <= TCPS_ESTABLISHED) && + (is->is_state[1] > TCPS_ESTABLISHED)) || + ((is->is_state[1] <= TCPS_ESTABLISHED) && + (is->is_state[0] > TCPS_ESTABLISHED)))) + delete = 1; + break; + } + + if (delete) { + *isp = is->is_next; + if (is->is_p == IPPROTO_TCP) + ips_stats.iss_fin++; + else + ips_stats.iss_expire++; + if (ips_table[i] == NULL) + ips_stats.iss_inuse--; +#ifdef IPFILTER_LOG + ipstate_log(is, ISL_FLUSH); +#endif + fr_delstate(is); + ips_num--; + removed++; + } else + isp = &is->is_next; + } + if (fr_state_doflush) { + (void) fr_state_flush(1); + fr_state_doflush = 0; + } + RWLOCK_EXIT(&ipf_state); + SPL_X(s); + return removed; +} + + +int fr_state_ioctl(data, cmd, mode) +caddr_t data; +#if defined(__NetBSD__) || defined(__OpenBSD__) +u_long cmd; +#else +int cmd; +#endif +int mode; +{ + int arg, ret, error = 0; + + switch (cmd) + { + case SIOCIPFFL : + IRCOPY(data, (caddr_t)&arg, sizeof(arg)); + if (arg == 0 || arg == 1) { + ret = fr_state_flush(arg); + IWCOPY((caddr_t)&ret, data, sizeof(ret)); + } else + error = EINVAL; + break; + case SIOCGIPST : + IWCOPY((caddr_t)fr_statetstats(), data, sizeof(ips_stat_t)); + break; + case FIONREAD : +#ifdef IPFILTER_LOG + IWCOPY((caddr_t)&iplused[IPL_LOGSTATE], (caddr_t)data, + sizeof(iplused[IPL_LOGSTATE])); +#endif + break; + default : + error = EINVAL; + break; + } + return error; +} + + +/* + * Create a new ipstate structure and hang it off the hash table. + */ +ipstate_t *fr_addstate(ip, fin, flags) +ip_t *ip; +fr_info_t *fin; +u_int flags; +{ + register ipstate_t *is; + register u_int hv; + ipstate_t ips; + u_int pass; + + if ((ip->ip_off & IP_OFFMASK) || (fin->fin_fi.fi_fl & FI_SHORT)) + return NULL; + if (ips_num == fr_statemax) { + ips_stats.iss_max++; + fr_state_doflush = 1; + return NULL; + } + is = &ips; + bzero((char *)is, sizeof(*is)); + ips.is_age = 1; + ips.is_state[0] = 0; + ips.is_state[1] = 0; + /* + * Copy and calculate... + */ + hv = (is->is_p = ip->ip_p); + hv += (is->is_src.s_addr = ip->ip_src.s_addr); + hv += (is->is_dst.s_addr = ip->ip_dst.s_addr); + + switch (ip->ip_p) + { + case IPPROTO_ICMP : + { + struct icmp *ic = (struct icmp *)fin->fin_dp; + + switch (ic->icmp_type) + { + case ICMP_ECHO : + is->is_icmp.ics_type = ICMP_ECHOREPLY; /* XXX */ + hv += (is->is_icmp.ics_id = ic->icmp_id); + hv += (is->is_icmp.ics_seq = ic->icmp_seq); + break; + case ICMP_TSTAMP : + case ICMP_IREQ : + case ICMP_MASKREQ : + is->is_icmp.ics_type = ic->icmp_type + 1; + break; + default : + return NULL; + } + ATOMIC_INC(ips_stats.iss_icmp); + is->is_age = fr_icmptimeout; + break; + } + case IPPROTO_TCP : + { + register tcphdr_t *tcp = (tcphdr_t *)fin->fin_dp; + + /* + * The endian of the ports doesn't matter, but the ack and + * sequence numbers do as we do mathematics on them later. + */ + is->is_dport = tcp->th_dport; + is->is_sport = tcp->th_sport; + if ((flags & (FI_W_DPORT|FI_W_SPORT)) == 0) { + hv += tcp->th_dport; + hv += tcp->th_sport; + } + if (tcp->th_seq != 0) { + is->is_send = ntohl(tcp->th_seq) + ip->ip_len - + fin->fin_hlen - (tcp->th_off << 2) + + ((tcp->th_flags & TH_SYN) ? 1 : 0) + + ((tcp->th_flags & TH_FIN) ? 1 : 0); + is->is_maxsend = is->is_send + 1; + } + is->is_dend = 0; + is->is_maxswin = ntohs(tcp->th_win); + if (is->is_maxswin == 0) + is->is_maxswin = 1; + /* + * If we're creating state for a starting connection, start the + * timer on it as we'll never see an error if it fails to + * connect. + */ + MUTEX_ENTER(&ipf_rw); + ips_stats.iss_tcp++; + fr_tcp_age(&is->is_age, is->is_state, ip, fin, + tcp->th_sport == is->is_sport); + MUTEX_EXIT(&ipf_rw); + break; + } + case IPPROTO_UDP : + { + register tcphdr_t *tcp = (tcphdr_t *)fin->fin_dp; + + if ((flags & (FI_W_DPORT|FI_W_SPORT)) == 0) { + hv += (is->is_dport = tcp->th_dport); + hv += (is->is_sport = tcp->th_sport); + } + ATOMIC_INC(ips_stats.iss_udp); + is->is_age = fr_udptimeout; + break; + } + default : + return NULL; + } + + KMALLOC(is, ipstate_t *); + if (is == NULL) { + ATOMIC_INC(ips_stats.iss_nomem); + return NULL; + } + bcopy((char *)&ips, (char *)is, sizeof(*is)); + hv %= fr_statesize; + RW_UPGRADE(&ipf_mutex); + is->is_rule = fin->fin_fr; + if (is->is_rule != NULL) { + is->is_rule->fr_ref++; + pass = is->is_rule->fr_flags; + } else + pass = fr_flags; + MUTEX_DOWNGRADE(&ipf_mutex); + WRITE_ENTER(&ipf_state); + + is->is_rout = pass & FR_OUTQUE ? 1 : 0; + is->is_pass = pass; + is->is_pkts = 1; + is->is_bytes = ip->ip_len; + /* + * We want to check everything that is a property of this packet, + * but we don't (automatically) care about it's fragment status as + * this may change. + */ + is->is_opt = fin->fin_fi.fi_optmsk; + is->is_optmsk = 0xffffffff; + is->is_sec = fin->fin_fi.fi_secmsk; + is->is_secmsk = 0xffff; + is->is_auth = fin->fin_fi.fi_auth; + is->is_authmsk = 0xffff; + is->is_flags = fin->fin_fi.fi_fl & FI_CMP; + is->is_flags |= FI_CMP << 4; + is->is_flags |= flags & (FI_W_DPORT|FI_W_SPORT); + /* + * add into table. + */ + is->is_next = ips_table[hv]; + ips_table[hv] = is; + if (is->is_next == NULL) + ips_stats.iss_inuse++; + if (fin->fin_out) { + is->is_ifpin = NULL; + is->is_ifpout = fin->fin_ifp; + } else { + is->is_ifpin = fin->fin_ifp; + is->is_ifpout = NULL; + } + if (pass & FR_LOGFIRST) + is->is_pass &= ~(FR_LOGFIRST|FR_LOG); + ATOMIC_INC(ips_num); +#ifdef IPFILTER_LOG + ipstate_log(is, ISL_NEW); +#endif + RWLOCK_EXIT(&ipf_state); + fin->fin_rev = (is->is_dst.s_addr != ip->ip_dst.s_addr); + if (fin->fin_fi.fi_fl & FI_FRAG) + ipfr_newfrag(ip, fin, pass ^ FR_KEEPSTATE); + return is; +} + + + +/* + * check to see if a packet with TCP headers fits within the TCP window. + * change timeout depending on whether new packet is a SYN-ACK returning for a + * SYN or a RST or FIN which indicate time to close up shop. + */ +int fr_tcpstate(is, fin, ip, tcp) +register ipstate_t *is; +fr_info_t *fin; +ip_t *ip; +tcphdr_t *tcp; +{ + register tcp_seq seq, ack, end; + register int ackskew; + tcpdata_t *fdata, *tdata; + u_short win, maxwin; + int ret = 0; + int source; + + /* + * Find difference between last checked packet and this packet. + */ + source = (ip->ip_src.s_addr == is->is_src.s_addr); + fdata = &is->is_tcp.ts_data[!source]; + tdata = &is->is_tcp.ts_data[source]; + seq = ntohl(tcp->th_seq); + ack = ntohl(tcp->th_ack); + win = ntohs(tcp->th_win); + end = seq + ip->ip_len - fin->fin_hlen - (tcp->th_off << 2) + + ((tcp->th_flags & TH_SYN) ? 1 : 0) + + ((tcp->th_flags & TH_FIN) ? 1 : 0); + + if (fdata->td_end == 0) { + /* + * Must be a (outgoing) SYN-ACK in reply to a SYN. + */ + fdata->td_end = end; + fdata->td_maxwin = 1; + fdata->td_maxend = end + 1; + } + + if (!(tcp->th_flags & TH_ACK)) { /* Pretend an ack was sent */ + ack = tdata->td_end; + win = 1; + } else if (((tcp->th_flags & (TH_ACK|TH_RST)) == (TH_ACK|TH_RST)) && + (ack == 0)) { + /* gross hack to get around certain broken tcp stacks */ + ack = tdata->td_end; + } + + if (seq == end) + seq = end = fdata->td_end; + + maxwin = tdata->td_maxwin; + ackskew = tdata->td_end - ack; + +#define SEQ_GE(a,b) ((int)((a) - (b)) >= 0) +#define SEQ_GT(a,b) ((int)((a) - (b)) > 0) + if ((SEQ_GE(fdata->td_maxend, end)) && + (SEQ_GE(seq + maxwin, fdata->td_end - maxwin)) && +/* XXX what about big packets */ +#define MAXACKWINDOW 66000 + (ackskew >= -MAXACKWINDOW) && + (ackskew <= MAXACKWINDOW)) { + /* if ackskew < 0 then this should be due to fragented + * packets. There is no way to know the length of the + * total packet in advance. + * We do know the total length from the fragment cache though. + * Note however that there might be more sessions with + * exactly the same source and destination paramters in the + * state cache (and source and destination is the only stuff + * that is saved in the fragment cache). Note further that + * some TCP connections in the state cache are hashed with + * sport and dport as well which makes it not worthwhile to + * look for them. + * Thus, when ackskew is negative but still seems to belong + * to this session, we bump up the destinations end value. + */ + if (ackskew < 0) + tdata->td_end = ack; + + /* update max window seen */ + if (fdata->td_maxwin < win) + fdata->td_maxwin = win; + if (SEQ_GT(end, fdata->td_end)) + fdata->td_end = end; + if (SEQ_GE(ack + win, tdata->td_maxend)) { + tdata->td_maxend = ack + win; + if (win == 0) + tdata->td_maxend++; + } + + ATOMIC_INC(ips_stats.iss_hits); + is->is_pkts++; + is->is_bytes += ip->ip_len; + /* + * Nearing end of connection, start timeout. + */ + MUTEX_ENTER(&ipf_rw); + fr_tcp_age(&is->is_age, is->is_state, ip, fin, source); + MUTEX_EXIT(&ipf_rw); + ret = 1; + } + return ret; +} + + +static int fr_matchsrcdst(is, src, dst, fin, tcp) +ipstate_t *is; +struct in_addr src, dst; +fr_info_t *fin; +tcphdr_t *tcp; +{ + int ret = 0, rev, out, flags; + u_short sp, dp; + void *ifp; + + rev = fin->fin_rev = (is->is_dst.s_addr != dst.s_addr); + ifp = fin->fin_ifp; + out = fin->fin_out; + + if (tcp != NULL) { + flags = is->is_flags; + sp = tcp->th_sport; + dp = tcp->th_dport; + } else { + flags = 0; + sp = 0; + dp = 0; + } + + if (rev == 0) { + if (!out) { + if (is->is_ifpin == ifp) + ret = 1; + } else { + if (is->is_ifpout == NULL || is->is_ifpout == ifp) + ret = 1; + } + } else { + if (out) { + if (is->is_ifpin == ifp) + ret = 1; + } else { + if (is->is_ifpout == NULL || is->is_ifpout == ifp) + ret = 1; + } + } + if (ret == 0) + return 0; + ret = 0; + + if (rev == 0) { + if ((is->is_dst.s_addr == dst.s_addr) && + (is->is_src.s_addr == src.s_addr) && + (!tcp || ((sp == is->is_sport || flags & FI_W_SPORT) && + (dp == is->is_dport || flags & FI_W_DPORT)))) { + ret = 1; + } + } else { + if ((is->is_dst.s_addr == src.s_addr) && + (is->is_src.s_addr == dst.s_addr) && + (!tcp || ((sp == is->is_dport || flags & FI_W_DPORT) && + (dp == is->is_sport || flags & FI_W_SPORT)))) { + ret = 1; + } + } + if (ret == 0) + return 0; + + /* + * Whether or not this should be here, is questionable, but the aim + * is to get this out of the main line. + */ + if (tcp == NULL) + flags = is->is_flags & (FI_CMP|(FI_CMP<<4)); + + if (((fin->fin_fi.fi_fl & (flags >> 4)) != (flags & FI_CMP)) || + ((fin->fin_fi.fi_optmsk & is->is_optmsk) != is->is_opt) || + ((fin->fin_fi.fi_secmsk & is->is_secmsk) != is->is_sec) || + ((fin->fin_fi.fi_auth & is->is_authmsk) != is->is_auth)) + return 0; + + if ((flags & (FI_W_SPORT|FI_W_DPORT))) { + if ((flags & FI_W_SPORT) != 0) { + if (rev == 0) { + is->is_sport = sp; + is->is_send = htonl(tcp->th_seq); + } else { + is->is_sport = dp; + is->is_send = htonl(tcp->th_ack); + } + is->is_maxsend = is->is_send + 1; + } else if ((flags & FI_W_DPORT) != 0) { + if (rev == 0) { + is->is_dport = dp; + is->is_dend = htonl(tcp->th_ack); + } else { + is->is_dport = sp; + is->is_dend = htonl(tcp->th_seq); + } + is->is_maxdend = is->is_dend + 1; + } + is->is_flags &= ~(FI_W_SPORT|FI_W_DPORT); + } + + if (!rev) { + if (out && (out == is->is_rout)) { + if (!is->is_ifpout) + is->is_ifpout = ifp; + } else { + if (!is->is_ifpin) + is->is_ifpin = ifp; + } + } else { + if (!out && (out != is->is_rout)) { + if (!is->is_ifpin) + is->is_ifpin = ifp; + } else { + if (!is->is_ifpout) + is->is_ifpout = ifp; + } + } + return 1; +} + +frentry_t *fr_checkicmpmatchingstate(ip, fin) +ip_t *ip; +fr_info_t *fin; +{ + register struct in_addr dst, src; + register ipstate_t *is, **isp; + register u_short sport, dport; + register u_char pr; + struct icmp *ic; + fr_info_t ofin; + u_int hv, dest; + tcphdr_t *tcp; + frentry_t *fr; + ip_t *oip; + int type; + + /* + * Does it at least have the return (basic) IP header ? + * Only a basic IP header (no options) should be with + * an ICMP error header. + */ + if ((ip->ip_hl != 5) || (ip->ip_len < ICMPERR_MINPKTLEN)) + return NULL; + ic = (struct icmp *)((char *)ip + fin->fin_hlen); + type = ic->icmp_type; + /* + * If it's not an error type, then return + */ + if ((type != ICMP_UNREACH) && (type != ICMP_SOURCEQUENCH) && + (type != ICMP_REDIRECT) && (type != ICMP_TIMXCEED) && + (type != ICMP_PARAMPROB)) + return NULL; + + oip = (ip_t *)((char *)fin->fin_dp + ICMPERR_ICMPHLEN); + if (ip->ip_len < ICMPERR_MAXPKTLEN + ((oip->ip_hl - 5) << 2)) + return NULL; + if ((oip->ip_p != IPPROTO_TCP) && (oip->ip_p != IPPROTO_UDP)) + return NULL; + + tcp = (tcphdr_t *)((char *)oip + (oip->ip_hl << 2)); + dport = tcp->th_dport; + sport = tcp->th_sport; + + hv = (pr = oip->ip_p); + hv += (src.s_addr = oip->ip_src.s_addr); + hv += (dst.s_addr = oip->ip_dst.s_addr); + hv += dport; + hv += sport; + hv %= fr_statesize; + /* + * we make an fin entry to be able to feed it to + * matchsrcdst note that not all fields are encessary + * but this is the cleanest way. Note further we fill + * in fin_mp such that if someone uses it we'll get + * a kernel panic. fr_matchsrcdst does not use this. + * + * watch out here, as ip is in host order and oip in network + * order. Any change we make must be undone afterwards. + */ + oip->ip_len = ntohs(oip->ip_len); + fr_makefrip(oip->ip_hl << 2, oip, &ofin); + oip->ip_len = htons(oip->ip_len); + ofin.fin_ifp = fin->fin_ifp; + ofin.fin_out = !fin->fin_out; + ofin.fin_mp = NULL; /* if dereferenced, panic XXX */ + READ_ENTER(&ipf_state); + for (isp = &ips_table[hv]; (is = *isp); isp = &is->is_next) { + /* + * Only allow this icmp though if the + * encapsulated packet was allowed through the + * other way around. Note that the minimal amount + * of info present does not allow for checking against + * tcp internals such as seq and ack numbers. + */ + if ((is->is_p == pr) && + fr_matchsrcdst(is, src, dst, &ofin, tcp)) { + fr = is->is_rule; + ips_stats.iss_hits++; + /* + * we must swap src and dst here because the icmp + * comes the other way around + */ + dest = (is->is_dst.s_addr != src.s_addr); + is->is_pkts++; + is->is_bytes += ip->ip_len; + /* + * we deliberately do not touch the timeouts + * for the accompanying state table entry. + * It remains to be seen if that is correct. XXX + */ + RWLOCK_EXIT(&ipf_state); + return fr; + } + } + RWLOCK_EXIT(&ipf_state); + return NULL; +} + +/* + * Check if a packet has a registered state. + */ +frentry_t *fr_checkstate(ip, fin) +ip_t *ip; +fr_info_t *fin; +{ + register struct in_addr dst, src; + register ipstate_t *is, **isp; + register u_char pr; + u_int hv, hvm, hlen, tryagain, pass; + struct icmp *ic; + frentry_t *fr; + tcphdr_t *tcp; + + if ((ip->ip_off & IP_OFFMASK) || (fin->fin_fi.fi_fl & FI_SHORT)) + return NULL; + + is = NULL; + hlen = fin->fin_hlen; + tcp = (tcphdr_t *)((char *)ip + hlen); + ic = (struct icmp *)tcp; + hv = (pr = ip->ip_p); + hv += (src.s_addr = ip->ip_src.s_addr); + hv += (dst.s_addr = ip->ip_dst.s_addr); + + /* + * Search the hash table for matching packet header info. + */ + switch (ip->ip_p) + { + case IPPROTO_ICMP : + hv += ic->icmp_id; + hv += ic->icmp_seq; + hv %= fr_statesize; + READ_ENTER(&ipf_state); + for (isp = &ips_table[hv]; (is = *isp); isp = &is->is_next) + if ((is->is_p == pr) && + (ic->icmp_id == is->is_icmp.ics_id) && + (ic->icmp_seq == is->is_icmp.ics_seq) && + fr_matchsrcdst(is, src, dst, fin, NULL)) { + if ((is->is_type == ICMP_ECHOREPLY) && + (ic->icmp_type == ICMP_ECHO)) + ; + else if (is->is_type != ic->icmp_type) + continue; + is->is_age = fr_icmptimeout; + break; + } + if (is != NULL) + break; + RWLOCK_EXIT(&ipf_state); + /* + * No matching icmp state entry. Perhaps this is a + * response to another state entry. + */ + fr = fr_checkicmpmatchingstate(ip, fin); + if (fr) + return fr; + break; + case IPPROTO_TCP : + { + register u_short dport = tcp->th_dport, sport = tcp->th_sport; + + tryagain = 0; +retry_tcp: + hvm = hv % fr_statesize; + WRITE_ENTER(&ipf_state); + for (isp = &ips_table[hvm]; (is = *isp); + isp = &is->is_next) + if ((is->is_p == pr) && + fr_matchsrcdst(is, src, dst, fin, tcp)) { + if (fr_tcpstate(is, fin, ip, tcp)) { + break; +#ifndef _KERNEL + if (tcp->th_flags & TCP_CLOSE) { + *isp = is->is_next; + isp = &ips_table[hvm]; + if (ips_table[hvm] == NULL) + ips_stats.iss_inuse--; + fr_delstate(is); + ips_num--; + } +#endif + break; + } + is = NULL; + break; + } + if (is != NULL) + break; + RWLOCK_EXIT(&ipf_state); + hv += dport; + hv += sport; + if (tryagain == 0) { + tryagain = 1; + goto retry_tcp; + } + break; + } + case IPPROTO_UDP : + { + register u_short dport = tcp->th_dport, sport = tcp->th_sport; + + tryagain = 0; +retry_udp: + hvm = hv % fr_statesize; + /* + * Nothing else to match on but ports. and IP#'s + */ + READ_ENTER(&ipf_state); + for (is = ips_table[hvm]; is; is = is->is_next) + if ((is->is_p == pr) && + fr_matchsrcdst(is, src, dst, fin, tcp)) { + is->is_age = fr_udptimeout; + break; + } + if (is != NULL) + break; + RWLOCK_EXIT(&ipf_state); + hv += dport; + hv += sport; + if (tryagain == 0) { + tryagain = 1; + goto retry_udp; + } + break; + } + default : + break; + } + if (is == NULL) { + ATOMIC_INC(ips_stats.iss_miss); + return NULL; + } + MUTEX_ENTER(&ipf_rw); + is->is_bytes += ip->ip_len; + ips_stats.iss_hits++; + is->is_pkts++; + MUTEX_EXIT(&ipf_rw); + fr = is->is_rule; + fin->fin_fr = fr; + pass = is->is_pass; + RWLOCK_EXIT(&ipf_state); + if (fin->fin_fi.fi_fl & FI_FRAG) + ipfr_newfrag(ip, fin, pass ^ FR_KEEPSTATE); + return fr; +} + + +static void fr_delstate(is) +ipstate_t *is; +{ + frentry_t *fr; + + fr = is->is_rule; + if (fr != NULL) { + ATOMIC_DEC(fr->fr_ref); + if (fr->fr_ref == 0) + KFREE(fr); + } + KFREE(is); +} + + +/* + * Free memory in use by all state info. kept. + */ +void fr_stateunload() +{ + register int i; + register ipstate_t *is, **isp; + + WRITE_ENTER(&ipf_state); + for (i = fr_statesize - 1; i >= 0; i--) + for (isp = &ips_table[i]; (is = *isp); ) { + *isp = is->is_next; + fr_delstate(is); + ips_num--; + } + ips_stats.iss_inuse = 0; + ips_num = 0; + RWLOCK_EXIT(&ipf_state); + KFREES(ips_table, fr_statesize * sizeof(ipstate_t *)); + ips_table = NULL; +} + + +/* + * Slowly expire held state for thingslike UDP and ICMP. Timeouts are set + * in expectation of this being called twice per second. + */ +void fr_timeoutstate() +{ + register int i; + register ipstate_t *is, **isp; +#if defined(_KERNEL) && !SOLARIS + int s; +#endif + + SPL_NET(s); + WRITE_ENTER(&ipf_state); + for (i = fr_statesize - 1; i >= 0; i--) + for (isp = &ips_table[i]; (is = *isp); ) + if (is->is_age && !--is->is_age) { + *isp = is->is_next; + if (is->is_p == IPPROTO_TCP) + ips_stats.iss_fin++; + else + ips_stats.iss_expire++; + if (ips_table[i] == NULL) + ips_stats.iss_inuse--; +#ifdef IPFILTER_LOG + ipstate_log(is, ISL_EXPIRE); +#endif + fr_delstate(is); + ips_num--; + } else + isp = &is->is_next; + RWLOCK_EXIT(&ipf_state); + SPL_X(s); +} + + +/* + * Original idea freom Pradeep Krishnan for use primarily with NAT code. + * (pkrishna@netcom.com) + */ +void fr_tcp_age(age, state, ip, fin, dir) +u_long *age; +u_char *state; +ip_t *ip; +fr_info_t *fin; +int dir; +{ + tcphdr_t *tcp = (tcphdr_t *)fin->fin_dp; + u_char flags = tcp->th_flags; + int dlen, ostate; + + ostate = state[1 - dir]; + + dlen = ip->ip_len - fin->fin_hlen - (tcp->th_off << 2); + + if (flags & TH_RST) { + if (!(tcp->th_flags & TH_PUSH) && !dlen) { + *age = fr_tcpclosed; + state[dir] = TCPS_CLOSED; + } else { + *age = fr_tcpclosewait; + state[dir] = TCPS_CLOSE_WAIT; + } + return; + } + + *age = fr_tcptimeout; /* 1 min */ + + switch(state[dir]) + { + case TCPS_CLOSED: + if ((flags & (TH_FIN|TH_SYN|TH_RST|TH_ACK)) == TH_ACK) { + state[dir] = TCPS_ESTABLISHED; + *age = fr_tcpidletimeout; + } + case TCPS_FIN_WAIT_2: + if ((flags & TH_OPENING) == TH_OPENING) + state[dir] = TCPS_SYN_RECEIVED; + else if (flags & TH_SYN) + state[dir] = TCPS_SYN_SENT; + break; + case TCPS_SYN_RECEIVED: + case TCPS_SYN_SENT: + if ((flags & (TH_FIN|TH_ACK)) == TH_ACK) { + state[dir] = TCPS_ESTABLISHED; + *age = fr_tcpidletimeout; + } else if ((flags & (TH_FIN|TH_ACK)) == (TH_FIN|TH_ACK)) { + state[dir] = TCPS_CLOSE_WAIT; + if (!(flags & TH_PUSH) && !dlen && + ostate > TCPS_ESTABLISHED) + *age = fr_tcplastack; + else + *age = fr_tcpclosewait; + } + break; + case TCPS_ESTABLISHED: + if (flags & TH_FIN) { + state[dir] = TCPS_CLOSE_WAIT; + if (!(flags & TH_PUSH) && !dlen && + ostate > TCPS_ESTABLISHED) + *age = fr_tcplastack; + else + *age = fr_tcpclosewait; + } else { + if (ostate < TCPS_CLOSE_WAIT) + *age = fr_tcpidletimeout; + } + break; + case TCPS_CLOSE_WAIT: + if ((flags & TH_FIN) && !(flags & TH_PUSH) && !dlen && + ostate > TCPS_ESTABLISHED) { + *age = fr_tcplastack; + state[dir] = TCPS_LAST_ACK; + } else + *age = fr_tcpclosewait; + break; + case TCPS_LAST_ACK: + if (flags & TH_ACK) { + state[dir] = TCPS_FIN_WAIT_2; + if (!(flags & TH_PUSH) && !dlen && + ostate > TCPS_ESTABLISHED) + *age = fr_tcplastack; + else { + *age = fr_tcpclosewait; + state[dir] = TCPS_CLOSE_WAIT; + } + } + break; + } +} + + +#ifdef IPFILTER_LOG +void ipstate_log(is, type) +struct ipstate *is; +u_int type; +{ + struct ipslog ipsl; + void *items[1]; + size_t sizes[1]; + int types[1]; + + ipsl.isl_type = type; + ipsl.isl_pkts = is->is_pkts; + ipsl.isl_bytes = is->is_bytes; + ipsl.isl_src = is->is_src; + ipsl.isl_dst = is->is_dst; + ipsl.isl_p = is->is_p; + ipsl.isl_flags = is->is_flags; + if (ipsl.isl_p == IPPROTO_TCP || ipsl.isl_p == IPPROTO_UDP) { + ipsl.isl_sport = is->is_sport; + ipsl.isl_dport = is->is_dport; + if (ipsl.isl_p == IPPROTO_TCP) { + ipsl.isl_state[0] = is->is_state[0]; + ipsl.isl_state[1] = is->is_state[1]; + } + } else if (ipsl.isl_p == IPPROTO_ICMP) + ipsl.isl_itype = is->is_icmp.ics_type; + else { + ipsl.isl_ps.isl_filler[0] = 0; + ipsl.isl_ps.isl_filler[1] = 0; + } + items[0] = &ipsl; + sizes[0] = sizeof(ipsl); + types[0] = 0; + + (void) ipllog(IPL_LOGSTATE, NULL, items, sizes, types, 1); +} +#endif diff --git a/sys/contrib/ipfilter/netinet/ip_state.h b/sys/contrib/ipfilter/netinet/ip_state.h new file mode 100644 index 0000000..1b7c392 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ip_state.h @@ -0,0 +1,165 @@ +/* + * Copyright (C) 1995-1998 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + * + * @(#)ip_state.h 1.3 1/12/96 (C) 1995 Darren Reed + * $Id: ip_state.h,v 2.1 1999/08/04 17:30:00 darrenr Exp $ + * $FreeBSD$ + */ +#ifndef __IP_STATE_H__ +#define __IP_STATE_H__ + +#define IPSTATE_SIZE 257 +#define IPSTATE_MAX 2048 /* Maximum number of states held */ + +#define PAIRS(s1,d1,s2,d2) ((((s1) == (s2)) && ((d1) == (d2))) ||\ + (((s1) == (d2)) && ((d1) == (s2)))) +#define IPPAIR(s1,d1,s2,d2) PAIRS((s1).s_addr, (d1).s_addr, \ + (s2).s_addr, (d2).s_addr) + + +typedef struct udpstate { + u_short us_sport; + u_short us_dport; +} udpstate_t; + +typedef struct icmpstate { + u_short ics_id; + u_short ics_seq; + u_char ics_type; +} icmpstate_t; + +typedef struct tcpdata { + u_32_t td_end; + u_32_t td_maxend; + u_short td_maxwin; +} tcpdata_t; + +typedef struct tcpstate { + u_short ts_sport; + u_short ts_dport; + tcpdata_t ts_data[2]; + u_char ts_state[2]; +} tcpstate_t; + +typedef struct ipstate { + struct ipstate *is_next; + u_long is_age; + u_int is_pass; + U_QUAD_T is_pkts; + U_QUAD_T is_bytes; + void *is_ifpin; + void *is_ifpout; + frentry_t *is_rule; + struct in_addr is_src; + struct in_addr is_dst; + u_char is_p; /* Protocol */ + u_char is_rout; /* Is rule in/out ? */ + u_32_t is_flags; + u_32_t is_opt; /* packet options set */ + u_32_t is_optmsk; /* " " mask */ + u_short is_sec; /* security options set */ + u_short is_secmsk; /* " " mask */ + u_short is_auth; /* authentication options set */ + u_short is_authmsk; /* " " mask */ + union { + icmpstate_t is_ics; + tcpstate_t is_ts; + udpstate_t is_us; + } is_ps; +} ipstate_t; + +#define is_icmp is_ps.is_ics +#define is_type is_icmp.ics_type +#define is_code is_icmp.ics_code +#define is_tcp is_ps.is_ts +#define is_udp is_ps.is_us +#define is_send is_tcp.ts_data[0].td_end +#define is_dend is_tcp.ts_data[1].td_end +#define is_maxswin is_tcp.ts_data[0].td_maxwin +#define is_maxdwin is_tcp.ts_data[1].td_maxwin +#define is_maxsend is_tcp.ts_data[0].td_maxend +#define is_maxdend is_tcp.ts_data[1].td_maxend +#define is_sport is_tcp.ts_sport +#define is_dport is_tcp.ts_dport +#define is_state is_tcp.ts_state + +#define TH_OPENING (TH_SYN|TH_ACK) +/* + * is_flags: + * Bits 0 - 3 are use as a mask with the current packet's bits to check for + * whether it is short, tcp/udp, a fragment or the presence of IP options. + * Bits 4 - 7 are set from the initial packet and contain what the packet + * anded with bits 0-3 must match. + * Bits 8,9 are used to indicate wildcard source/destination port matching. + */ + + +typedef struct ipslog { + U_QUAD_T isl_pkts; + U_QUAD_T isl_bytes; + struct in_addr isl_src; + struct in_addr isl_dst; + u_char isl_p; + u_char isl_flags; + u_char isl_state[2]; + u_short isl_type; + union { + u_short isl_filler[2]; + u_short isl_ports[2]; + u_short isl_icmp; + } isl_ps; +} ipslog_t; + +#define isl_sport isl_ps.isl_ports[0] +#define isl_dport isl_ps.isl_ports[1] +#define isl_itype isl_ps.isl_icmp + +#define ISL_NEW 0 +#define ISL_EXPIRE 0xffff +#define ISL_FLUSH 0xfffe + + +typedef struct ips_stat { + u_long iss_hits; + u_long iss_miss; + u_long iss_max; + u_long iss_tcp; + u_long iss_udp; + u_long iss_icmp; + u_long iss_nomem; + u_long iss_expire; + u_long iss_fin; + u_long iss_active; + u_long iss_logged; + u_long iss_logfail; + u_long iss_inuse; + ipstate_t **iss_table; +} ips_stat_t; + + +extern u_long fr_tcpidletimeout; +extern u_long fr_tcpclosewait; +extern u_long fr_tcplastack; +extern u_long fr_tcptimeout; +extern u_long fr_tcpclosed; +extern u_long fr_udptimeout; +extern u_long fr_icmptimeout; +extern int fr_stateinit __P((void)); +extern int fr_tcpstate __P((ipstate_t *, fr_info_t *, ip_t *, tcphdr_t *)); +extern ipstate_t *fr_addstate __P((ip_t *, fr_info_t *, u_int)); +extern frentry_t *fr_checkstate __P((ip_t *, fr_info_t *)); +extern void fr_timeoutstate __P((void)); +extern void fr_tcp_age __P((u_long *, u_char *, ip_t *, fr_info_t *, int)); +extern void fr_stateunload __P((void)); +extern void ipstate_log __P((struct ipstate *, u_int)); +#if defined(__NetBSD__) || defined(__OpenBSD__) +extern int fr_state_ioctl __P((caddr_t, u_long, int)); +#else +extern int fr_state_ioctl __P((caddr_t, int, int)); +#endif + +#endif /* __IP_STATE_H__ */ diff --git a/sys/contrib/ipfilter/netinet/ipl.h b/sys/contrib/ipfilter/netinet/ipl.h new file mode 100644 index 0000000..f29b6fd --- /dev/null +++ b/sys/contrib/ipfilter/netinet/ipl.h @@ -0,0 +1,18 @@ +/* + * Copyright (C) 1993-1999 by Darren Reed. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and due credit is given + * to the original author and the contributors. + * + * @(#)ipl.h 1.21 6/5/96 + * $Id$ + * $FreeBSD$ + */ + +#ifndef __IPL_H__ +#define __IPL_H__ + +#define IPL_VERSION "IP Filter: v3.3.3" + +#endif diff --git a/sys/contrib/ipfilter/netinet/mlfk_ipl.c b/sys/contrib/ipfilter/netinet/mlfk_ipl.c new file mode 100644 index 0000000..f19a6e1 --- /dev/null +++ b/sys/contrib/ipfilter/netinet/mlfk_ipl.c @@ -0,0 +1,180 @@ +/* + * Copyright 1999 Guido van Rooij. All rights reserved. + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ``AS IS'' AND ANY EXPRESS + * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/kernel.h> +#include <sys/module.h> +#include <sys/conf.h> +#include <sys/socket.h> +#include <sys/sysctl.h> +#include <net/if.h> +#include <netinet/in_systm.h> +#include <netinet/in.h> + + +#include <netinet/ipl.h> +#include <netinet/ip_compat.h> +#include <netinet/ip_fil.h> +#include <netinet/ip_state.h> +#include <netinet/ip_nat.h> +#include <netinet/ip_auth.h> +#include <netinet/ip_frag.h> + +static dev_t ipf_devs[IPL_LOGMAX + 1]; + +SYSCTL_DECL(_net_inet); +SYSCTL_NODE(_net_inet, OID_AUTO, ipf, CTLFLAG_RW, 0, "IPF"); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_flags, CTLFLAG_RW, &fr_flags, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_pass, CTLFLAG_RW, &fr_pass, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_active, CTLFLAG_RD, &fr_active, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcpidletimeout, CTLFLAG_RW, + &fr_tcpidletimeout, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcpclosewait, CTLFLAG_RW, + &fr_tcpclosewait, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcplastack, CTLFLAG_RW, + &fr_tcplastack, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcptimeout, CTLFLAG_RW, + &fr_tcptimeout, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_tcpclosed, CTLFLAG_RW, + &fr_tcpclosed, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_udptimeout, CTLFLAG_RW, + &fr_udptimeout, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_icmptimeout, CTLFLAG_RW, + &fr_icmptimeout, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_defnatage, CTLFLAG_RW, + &fr_defnatage, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_ipfrttl, CTLFLAG_RW, + &fr_ipfrttl, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, ipl_unreach, CTLFLAG_RW, + &ipl_unreach, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, ipl_inited, CTLFLAG_RD, + &ipl_inited, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_authsize, CTLFLAG_RD, + &fr_authsize, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_authused, CTLFLAG_RD, + &fr_authused, 0, ""); +SYSCTL_INT(_net_inet_ipf, OID_AUTO, fr_defaultauthage, CTLFLAG_RW, + &fr_defaultauthage, 0, ""); + +#define CDEV_MAJOR 79 +static struct cdevsw ipl_cdevsw = { + /* open */ iplopen, + /* close */ iplclose, + /* read */ iplread, + /* write */ nowrite, + /* ioctl */ iplioctl, + /* poll */ nopoll, + /* mmap */ nommap, + /* strategy */ nostrategy, + /* name */ "ipl", + /* maj */ CDEV_MAJOR, + /* dump */ nodump, + /* psize */ nopsize, + /* flags */ 0, + /* bmaj */ -1 +}; + +static int +ipfilter_modevent(module_t mod, int type, void *unused) +{ + char *c; + int i, error = 0; + + switch (type) { + case MOD_LOAD : + error = iplattach(); + if (error) + break; + + c = NULL; + for(i=strlen(IPL_NAME); i>0; i--) + if (IPL_NAME[i] == '/') { + c = &IPL_NAME[i+1]; + break; + } + if (!c) + c = IPL_NAME; + ipf_devs[IPL_LOGIPF] = + make_dev(&ipl_cdevsw, IPL_LOGIPF, 0, 0, 0600, c); + + c = NULL; + for(i=strlen(IPL_NAT); i>0; i--) + if (IPL_NAT[i] == '/') { + c = &IPL_NAT[i+1]; + break; + } + if (!c) + c = IPL_NAT; + ipf_devs[IPL_LOGNAT] = + make_dev(&ipl_cdevsw, IPL_LOGNAT, 0, 0, 0600, c); + + c = NULL; + for(i=strlen(IPL_STATE); i>0; i--) + if (IPL_STATE[i] == '/') { + c = &IPL_STATE[i+1]; + break; + } + if (!c) + c = IPL_STATE; + ipf_devs[IPL_LOGSTATE] = + make_dev(&ipl_cdevsw, IPL_LOGSTATE, 0, 0, 0600, c); + + c = NULL; + for(i=strlen(IPL_AUTH); i>0; i--) + if (IPL_AUTH[i] == '/') { + c = &IPL_AUTH[i+1]; + break; + } + if (!c) + c = IPL_AUTH; + ipf_devs[IPL_LOGAUTH] = + make_dev(&ipl_cdevsw, IPL_LOGAUTH, 0, 0, 0600, c); + + break; + case MOD_UNLOAD : + destroy_dev(ipf_devs[IPL_LOGIPF]); + destroy_dev(ipf_devs[IPL_LOGNAT]); + destroy_dev(ipf_devs[IPL_LOGSTATE]); + destroy_dev(ipf_devs[IPL_LOGAUTH]); + cdevsw_remove(&ipl_cdevsw); + error = ipldetach(); + break; + default: + error = EINVAL; + break; + } + return error; +} + +static moduledata_t ipfiltermod = { + IPL_VERSION, + ipfilter_modevent, + 0 +}; +DECLARE_MODULE(ipfilter, ipfiltermod, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY); diff --git a/sys/contrib/softupdates/README b/sys/contrib/softupdates/README new file mode 100644 index 0000000..7866b0d --- /dev/null +++ b/sys/contrib/softupdates/README @@ -0,0 +1,322 @@ +# $FreeBSD$ + +Introduction + +This package constitutes the alpha distribution of the soft update +code updates for the fast filesystem. + +For More information on what Soft Updates is, see: +http://www.ece.cmu.edu/~ganger/papers/CSE-TR-254-95/ + +Status + +My `filesystem torture tests' (described below) run for days without +a hitch (no panic's, hangs, filesystem corruption, or memory leaks). +However, I have had several panic's reported to me by folks that +are field testing the code which I have not yet been able to +reproduce or fix. Although these panic's are rare and do not cause +filesystem corruption, the code should only be put into production +on systems where the system administrator is aware that it is being +run, and knows how to turn it off if problems arise. Thus, you may +hand out this code to others, but please ensure that this status +message is included with any distributions. Please also include +the file ffs_softdep.stub.c in any distributions so that folks that +cannot abide by the need to redistribute source will not be left +with a kernel that will not link. It will resolve all the calls +into the soft update code and simply ignores the request to enable +them. Thus you will be able to ensure that your other hooks have +not broken anything and that your kernel is softdep-ready for those +that wish to use them. Please report problems back to me with +kernel backtraces of panics if possible. This is massively complex +code, and people only have to have their filesystems hosed once or +twice to avoid future changes like the plague. I want to find and +fix as many bugs as soon as possible so as to get the code rock +solid before it gets widely released. Please report any bugs that +you uncover to mckusick@mckusick.com. + +Performance + +Running the Andrew Benchmarks yields the following raw data: + + Phase Normal Softdep What it does + 1 3s <1s Creating directories + 2 8s 4s Copying files + 3 6s 6s Recursive directory stats + 4 8s 9s Scanning each file + 5 25s 25s Compilation + + Normal: 19.9u 29.2s 0:52.8 135+630io + Softdep: 20.3u 28.5s 0:47.8 103+363io + +Another interesting datapoint are my `filesystem torture tests'. +They consist of 1000 runs of the andrew benchmarks, 1000 copy and +removes of /etc with randomly selected pauses of 0-60 seconds +between each copy and remove, and 500 find from / with randomly +selected pauses of 100 seconds between each run). The run of the +torture test compares as follows: + +With soft updates: writes: 6 sync, 1,113,686 async; run time 19hr, 50min +Normal filesystem: writes: 1,459,147 sync, 487,031 async; run time 27hr, 15min + +The upshot is 42% less I/O and 28% shorter running time. + +Another interesting test point is a full MAKEDEV. Because it runs +as a shell script, it becomes mostly limited by the execution speed +of the machine on which it runs. Here are the numbers: + +With soft updates: + + labrat# time ./MAKEDEV std + 2.2u 32.6s 0:34.82 100.0% 0+0k 11+36io 0pf+0w + + labrat# ls | wc + 522 522 3317 + +Without soft updates: + + labrat# time ./MAKEDEV std + 2.0u 40.5s 0:42.53 100.0% 0+0k 11+1221io 0pf+0w + + labrat# ls | wc + 522 522 3317 + +Of course, some of the system time is being pushed +to the syncer process, but that is a different story. + +To show a benchmark designed to highlight the soft update code +consider a tar of zero-sized files and an rm -rf of a directory tree +that has at least 50 files or so at each level. Running a test with +a directory tree containing 28 directories holding 202 empty files +produces the following numbers: + +With soft updates: +tar: 0.0u 0.5s 0:00.65 76.9% 0+0k 0+44io 0pf+0w (0 sync, 33 async writes) +rm: 0.0u 0.2s 0:00.20 100.0% 0+0k 0+37io 0pf+0w (0 sync, 72 async writes) + +Normal filesystem: +tar: 0.0u 1.1s 0:07.27 16.5% 0+0k 60+586io 0pf+0w (523 sync, 0 async writes) +rm: 0.0u 0.5s 0:01.84 29.3% 0+0k 0+318io 0pf+0w (258 sync, 65 async writes) + +The large reduction in writes is because inodes are clustered, so +most of a block gets allocated, then the whole block is written +out once rather than having the same block written once for each +inode allocated from it. Similarly each directory block is written +once rather than once for each new directory entry. Effectively +what the update code is doing is allocating a bunch of inodes +and directory entries without writing anything, then ensuring that +the block containing the inodes is written first followed by the +directory block that references them. If there were data in the +files it would further ensure that the data blocks were written +before their inodes claimed them. + +Copyright Restrictions + +Please familiarize yourself with the copyright restrictions +contained at the top of either the sys/ufs/ffs/softdep.h or +sys/ufs/ffs/ffs_softdep.c file. The key provision is similar +to the one used by the DB 2.0 package and goes as follows: + + Redistributions in any form must be accompanied by information + on how to obtain complete source code for any accompanying + software that uses the this software. This source code must + either be included in the distribution or be available for + no more than the cost of distribution plus a nominal fee, + and must be freely redistributable under reasonable + conditions. For an executable file, complete source code + means the source code for all modules it contains. It does + not mean source code for modules or files that typically + accompany the operating system on which the executable file + runs, e.g., standard library modules or system header files. + +The idea is to allow those of you freely redistributing your source +to use it while retaining for myself the right to peddle it for +money to the commercial UNIX vendors. Note that I have included a +stub file ffs_softdep.c.stub that is freely redistributable so that +you can put in all the necessary hooks to run the full soft updates +code, but still allow vendors that want to maintain proprietary +source to have a working system. I do plan to release the code with +a `Berkeley style' copyright once I have peddled it around to the +commercial vendors. If you have concerns about this copyright, +feel free to contact me with them and we can try to resolve any +difficulties. + +Soft Dependency Operation + +The soft update implementation does NOT require ANY changes +to the on-disk format of your filesystems. Furthermore it is +not used by default for any filesystems. It must be enabled on +a filesystem by filesystem basis by running tunefs to set a +bit in the superblock indicating that the filesystem should be +managed using soft updates. If you wish to stop using +soft updates due to performance or reliability reasons, +you can simply run tunefs on it again to turn off the bit and +revert to normal operation. The additional dynamic memory load +placed on the kernel malloc arena is approximately equal to +the amount of memory used by vnodes plus inodes (for a system +with 1000 vnodes, the additional peak memory load is about 300K). + +Kernel Changes + +There are two new changes to the kernel functionality that are not +contained in in the soft update files. The first is a `trickle +sync' facility running in the kernel as process 3. This trickle +sync process replaces the traditional `update' program (which should +be commented out of the /etc/rc startup script). When a vnode is +first written it is placed 30 seconds down on the trickle sync +queue. If it still exists and has dirty data when it reaches the +top of the queue, it is sync'ed. This approach evens out the load +on the underlying I/O system and avoids writing short-lived files. +The papers on trickle-sync tend to favor aging based on buffers +rather than files. However, I sync on file age rather than buffer +age because the data structures are much smaller as there are +typically far fewer files than buffers. Although this can make the +I/O spikey when a big file times out, it is still much better than +the wholesale sync's that were happening before. It also adapts +much better to the soft update code where I want to control +aging to improve performance (inodes age in 10 seconds, directories +in 15 seconds, files in 30 seconds). This ensures that most +dependencies are gone (e.g., inodes are written when directory +entries want to go to disk) reducing the amount of rollback that +is needed. + +The other main kernel change is to split the vnode freelist into +two separate lists. One for vnodes that are still being used to +identify buffers and the other for those vnodes no longer identifying +any buffers. The latter list is used by getnewvnode in preference +to the former. + +Packaging of Kernel Changes + +The sys subdirectory contains the changes and additions to the +kernel. My goal in writing this code was to minimize the changes +that need to be made to the kernel. Thus, most of the new code +is contained in the two new files softdep.h and ffs_softdep.c. +The rest of the kernel changes are simply inserting hooks to +call into these two new files. Although there has been some +structural reorganization of the filesystem code to accommodate +gathering the information required by the soft update code, +the actual ordering of filesystem operations when soft updates +are disabled is unchanged. + +The kernel changes are packaged as a set of diffs. As I am +doing my development in BSD/OS, the diffs are relative to the +BSD/OS versions of the files. Because BSD/OS recently had +4.4BSD-Lite2 merged into it, the Lite2 files are a good starting +point for figuring out the changes. There are 40 files that +require change plus the two new files. Most of these files have +only a few lines of changes in them. However, four files have +fairly extensive changes: kern/vfs_subr.c, ufs/ufs/ufs_lookup.c, +ufs/ufs/ufs_vnops.c, and ufs/ffs/ffs_alloc.c. For these four +files, I have provided the original Lite2 version, the Lite2 +version with the diffs merged in, and the diffs between the +BSD/OS and merged version. Even so, I expect that there will +be some difficulty in doing the merge; I am certainly willing +to assist in helping get the code merged into your system. + +Packaging of Utility Changes + +The utilities subdirectory contains the changes and additions +to the utilities. There are diffs to three utilities enclosed: + + tunefs - add a flag to enable and disable soft updates + + mount - print out whether soft updates are enabled and + also statistics on number of sync and async writes + + fsck - tighter checks on acceptable errors and a slightly + different policy for what to put in lost+found on + filesystems using soft updates + +In addition you should recompile vmstat so as to get reports +on the 13 new memory types used by the soft update code. +It is not necessary to use the new version of fsck, however it +would aid in my debugging if you do. Also, because of the time +lag between deleting a directory entry and the inode it +references, you will find a lot more files showing up in your +lost+found if you do not use the new version. Note that the +new version checks for the soft update flag in the superblock +and only uses the new algorithms if it is set. So, it will run +unchanged on the filesystems that are not using soft updates. + +Operation + +Once you have booted a kernel that incorporates the soft update +code and installed the updated utilities, do the following: + +1) Comment out the update program in /etc/rc. + +2) Run `tunefs -n enable' on one or more test filesystems. + +3) Mount these filesystems and then type `mount' to ensure that + they have been enabled for soft updates. + +4) Copy the test directory to a softdep filesystem, chdir into + it and run `./doit'. You may want to check out each of the + three subtests individually first: doit1 - andrew benchmarks, + doit2 - copy and removal of /etc, doit3 - find from /. + +==== +Additional notes from Feb 13 + +When removing huge directories of files, it is possible to get +the incore state arbitrarily far ahead of the disk. Maintaining +all the associated depedency information can exhaust the kernel +malloc arena. To avoid this senario, I have put some limits on +the soft update code so that it will not be allowed to rampage +through all of the kernel memory. I enclose below the relevant +patches to vnode.h and vfs_subr.c (which allow the soft update +code to speed up the filesystem syncer process). I have also +included the diffs for ffs_softdep.c. I hope to make a pass over +ffs_softdep.c to isolate the differences with my standard version +so that these diffs are less painful to incorporate. + +Since I know you like to play with tuning, I have put the relevant +knobs on sysctl debug variables. The tuning knobs can be viewed +with `sysctl debug' and set with `sysctl -w debug.<name>=value'. +The knobs are as follows: + + debug.max_softdeps - limit on any given resource + debug.tickdelay - ticks to delay before allocating + debug.max_limit_hit - number of times tickdelay imposed + debug.rush_requests - number of rush requests to filesystem syncer + +The max_softdeps limit is derived from vnodesdesired which in +turn is sized based on the amount of memory on the machine. +When the limit is hit, a process requesting a resource first +tries to speed up the filesystem syncer process. Such a +request is recorded as a rush_request. After syncdelay / 2 +unserviced rush requests (typically 15) are in the filesystem +syncers queue (i.e., it is more than 15 seconds behind in its +work), the process requesting the memory is put to sleep for +tickdelay seconds. Such a delay is recorded in max_limit_hit. +Following this delay it is granted its memory without further +delay. I have tried the following experiments in which I +delete an MH directory containing 16,703 files: + +Run # 1 2 3 + +max_softdeps 4496 4496 4496 +tickdelay 100 == 1 sec 20 == 0.2 sec 2 == 0.02 sec +max_limit_hit 16 == 16 sec 27 == 5.4 sec 203 == 4.1 sec +rush_requests 147 102 93 +run time 57 sec 46 sec 45 sec +I/O's 781 859 936 + +When run with no limits, it completes in 40 seconds. So, the +time spent in delay is directly added to the bottom line. +Shortening the tick delay does cut down the total running time, +but at the expense of generating more total I/O operations +due to the rush orders being sent to the filesystem syncer. +Although the number of rush orders decreases with a shorter +tick delay, there are more requests in each order, hence the +increase in I/O count. Also, although the I/O count does rise +with a shorter delay, it is still at least an order of magnitude +less than without soft updates. Anyway, you may want to play +around with these value to see what works best and to see if +you can get an insight into how best to tune them. If you get +out of memory panic's, then you have max_softdeps set too high. +The max_limit_hit and rush_requests show be reset to zero +before each run. The minimum legal value for tickdelay is 2 +(if you set it below that, the code will use 2). + + diff --git a/sys/contrib/softupdates/ffs_softdep.c b/sys/contrib/softupdates/ffs_softdep.c new file mode 100644 index 0000000..20cb2dc --- /dev/null +++ b/sys/contrib/softupdates/ffs_softdep.c @@ -0,0 +1,4484 @@ +/* + * Copyright 1998 Marshall Kirk McKusick. All Rights Reserved. + * + * The soft updates code is derived from the appendix of a University + * of Michigan technical report (Gregory R. Ganger and Yale N. Patt, + * "Soft Updates: A Solution to the Metadata Update Problem in File + * Systems", CSE-TR-254-95, August 1995). + * + * The following are the copyrights and redistribution conditions that + * apply to this copy of the soft update software. For a license + * to use, redistribute or sell the soft update software under + * conditions other than those described here, please contact the + * author at one of the following addresses: + * + * Marshall Kirk McKusick mckusick@mckusick.com + * 1614 Oxford Street +1-510-843-9542 + * Berkeley, CA 94709-1608 + * USA + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. None of the names of McKusick, Ganger, Patt, or the University of + * Michigan may be used to endorse or promote products derived from + * this software without specific prior written permission. + * 4. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for any accompanying software + * that uses this software. This source code must either be included + * in the distribution or be available for no more than the cost of + * distribution plus a nominal fee, and must be freely redistributable + * under reasonable conditions. For an executable file, complete + * source code means the source code for all modules it contains. + * It does not mean source code for modules or files that typically + * accompany the operating system on which the executable file runs, + * e.g., standard library modules or system header files. + * + * THIS SOFTWARE IS PROVIDED BY MARSHALL KIRK MCKUSICK ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL MARSHALL KIRK MCKUSICK BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * from: @(#)ffs_softdep.c 9.40 (McKusick) 6/15/99 + * $FreeBSD$ + */ + +/* + * For now we want the safety net that the DIAGNOSTIC and DEBUG flags provide. + */ +#ifndef DIAGNOSTIC +#define DIAGNOSTIC +#endif +#ifndef DEBUG +#define DEBUG +#endif + +#include <sys/param.h> +#include <sys/kernel.h> +#include <sys/systm.h> +#include <sys/buf.h> +#include <sys/malloc.h> +#include <sys/mount.h> +#include <sys/proc.h> +#include <sys/syslog.h> +#include <sys/vnode.h> +#include <sys/conf.h> +#include <ufs/ufs/dir.h> +#include <ufs/ufs/quota.h> +#include <ufs/ufs/inode.h> +#include <ufs/ufs/ufsmount.h> +#include <ufs/ffs/fs.h> +#include <ufs/ffs/softdep.h> +#include <ufs/ffs/ffs_extern.h> +#include <ufs/ufs/ufs_extern.h> + +/* + * These definitions need to be adapted to the system to which + * this file is being ported. + */ +/* + * malloc types defined for the softdep system. + */ +MALLOC_DEFINE(M_PAGEDEP, "pagedep","File page dependencies"); +MALLOC_DEFINE(M_INODEDEP, "inodedep","Inode dependencies"); +MALLOC_DEFINE(M_NEWBLK, "newblk","New block allocation"); +MALLOC_DEFINE(M_BMSAFEMAP, "bmsafemap","Block or frag allocated from cyl group map"); +MALLOC_DEFINE(M_ALLOCDIRECT, "allocdirect","Block or frag dependency for an inode"); +MALLOC_DEFINE(M_INDIRDEP, "indirdep","Indirect block dependencies"); +MALLOC_DEFINE(M_ALLOCINDIR, "allocindir","Block dependency for an indirect block"); +MALLOC_DEFINE(M_FREEFRAG, "freefrag","Previously used frag for an inode"); +MALLOC_DEFINE(M_FREEBLKS, "freeblks","Blocks freed from an inode"); +MALLOC_DEFINE(M_FREEFILE, "freefile","Inode deallocated"); +MALLOC_DEFINE(M_DIRADD, "diradd","New directory entry"); +MALLOC_DEFINE(M_MKDIR, "mkdir","New directory"); +MALLOC_DEFINE(M_DIRREM, "dirrem","Directory entry deleted"); + +#define D_PAGEDEP 0 +#define D_INODEDEP 1 +#define D_NEWBLK 2 +#define D_BMSAFEMAP 3 +#define D_ALLOCDIRECT 4 +#define D_INDIRDEP 5 +#define D_ALLOCINDIR 6 +#define D_FREEFRAG 7 +#define D_FREEBLKS 8 +#define D_FREEFILE 9 +#define D_DIRADD 10 +#define D_MKDIR 11 +#define D_DIRREM 12 +#define D_LAST D_DIRREM + +/* + * translate from workitem type to memory type + * MUST match the defines above, such that memtype[D_XXX] == M_XXX + */ +static struct malloc_type *memtype[] = { + M_PAGEDEP, + M_INODEDEP, + M_NEWBLK, + M_BMSAFEMAP, + M_ALLOCDIRECT, + M_INDIRDEP, + M_ALLOCINDIR, + M_FREEFRAG, + M_FREEBLKS, + M_FREEFILE, + M_DIRADD, + M_MKDIR, + M_DIRREM +}; + +#define DtoM(type) (memtype[type]) + +/* + * Names of malloc types. + */ +#define TYPENAME(type) \ + ((unsigned)(type) < D_LAST ? memtype[type]->ks_shortdesc : "???") +#define CURPROC curproc +/* + * End system adaptaion definitions. + */ + +/* + * Internal function prototypes. + */ +static void softdep_error __P((char *, int)); +static void drain_output __P((struct vnode *, int)); +static int getdirtybuf __P((struct buf **, int)); +static void clear_remove __P((struct proc *)); +static void clear_inodedeps __P((struct proc *)); +static int flush_pagedep_deps __P((struct vnode *, struct mount *, + struct diraddhd *)); +static int flush_inodedep_deps __P((struct fs *, ino_t)); +static int handle_written_filepage __P((struct pagedep *, struct buf *)); +static void diradd_inode_written __P((struct diradd *, struct inodedep *)); +static int handle_written_inodeblock __P((struct inodedep *, struct buf *)); +static void handle_allocdirect_partdone __P((struct allocdirect *)); +static void handle_allocindir_partdone __P((struct allocindir *)); +static void initiate_write_filepage __P((struct pagedep *, struct buf *)); +static void handle_written_mkdir __P((struct mkdir *, int)); +static void initiate_write_inodeblock __P((struct inodedep *, struct buf *)); +static void handle_workitem_freefile __P((struct freefile *)); +static void handle_workitem_remove __P((struct dirrem *)); +static struct dirrem *newdirrem __P((struct buf *, struct inode *, + struct inode *, int)); +static void free_diradd __P((struct diradd *)); +static void free_allocindir __P((struct allocindir *, struct inodedep *)); +static int indir_trunc __P((struct inode *, ufs_daddr_t, int, ufs_lbn_t, + long *)); +static void deallocate_dependencies __P((struct buf *, struct inodedep *)); +static void free_allocdirect __P((struct allocdirectlst *, + struct allocdirect *, int)); +static int free_inodedep __P((struct inodedep *)); +static void handle_workitem_freeblocks __P((struct freeblks *)); +static void merge_inode_lists __P((struct inodedep *)); +static void setup_allocindir_phase2 __P((struct buf *, struct inode *, + struct allocindir *)); +static struct allocindir *newallocindir __P((struct inode *, int, ufs_daddr_t, + ufs_daddr_t)); +static void handle_workitem_freefrag __P((struct freefrag *)); +static struct freefrag *newfreefrag __P((struct inode *, ufs_daddr_t, long)); +static void allocdirect_merge __P((struct allocdirectlst *, + struct allocdirect *, struct allocdirect *)); +static struct bmsafemap *bmsafemap_lookup __P((struct buf *)); +static int newblk_lookup __P((struct fs *, ufs_daddr_t, int, + struct newblk **)); +static int inodedep_lookup __P((struct fs *, ino_t, int, struct inodedep **)); +static int pagedep_lookup __P((struct inode *, ufs_lbn_t, int, + struct pagedep **)); +static void pause_timer __P((void *)); +static int request_cleanup __P((int, int)); +static void add_to_worklist __P((struct worklist *)); + +/* + * Exported softdep operations. + */ +struct bio_ops bioops = { + softdep_disk_io_initiation, /* io_start */ + softdep_disk_write_complete, /* io_complete */ + softdep_deallocate_dependencies, /* io_deallocate */ + softdep_fsync, /* io_fsync */ + softdep_process_worklist, /* io_sync */ +}; + +/* + * Locking primitives. + * + * For a uniprocessor, all we need to do is protect against disk + * interrupts. For a multiprocessor, this lock would have to be + * a mutex. A single mutex is used throughout this file, though + * finer grain locking could be used if contention warranted it. + * + * For a multiprocessor, the sleep call would accept a lock and + * release it after the sleep processing was complete. In a uniprocessor + * implementation there is no such interlock, so we simple mark + * the places where it needs to be done with the `interlocked' form + * of the lock calls. Since the uniprocessor sleep already interlocks + * the spl, there is nothing that really needs to be done. + */ +#ifndef /* NOT */ DEBUG +static struct lockit { + int lkt_spl; +} lk = { 0 }; +#define ACQUIRE_LOCK(lk) (lk)->lkt_spl = splbio() +#define FREE_LOCK(lk) splx((lk)->lkt_spl) +#define ACQUIRE_LOCK_INTERLOCKED(lk) +#define FREE_LOCK_INTERLOCKED(lk) + +#else /* DEBUG */ +static struct lockit { + int lkt_spl; + pid_t lkt_held; +} lk = { 0, -1 }; +static int lockcnt; + +static void acquire_lock __P((struct lockit *)); +static void free_lock __P((struct lockit *)); +static void acquire_lock_interlocked __P((struct lockit *)); +static void free_lock_interlocked __P((struct lockit *)); + +#define ACQUIRE_LOCK(lk) acquire_lock(lk) +#define FREE_LOCK(lk) free_lock(lk) +#define ACQUIRE_LOCK_INTERLOCKED(lk) acquire_lock_interlocked(lk) +#define FREE_LOCK_INTERLOCKED(lk) free_lock_interlocked(lk) + +static void +acquire_lock(lk) + struct lockit *lk; +{ + + if (lk->lkt_held != -1) { + if (lk->lkt_held == CURPROC->p_pid) + panic("softdep_lock: locking against myself"); + else + panic("softdep_lock: lock held by %d", lk->lkt_held); + } + lk->lkt_spl = splbio(); + lk->lkt_held = CURPROC->p_pid; + lockcnt++; +} + +static void +free_lock(lk) + struct lockit *lk; +{ + + if (lk->lkt_held == -1) + panic("softdep_unlock: lock not held"); + lk->lkt_held = -1; + splx(lk->lkt_spl); +} + +static void +acquire_lock_interlocked(lk) + struct lockit *lk; +{ + + if (lk->lkt_held != -1) { + if (lk->lkt_held == CURPROC->p_pid) + panic("softdep_lock_interlocked: locking against self"); + else + panic("softdep_lock_interlocked: lock held by %d", + lk->lkt_held); + } + lk->lkt_held = CURPROC->p_pid; + lockcnt++; +} + +static void +free_lock_interlocked(lk) + struct lockit *lk; +{ + + if (lk->lkt_held == -1) + panic("softdep_unlock_interlocked: lock not held"); + lk->lkt_held = -1; +} +#endif /* DEBUG */ + +/* + * Place holder for real semaphores. + */ +struct sema { + int value; + pid_t holder; + char *name; + int prio; + int timo; +}; +static void sema_init __P((struct sema *, char *, int, int)); +static int sema_get __P((struct sema *, struct lockit *)); +static void sema_release __P((struct sema *)); + +static void +sema_init(semap, name, prio, timo) + struct sema *semap; + char *name; + int prio, timo; +{ + + semap->holder = -1; + semap->value = 0; + semap->name = name; + semap->prio = prio; + semap->timo = timo; +} + +static int +sema_get(semap, interlock) + struct sema *semap; + struct lockit *interlock; +{ + + if (semap->value++ > 0) { + if (interlock != NULL) + FREE_LOCK_INTERLOCKED(interlock); + tsleep((caddr_t)semap, semap->prio, semap->name, semap->timo); + if (interlock != NULL) { + ACQUIRE_LOCK_INTERLOCKED(interlock); + FREE_LOCK(interlock); + } + return (0); + } + semap->holder = CURPROC->p_pid; + if (interlock != NULL) + FREE_LOCK(interlock); + return (1); +} + +static void +sema_release(semap) + struct sema *semap; +{ + + if (semap->value <= 0 || semap->holder != CURPROC->p_pid) + panic("sema_release: not held"); + if (--semap->value > 0) { + semap->value = 0; + wakeup(semap); + } + semap->holder = -1; +} + +/* + * Worklist queue management. + * These routines require that the lock be held. + */ +#ifndef /* NOT */ DEBUG +#define WORKLIST_INSERT(head, item) do { \ + (item)->wk_state |= ONWORKLIST; \ + LIST_INSERT_HEAD(head, item, wk_list); \ +} while (0) +#define WORKLIST_REMOVE(item) do { \ + (item)->wk_state &= ~ONWORKLIST; \ + LIST_REMOVE(item, wk_list); \ +} while (0) +#define WORKITEM_FREE(item, type) FREE(item, DtoM(type)) + +#else /* DEBUG */ +static void worklist_insert __P((struct workhead *, struct worklist *)); +static void worklist_remove __P((struct worklist *)); +static void workitem_free __P((struct worklist *, int)); + +#define WORKLIST_INSERT(head, item) worklist_insert(head, item) +#define WORKLIST_REMOVE(item) worklist_remove(item) +#define WORKITEM_FREE(item, type) workitem_free((struct worklist *)item, type) + +static void +worklist_insert(head, item) + struct workhead *head; + struct worklist *item; +{ + + if (lk.lkt_held == -1) + panic("worklist_insert: lock not held"); + if (item->wk_state & ONWORKLIST) + panic("worklist_insert: already on list"); + item->wk_state |= ONWORKLIST; + LIST_INSERT_HEAD(head, item, wk_list); +} + +static void +worklist_remove(item) + struct worklist *item; +{ + + if (lk.lkt_held == -1) + panic("worklist_remove: lock not held"); + if ((item->wk_state & ONWORKLIST) == 0) + panic("worklist_remove: not on list"); + item->wk_state &= ~ONWORKLIST; + LIST_REMOVE(item, wk_list); +} + +static void +workitem_free(item, type) + struct worklist *item; + int type; +{ + + if (item->wk_state & ONWORKLIST) + panic("workitem_free: still on list"); + if (item->wk_type != type) + panic("workitem_free: type mismatch"); + FREE(item, DtoM(type)); +} +#endif /* DEBUG */ + +/* + * Workitem queue management + */ +static struct workhead softdep_workitem_pending; +static int softdep_worklist_busy; +static int max_softdeps; /* maximum number of structs before slowdown */ +static int tickdelay = 2; /* number of ticks to pause during slowdown */ +static int proc_waiting; /* tracks whether we have a timeout posted */ +static struct proc *filesys_syncer; /* proc of filesystem syncer process */ +static int req_clear_inodedeps; /* syncer process flush some inodedeps */ +#define FLUSH_INODES 1 +static int req_clear_remove; /* syncer process flush some freeblks */ +#define FLUSH_REMOVE 2 +/* + * runtime statistics + */ +static int stat_blk_limit_push; /* number of times block limit neared */ +static int stat_ino_limit_push; /* number of times inode limit neared */ +static int stat_blk_limit_hit; /* number of times block slowdown imposed */ +static int stat_ino_limit_hit; /* number of times inode slowdown imposed */ +static int stat_indir_blk_ptrs; /* bufs redirtied as indir ptrs not written */ +static int stat_inode_bitmap; /* bufs redirtied as inode bitmap not written */ +static int stat_direct_blk_ptrs;/* bufs redirtied as direct ptrs not written */ +static int stat_dir_entry; /* bufs redirtied as dir entry cannot write */ +#ifdef DEBUG +#include <vm/vm.h> +#include <sys/sysctl.h> +#if defined(__FreeBSD__) +SYSCTL_INT(_debug, OID_AUTO, max_softdeps, CTLFLAG_RW, &max_softdeps, 0, ""); +SYSCTL_INT(_debug, OID_AUTO, tickdelay, CTLFLAG_RW, &tickdelay, 0, ""); +SYSCTL_INT(_debug, OID_AUTO, blk_limit_push, CTLFLAG_RW, &stat_blk_limit_push, 0,""); +SYSCTL_INT(_debug, OID_AUTO, ino_limit_push, CTLFLAG_RW, &stat_ino_limit_push, 0,""); +SYSCTL_INT(_debug, OID_AUTO, blk_limit_hit, CTLFLAG_RW, &stat_blk_limit_hit, 0, ""); +SYSCTL_INT(_debug, OID_AUTO, ino_limit_hit, CTLFLAG_RW, &stat_ino_limit_hit, 0, ""); +SYSCTL_INT(_debug, OID_AUTO, indir_blk_ptrs, CTLFLAG_RW, &stat_indir_blk_ptrs, 0, ""); +SYSCTL_INT(_debug, OID_AUTO, inode_bitmap, CTLFLAG_RW, &stat_inode_bitmap, 0, ""); +SYSCTL_INT(_debug, OID_AUTO, direct_blk_ptrs, CTLFLAG_RW, &stat_direct_blk_ptrs, 0, ""); +SYSCTL_INT(_debug, OID_AUTO, dir_entry, CTLFLAG_RW, &stat_dir_entry, 0, ""); +#else /* !__FreeBSD__ */ +struct ctldebug debug20 = { "max_softdeps", &max_softdeps }; +struct ctldebug debug21 = { "tickdelay", &tickdelay }; +struct ctldebug debug23 = { "blk_limit_push", &stat_blk_limit_push }; +struct ctldebug debug24 = { "ino_limit_push", &stat_ino_limit_push }; +struct ctldebug debug25 = { "blk_limit_hit", &stat_blk_limit_hit }; +struct ctldebug debug26 = { "ino_limit_hit", &stat_ino_limit_hit }; +struct ctldebug debug27 = { "indir_blk_ptrs", &stat_indir_blk_ptrs }; +struct ctldebug debug28 = { "inode_bitmap", &stat_inode_bitmap }; +struct ctldebug debug29 = { "direct_blk_ptrs", &stat_direct_blk_ptrs }; +struct ctldebug debug30 = { "dir_entry", &stat_dir_entry }; +#endif /* !__FreeBSD__ */ + +#endif /* DEBUG */ + +/* + * Add an item to the end of the work queue. + * This routine requires that the lock be held. + * This is the only routine that adds items to the list. + * The following routine is the only one that removes items + * and does so in order from first to last. + */ +static void +add_to_worklist(wk) + struct worklist *wk; +{ + static struct worklist *worklist_tail; + + if (wk->wk_state & ONWORKLIST) + panic("add_to_worklist: already on list"); + wk->wk_state |= ONWORKLIST; + if (LIST_FIRST(&softdep_workitem_pending) == NULL) + LIST_INSERT_HEAD(&softdep_workitem_pending, wk, wk_list); + else + LIST_INSERT_AFTER(worklist_tail, wk, wk_list); + worklist_tail = wk; +} + +/* + * Process that runs once per second to handle items in the background queue. + * + * Note that we ensure that everything is done in the order in which they + * appear in the queue. The code below depends on this property to ensure + * that blocks of a file are freed before the inode itself is freed. This + * ordering ensures that no new <vfsid, inum, lbn> triples will be generated + * until all the old ones have been purged from the dependency lists. + */ +int +softdep_process_worklist(matchmnt) + struct mount *matchmnt; +{ + struct proc *p = CURPROC; + struct worklist *wk; + struct fs *matchfs; + int matchcnt; + + /* + * Record the process identifier of our caller so that we can give + * this process preferential treatment in request_cleanup below. + */ + filesys_syncer = p; + matchcnt = 0; + matchfs = NULL; + if (matchmnt != NULL) + matchfs = VFSTOUFS(matchmnt)->um_fs; + /* + * There is no danger of having multiple processes run this + * code. It is single threaded solely so that softdep_flushfiles + * (below) can get an accurate count of the number of items + * related to its mount point that are in the list. + */ + if (softdep_worklist_busy && matchmnt == NULL) + return (-1); + /* + * If requested, try removing inode or removal dependencies. + */ + if (req_clear_inodedeps) { + clear_inodedeps(p); + req_clear_inodedeps = 0; + wakeup(&proc_waiting); + } + if (req_clear_remove) { + clear_remove(p); + req_clear_remove = 0; + wakeup(&proc_waiting); + } + ACQUIRE_LOCK(&lk); + while ((wk = LIST_FIRST(&softdep_workitem_pending)) != 0) { + WORKLIST_REMOVE(wk); + FREE_LOCK(&lk); + switch (wk->wk_type) { + + case D_DIRREM: + /* removal of a directory entry */ + if (WK_DIRREM(wk)->dm_mnt == matchmnt) + matchcnt += 1; + handle_workitem_remove(WK_DIRREM(wk)); + break; + + case D_FREEBLKS: + /* releasing blocks and/or fragments from a file */ + if (WK_FREEBLKS(wk)->fb_fs == matchfs) + matchcnt += 1; + handle_workitem_freeblocks(WK_FREEBLKS(wk)); + break; + + case D_FREEFRAG: + /* releasing a fragment when replaced as a file grows */ + if (WK_FREEFRAG(wk)->ff_fs == matchfs) + matchcnt += 1; + handle_workitem_freefrag(WK_FREEFRAG(wk)); + break; + + case D_FREEFILE: + /* releasing an inode when its link count drops to 0 */ + if (WK_FREEFILE(wk)->fx_fs == matchfs) + matchcnt += 1; + handle_workitem_freefile(WK_FREEFILE(wk)); + break; + + default: + panic("%s_process_worklist: Unknown type %s", + "softdep", TYPENAME(wk->wk_type)); + /* NOTREACHED */ + } + if (softdep_worklist_busy && matchmnt == NULL) + return (-1); + /* + * If requested, try removing inode or removal dependencies. + */ + if (req_clear_inodedeps) { + clear_inodedeps(p); + req_clear_inodedeps = 0; + wakeup(&proc_waiting); + } + if (req_clear_remove) { + clear_remove(p); + req_clear_remove = 0; + wakeup(&proc_waiting); + } + ACQUIRE_LOCK(&lk); + } + FREE_LOCK(&lk); + return (matchcnt); +} + +/* + * Purge the work list of all items associated with a particular mount point. + */ +int +softdep_flushfiles(oldmnt, flags, p) + struct mount *oldmnt; + int flags; + struct proc *p; +{ + struct vnode *devvp; + int error, loopcnt; + + /* + * Await our turn to clear out the queue. + */ + while (softdep_worklist_busy) + tsleep(&lbolt, PRIBIO, "softflush", 0); + softdep_worklist_busy = 1; + if ((error = ffs_flushfiles(oldmnt, flags, p)) != 0) { + softdep_worklist_busy = 0; + return (error); + } + /* + * Alternately flush the block device associated with the mount + * point and process any dependencies that the flushing + * creates. In theory, this loop can happen at most twice, + * but we give it a few extra just to be sure. + */ + devvp = VFSTOUFS(oldmnt)->um_devvp; + for (loopcnt = 10; loopcnt > 0; loopcnt--) { + if (softdep_process_worklist(oldmnt) == 0) { + /* + * Do another flush in case any vnodes were brought in + * as part of the cleanup operations. + */ + if ((error = ffs_flushfiles(oldmnt, flags, p)) != 0) + break; + /* + * If we still found nothing to do, we are really done. + */ + if (softdep_process_worklist(oldmnt) == 0) + break; + } + vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, p); + error = VOP_FSYNC(devvp, p->p_ucred, MNT_WAIT, p); + VOP_UNLOCK(devvp, 0, p); + if (error) + break; + } + softdep_worklist_busy = 0; + /* + * If we are unmounting then it is an error to fail. If we + * are simply trying to downgrade to read-only, then filesystem + * activity can keep us busy forever, so we just fail with EBUSY. + */ + if (loopcnt == 0) { + if (oldmnt->mnt_kern_flag & MNTK_UNMOUNT) + panic("softdep_flushfiles: looping"); + error = EBUSY; + } + return (error); +} + +/* + * Structure hashing. + * + * There are three types of structures that can be looked up: + * 1) pagedep structures identified by mount point, inode number, + * and logical block. + * 2) inodedep structures identified by mount point and inode number. + * 3) newblk structures identified by mount point and + * physical block number. + * + * The "pagedep" and "inodedep" dependency structures are hashed + * separately from the file blocks and inodes to which they correspond. + * This separation helps when the in-memory copy of an inode or + * file block must be replaced. It also obviates the need to access + * an inode or file page when simply updating (or de-allocating) + * dependency structures. Lookup of newblk structures is needed to + * find newly allocated blocks when trying to associate them with + * their allocdirect or allocindir structure. + * + * The lookup routines optionally create and hash a new instance when + * an existing entry is not found. + */ +#define DEPALLOC 0x0001 /* allocate structure if lookup fails */ + +/* + * Structures and routines associated with pagedep caching. + */ +LIST_HEAD(pagedep_hashhead, pagedep) *pagedep_hashtbl; +u_long pagedep_hash; /* size of hash table - 1 */ +#define PAGEDEP_HASH(mp, inum, lbn) \ + (&pagedep_hashtbl[((((register_t)(mp)) >> 13) + (inum) + (lbn)) & \ + pagedep_hash]) +static struct sema pagedep_in_progress; + +/* + * Look up a pagedep. Return 1 if found, 0 if not found. + * If not found, allocate if DEPALLOC flag is passed. + * Found or allocated entry is returned in pagedeppp. + * This routine must be called with splbio interrupts blocked. + */ +static int +pagedep_lookup(ip, lbn, flags, pagedeppp) + struct inode *ip; + ufs_lbn_t lbn; + int flags; + struct pagedep **pagedeppp; +{ + struct pagedep *pagedep; + struct pagedep_hashhead *pagedephd; + struct mount *mp; + int i; + +#ifdef DEBUG + if (lk.lkt_held == -1) + panic("pagedep_lookup: lock not held"); +#endif + mp = ITOV(ip)->v_mount; + pagedephd = PAGEDEP_HASH(mp, ip->i_number, lbn); +top: + for (pagedep = LIST_FIRST(pagedephd); pagedep; + pagedep = LIST_NEXT(pagedep, pd_hash)) + if (ip->i_number == pagedep->pd_ino && + lbn == pagedep->pd_lbn && + mp == pagedep->pd_mnt) + break; + if (pagedep) { + *pagedeppp = pagedep; + return (1); + } + if ((flags & DEPALLOC) == 0) { + *pagedeppp = NULL; + return (0); + } + if (sema_get(&pagedep_in_progress, &lk) == 0) { + ACQUIRE_LOCK(&lk); + goto top; + } + MALLOC(pagedep, struct pagedep *, sizeof(struct pagedep), M_PAGEDEP, + M_WAITOK); + bzero(pagedep, sizeof(struct pagedep)); + pagedep->pd_list.wk_type = D_PAGEDEP; + pagedep->pd_mnt = mp; + pagedep->pd_ino = ip->i_number; + pagedep->pd_lbn = lbn; + LIST_INIT(&pagedep->pd_dirremhd); + LIST_INIT(&pagedep->pd_pendinghd); + for (i = 0; i < DAHASHSZ; i++) + LIST_INIT(&pagedep->pd_diraddhd[i]); + ACQUIRE_LOCK(&lk); + LIST_INSERT_HEAD(pagedephd, pagedep, pd_hash); + sema_release(&pagedep_in_progress); + *pagedeppp = pagedep; + return (0); +} + +/* + * Structures and routines associated with inodedep caching. + */ +LIST_HEAD(inodedep_hashhead, inodedep) *inodedep_hashtbl; +static u_long inodedep_hash; /* size of hash table - 1 */ +static long num_inodedep; /* number of inodedep allocated */ +#define INODEDEP_HASH(fs, inum) \ + (&inodedep_hashtbl[((((register_t)(fs)) >> 13) + (inum)) & inodedep_hash]) +static struct sema inodedep_in_progress; + +/* + * Look up a inodedep. Return 1 if found, 0 if not found. + * If not found, allocate if DEPALLOC flag is passed. + * Found or allocated entry is returned in inodedeppp. + * This routine must be called with splbio interrupts blocked. + */ +static int +inodedep_lookup(fs, inum, flags, inodedeppp) + struct fs *fs; + ino_t inum; + int flags; + struct inodedep **inodedeppp; +{ + struct inodedep *inodedep; + struct inodedep_hashhead *inodedephd; + int firsttry; + +#ifdef DEBUG + if (lk.lkt_held == -1) + panic("inodedep_lookup: lock not held"); +#endif + firsttry = 1; + inodedephd = INODEDEP_HASH(fs, inum); +top: + for (inodedep = LIST_FIRST(inodedephd); inodedep; + inodedep = LIST_NEXT(inodedep, id_hash)) + if (inum == inodedep->id_ino && fs == inodedep->id_fs) + break; + if (inodedep) { + *inodedeppp = inodedep; + return (1); + } + if ((flags & DEPALLOC) == 0) { + *inodedeppp = NULL; + return (0); + } + /* + * If we are over our limit, try to improve the situation. + */ + if (num_inodedep > max_softdeps && firsttry && speedup_syncer() == 0 && + request_cleanup(FLUSH_INODES, 1)) { + firsttry = 0; + goto top; + } + if (sema_get(&inodedep_in_progress, &lk) == 0) { + ACQUIRE_LOCK(&lk); + goto top; + } + num_inodedep += 1; + MALLOC(inodedep, struct inodedep *, sizeof(struct inodedep), + M_INODEDEP, M_WAITOK); + inodedep->id_list.wk_type = D_INODEDEP; + inodedep->id_fs = fs; + inodedep->id_ino = inum; + inodedep->id_state = ALLCOMPLETE; + inodedep->id_nlinkdelta = 0; + inodedep->id_savedino = NULL; + inodedep->id_savedsize = -1; + inodedep->id_buf = NULL; + LIST_INIT(&inodedep->id_pendinghd); + LIST_INIT(&inodedep->id_inowait); + LIST_INIT(&inodedep->id_bufwait); + TAILQ_INIT(&inodedep->id_inoupdt); + TAILQ_INIT(&inodedep->id_newinoupdt); + ACQUIRE_LOCK(&lk); + LIST_INSERT_HEAD(inodedephd, inodedep, id_hash); + sema_release(&inodedep_in_progress); + *inodedeppp = inodedep; + return (0); +} + +/* + * Structures and routines associated with newblk caching. + */ +LIST_HEAD(newblk_hashhead, newblk) *newblk_hashtbl; +u_long newblk_hash; /* size of hash table - 1 */ +#define NEWBLK_HASH(fs, inum) \ + (&newblk_hashtbl[((((register_t)(fs)) >> 13) + (inum)) & newblk_hash]) +static struct sema newblk_in_progress; + +/* + * Look up a newblk. Return 1 if found, 0 if not found. + * If not found, allocate if DEPALLOC flag is passed. + * Found or allocated entry is returned in newblkpp. + */ +static int +newblk_lookup(fs, newblkno, flags, newblkpp) + struct fs *fs; + ufs_daddr_t newblkno; + int flags; + struct newblk **newblkpp; +{ + struct newblk *newblk; + struct newblk_hashhead *newblkhd; + + newblkhd = NEWBLK_HASH(fs, newblkno); +top: + for (newblk = LIST_FIRST(newblkhd); newblk; + newblk = LIST_NEXT(newblk, nb_hash)) + if (newblkno == newblk->nb_newblkno && fs == newblk->nb_fs) + break; + if (newblk) { + *newblkpp = newblk; + return (1); + } + if ((flags & DEPALLOC) == 0) { + *newblkpp = NULL; + return (0); + } + if (sema_get(&newblk_in_progress, 0) == 0) + goto top; + MALLOC(newblk, struct newblk *, sizeof(struct newblk), + M_NEWBLK, M_WAITOK); + newblk->nb_state = 0; + newblk->nb_fs = fs; + newblk->nb_newblkno = newblkno; + LIST_INSERT_HEAD(newblkhd, newblk, nb_hash); + sema_release(&newblk_in_progress); + *newblkpp = newblk; + return (0); +} + +/* + * Executed during filesystem system initialization before + * mounting any file systems. + */ +void +softdep_initialize() +{ + + LIST_INIT(&mkdirlisthd); + LIST_INIT(&softdep_workitem_pending); + max_softdeps = desiredvnodes * 8; + pagedep_hashtbl = hashinit(desiredvnodes / 5, M_PAGEDEP, + &pagedep_hash); + sema_init(&pagedep_in_progress, "pagedep", PRIBIO, 0); + inodedep_hashtbl = hashinit(desiredvnodes, M_INODEDEP, &inodedep_hash); + sema_init(&inodedep_in_progress, "inodedep", PRIBIO, 0); + newblk_hashtbl = hashinit(64, M_NEWBLK, &newblk_hash); + sema_init(&newblk_in_progress, "newblk", PRIBIO, 0); +} + +/* + * Called at mount time to notify the dependency code that a + * filesystem wishes to use it. + */ +int +softdep_mount(devvp, mp, fs, cred) + struct vnode *devvp; + struct mount *mp; + struct fs *fs; + struct ucred *cred; +{ + struct csum cstotal; + struct cg *cgp; + struct buf *bp; + int error, cyl; + + mp->mnt_flag &= ~MNT_ASYNC; + mp->mnt_flag |= MNT_SOFTDEP; + /* + * When doing soft updates, the counters in the + * superblock may have gotten out of sync, so we have + * to scan the cylinder groups and recalculate them. + */ + if (fs->fs_clean != 0) + return (0); + bzero(&cstotal, sizeof cstotal); + for (cyl = 0; cyl < fs->fs_ncg; cyl++) { + if ((error = bread(devvp, fsbtodb(fs, cgtod(fs, cyl)), + fs->fs_cgsize, cred, &bp)) != 0) { + brelse(bp); + return (error); + } + cgp = (struct cg *)bp->b_data; + cstotal.cs_nffree += cgp->cg_cs.cs_nffree; + cstotal.cs_nbfree += cgp->cg_cs.cs_nbfree; + cstotal.cs_nifree += cgp->cg_cs.cs_nifree; + cstotal.cs_ndir += cgp->cg_cs.cs_ndir; + fs->fs_cs(fs, cyl) = cgp->cg_cs; + brelse(bp); + } +#ifdef DEBUG + if (bcmp(&cstotal, &fs->fs_cstotal, sizeof cstotal)) + printf("ffs_mountfs: superblock updated for soft updates\n"); +#endif + bcopy(&cstotal, &fs->fs_cstotal, sizeof cstotal); + return (0); +} + +/* + * Protecting the freemaps (or bitmaps). + * + * To eliminate the need to execute fsck before mounting a file system + * after a power failure, one must (conservatively) guarantee that the + * on-disk copy of the bitmaps never indicate that a live inode or block is + * free. So, when a block or inode is allocated, the bitmap should be + * updated (on disk) before any new pointers. When a block or inode is + * freed, the bitmap should not be updated until all pointers have been + * reset. The latter dependency is handled by the delayed de-allocation + * approach described below for block and inode de-allocation. The former + * dependency is handled by calling the following procedure when a block or + * inode is allocated. When an inode is allocated an "inodedep" is created + * with its DEPCOMPLETE flag cleared until its bitmap is written to disk. + * Each "inodedep" is also inserted into the hash indexing structure so + * that any additional link additions can be made dependent on the inode + * allocation. + * + * The ufs file system maintains a number of free block counts (e.g., per + * cylinder group, per cylinder and per <cylinder, rotational position> pair) + * in addition to the bitmaps. These counts are used to improve efficiency + * during allocation and therefore must be consistent with the bitmaps. + * There is no convenient way to guarantee post-crash consistency of these + * counts with simple update ordering, for two main reasons: (1) The counts + * and bitmaps for a single cylinder group block are not in the same disk + * sector. If a disk write is interrupted (e.g., by power failure), one may + * be written and the other not. (2) Some of the counts are located in the + * superblock rather than the cylinder group block. So, we focus our soft + * updates implementation on protecting the bitmaps. When mounting a + * filesystem, we recompute the auxiliary counts from the bitmaps. + */ + +/* + * Called just after updating the cylinder group block to allocate an inode. + */ +void +softdep_setup_inomapdep(bp, ip, newinum) + struct buf *bp; /* buffer for cylgroup block with inode map */ + struct inode *ip; /* inode related to allocation */ + ino_t newinum; /* new inode number being allocated */ +{ + struct inodedep *inodedep; + struct bmsafemap *bmsafemap; + + /* + * Create a dependency for the newly allocated inode. + * Panic if it already exists as something is seriously wrong. + * Otherwise add it to the dependency list for the buffer holding + * the cylinder group map from which it was allocated. + */ + ACQUIRE_LOCK(&lk); + if (inodedep_lookup(ip->i_fs, newinum, DEPALLOC, &inodedep) != 0) + panic("softdep_setup_inomapdep: found inode"); + inodedep->id_buf = bp; + inodedep->id_state &= ~DEPCOMPLETE; + bmsafemap = bmsafemap_lookup(bp); + LIST_INSERT_HEAD(&bmsafemap->sm_inodedephd, inodedep, id_deps); + FREE_LOCK(&lk); +} + +/* + * Called just after updating the cylinder group block to + * allocate block or fragment. + */ +void +softdep_setup_blkmapdep(bp, fs, newblkno) + struct buf *bp; /* buffer for cylgroup block with block map */ + struct fs *fs; /* filesystem doing allocation */ + ufs_daddr_t newblkno; /* number of newly allocated block */ +{ + struct newblk *newblk; + struct bmsafemap *bmsafemap; + + /* + * Create a dependency for the newly allocated block. + * Add it to the dependency list for the buffer holding + * the cylinder group map from which it was allocated. + */ + if (newblk_lookup(fs, newblkno, DEPALLOC, &newblk) != 0) + panic("softdep_setup_blkmapdep: found block"); + ACQUIRE_LOCK(&lk); + newblk->nb_bmsafemap = bmsafemap = bmsafemap_lookup(bp); + LIST_INSERT_HEAD(&bmsafemap->sm_newblkhd, newblk, nb_deps); + FREE_LOCK(&lk); +} + +/* + * Find the bmsafemap associated with a cylinder group buffer. + * If none exists, create one. The buffer must be locked when + * this routine is called and this routine must be called with + * splbio interrupts blocked. + */ +static struct bmsafemap * +bmsafemap_lookup(bp) + struct buf *bp; +{ + struct bmsafemap *bmsafemap; + struct worklist *wk; + +#ifdef DEBUG + if (lk.lkt_held == -1) + panic("bmsafemap_lookup: lock not held"); +#endif + for (wk = LIST_FIRST(&bp->b_dep); wk; wk = LIST_NEXT(wk, wk_list)) + if (wk->wk_type == D_BMSAFEMAP) + return (WK_BMSAFEMAP(wk)); + FREE_LOCK(&lk); + MALLOC(bmsafemap, struct bmsafemap *, sizeof(struct bmsafemap), + M_BMSAFEMAP, M_WAITOK); + bmsafemap->sm_list.wk_type = D_BMSAFEMAP; + bmsafemap->sm_list.wk_state = 0; + bmsafemap->sm_buf = bp; + LIST_INIT(&bmsafemap->sm_allocdirecthd); + LIST_INIT(&bmsafemap->sm_allocindirhd); + LIST_INIT(&bmsafemap->sm_inodedephd); + LIST_INIT(&bmsafemap->sm_newblkhd); + ACQUIRE_LOCK(&lk); + WORKLIST_INSERT(&bp->b_dep, &bmsafemap->sm_list); + return (bmsafemap); +} + +/* + * Direct block allocation dependencies. + * + * When a new block is allocated, the corresponding disk locations must be + * initialized (with zeros or new data) before the on-disk inode points to + * them. Also, the freemap from which the block was allocated must be + * updated (on disk) before the inode's pointer. These two dependencies are + * independent of each other and are needed for all file blocks and indirect + * blocks that are pointed to directly by the inode. Just before the + * "in-core" version of the inode is updated with a newly allocated block + * number, a procedure (below) is called to setup allocation dependency + * structures. These structures are removed when the corresponding + * dependencies are satisfied or when the block allocation becomes obsolete + * (i.e., the file is deleted, the block is de-allocated, or the block is a + * fragment that gets upgraded). All of these cases are handled in + * procedures described later. + * + * When a file extension causes a fragment to be upgraded, either to a larger + * fragment or to a full block, the on-disk location may change (if the + * previous fragment could not simply be extended). In this case, the old + * fragment must be de-allocated, but not until after the inode's pointer has + * been updated. In most cases, this is handled by later procedures, which + * will construct a "freefrag" structure to be added to the workitem queue + * when the inode update is complete (or obsolete). The main exception to + * this is when an allocation occurs while a pending allocation dependency + * (for the same block pointer) remains. This case is handled in the main + * allocation dependency setup procedure by immediately freeing the + * unreferenced fragments. + */ +void +softdep_setup_allocdirect(ip, lbn, newblkno, oldblkno, newsize, oldsize, bp) + struct inode *ip; /* inode to which block is being added */ + ufs_lbn_t lbn; /* block pointer within inode */ + ufs_daddr_t newblkno; /* disk block number being added */ + ufs_daddr_t oldblkno; /* previous block number, 0 unless frag */ + long newsize; /* size of new block */ + long oldsize; /* size of new block */ + struct buf *bp; /* bp for allocated block */ +{ + struct allocdirect *adp, *oldadp; + struct allocdirectlst *adphead; + struct bmsafemap *bmsafemap; + struct inodedep *inodedep; + struct pagedep *pagedep; + struct newblk *newblk; + + MALLOC(adp, struct allocdirect *, sizeof(struct allocdirect), + M_ALLOCDIRECT, M_WAITOK); + bzero(adp, sizeof(struct allocdirect)); + adp->ad_list.wk_type = D_ALLOCDIRECT; + adp->ad_lbn = lbn; + adp->ad_newblkno = newblkno; + adp->ad_oldblkno = oldblkno; + adp->ad_newsize = newsize; + adp->ad_oldsize = oldsize; + adp->ad_state = ATTACHED; + if (newblkno == oldblkno) + adp->ad_freefrag = NULL; + else + adp->ad_freefrag = newfreefrag(ip, oldblkno, oldsize); + + if (newblk_lookup(ip->i_fs, newblkno, 0, &newblk) == 0) + panic("softdep_setup_allocdirect: lost block"); + + ACQUIRE_LOCK(&lk); + (void) inodedep_lookup(ip->i_fs, ip->i_number, DEPALLOC, &inodedep); + adp->ad_inodedep = inodedep; + + if (newblk->nb_state == DEPCOMPLETE) { + adp->ad_state |= DEPCOMPLETE; + adp->ad_buf = NULL; + } else { + bmsafemap = newblk->nb_bmsafemap; + adp->ad_buf = bmsafemap->sm_buf; + LIST_REMOVE(newblk, nb_deps); + LIST_INSERT_HEAD(&bmsafemap->sm_allocdirecthd, adp, ad_deps); + } + LIST_REMOVE(newblk, nb_hash); + FREE(newblk, M_NEWBLK); + + WORKLIST_INSERT(&bp->b_dep, &adp->ad_list); + if (lbn >= NDADDR) { + /* allocating an indirect block */ + if (oldblkno != 0) + panic("softdep_setup_allocdirect: non-zero indir"); + } else { + /* + * Allocating a direct block. + * + * If we are allocating a directory block, then we must + * allocate an associated pagedep to track additions and + * deletions. + */ + if ((ip->i_mode & IFMT) == IFDIR && + pagedep_lookup(ip, lbn, DEPALLOC, &pagedep) == 0) + WORKLIST_INSERT(&bp->b_dep, &pagedep->pd_list); + } + /* + * The list of allocdirects must be kept in sorted and ascending + * order so that the rollback routines can quickly determine the + * first uncommitted block (the size of the file stored on disk + * ends at the end of the lowest committed fragment, or if there + * are no fragments, at the end of the highest committed block). + * Since files generally grow, the typical case is that the new + * block is to be added at the end of the list. We speed this + * special case by checking against the last allocdirect in the + * list before laboriously traversing the list looking for the + * insertion point. + */ + adphead = &inodedep->id_newinoupdt; + oldadp = TAILQ_LAST(adphead, allocdirectlst); + if (oldadp == NULL || oldadp->ad_lbn <= lbn) { + /* insert at end of list */ + TAILQ_INSERT_TAIL(adphead, adp, ad_next); + if (oldadp != NULL && oldadp->ad_lbn == lbn) + allocdirect_merge(adphead, adp, oldadp); + FREE_LOCK(&lk); + return; + } + for (oldadp = TAILQ_FIRST(adphead); oldadp; + oldadp = TAILQ_NEXT(oldadp, ad_next)) { + if (oldadp->ad_lbn >= lbn) + break; + } + if (oldadp == NULL) + panic("softdep_setup_allocdirect: lost entry"); + /* insert in middle of list */ + TAILQ_INSERT_BEFORE(oldadp, adp, ad_next); + if (oldadp->ad_lbn == lbn) + allocdirect_merge(adphead, adp, oldadp); + FREE_LOCK(&lk); +} + +/* + * Replace an old allocdirect dependency with a newer one. + * This routine must be called with splbio interrupts blocked. + */ +static void +allocdirect_merge(adphead, newadp, oldadp) + struct allocdirectlst *adphead; /* head of list holding allocdirects */ + struct allocdirect *newadp; /* allocdirect being added */ + struct allocdirect *oldadp; /* existing allocdirect being checked */ +{ + struct freefrag *freefrag; + +#ifdef DEBUG + if (lk.lkt_held == -1) + panic("allocdirect_merge: lock not held"); +#endif + if (newadp->ad_oldblkno != oldadp->ad_newblkno || + newadp->ad_oldsize != oldadp->ad_newsize || + newadp->ad_lbn >= NDADDR) + panic("allocdirect_check: old %d != new %d || lbn %ld >= %d", + newadp->ad_oldblkno, oldadp->ad_newblkno, newadp->ad_lbn, + NDADDR); + newadp->ad_oldblkno = oldadp->ad_oldblkno; + newadp->ad_oldsize = oldadp->ad_oldsize; + /* + * If the old dependency had a fragment to free or had never + * previously had a block allocated, then the new dependency + * can immediately post its freefrag and adopt the old freefrag. + * This action is done by swapping the freefrag dependencies. + * The new dependency gains the old one's freefrag, and the + * old one gets the new one and then immediately puts it on + * the worklist when it is freed by free_allocdirect. It is + * not possible to do this swap when the old dependency had a + * non-zero size but no previous fragment to free. This condition + * arises when the new block is an extension of the old block. + * Here, the first part of the fragment allocated to the new + * dependency is part of the block currently claimed on disk by + * the old dependency, so cannot legitimately be freed until the + * conditions for the new dependency are fulfilled. + */ + if (oldadp->ad_freefrag != NULL || oldadp->ad_oldblkno == 0) { + freefrag = newadp->ad_freefrag; + newadp->ad_freefrag = oldadp->ad_freefrag; + oldadp->ad_freefrag = freefrag; + } + free_allocdirect(adphead, oldadp, 0); +} + +/* + * Allocate a new freefrag structure if needed. + */ +static struct freefrag * +newfreefrag(ip, blkno, size) + struct inode *ip; + ufs_daddr_t blkno; + long size; +{ + struct freefrag *freefrag; + struct fs *fs; + + if (blkno == 0) + return (NULL); + fs = ip->i_fs; + if (fragnum(fs, blkno) + numfrags(fs, size) > fs->fs_frag) + panic("newfreefrag: frag size"); + MALLOC(freefrag, struct freefrag *, sizeof(struct freefrag), + M_FREEFRAG, M_WAITOK); + freefrag->ff_list.wk_type = D_FREEFRAG; + freefrag->ff_state = ip->i_uid & ~ONWORKLIST; /* XXX - used below */ + freefrag->ff_inum = ip->i_number; + freefrag->ff_fs = fs; + freefrag->ff_devvp = ip->i_devvp; + freefrag->ff_blkno = blkno; + freefrag->ff_fragsize = size; + return (freefrag); +} + +/* + * This workitem de-allocates fragments that were replaced during + * file block allocation. + */ +static void +handle_workitem_freefrag(freefrag) + struct freefrag *freefrag; +{ + struct inode tip; + + tip.i_fs = freefrag->ff_fs; + tip.i_devvp = freefrag->ff_devvp; + tip.i_dev = freefrag->ff_devvp->v_rdev; + tip.i_number = freefrag->ff_inum; + tip.i_uid = freefrag->ff_state & ~ONWORKLIST; /* XXX - set above */ + ffs_blkfree(&tip, freefrag->ff_blkno, freefrag->ff_fragsize); + FREE(freefrag, M_FREEFRAG); +} + +/* + * Indirect block allocation dependencies. + * + * The same dependencies that exist for a direct block also exist when + * a new block is allocated and pointed to by an entry in a block of + * indirect pointers. The undo/redo states described above are also + * used here. Because an indirect block contains many pointers that + * may have dependencies, a second copy of the entire in-memory indirect + * block is kept. The buffer cache copy is always completely up-to-date. + * The second copy, which is used only as a source for disk writes, + * contains only the safe pointers (i.e., those that have no remaining + * update dependencies). The second copy is freed when all pointers + * are safe. The cache is not allowed to replace indirect blocks with + * pending update dependencies. If a buffer containing an indirect + * block with dependencies is written, these routines will mark it + * dirty again. It can only be successfully written once all the + * dependencies are removed. The ffs_fsync routine in conjunction with + * softdep_sync_metadata work together to get all the dependencies + * removed so that a file can be successfully written to disk. Three + * procedures are used when setting up indirect block pointer + * dependencies. The division is necessary because of the organization + * of the "balloc" routine and because of the distinction between file + * pages and file metadata blocks. + */ + +/* + * Allocate a new allocindir structure. + */ +static struct allocindir * +newallocindir(ip, ptrno, newblkno, oldblkno) + struct inode *ip; /* inode for file being extended */ + int ptrno; /* offset of pointer in indirect block */ + ufs_daddr_t newblkno; /* disk block number being added */ + ufs_daddr_t oldblkno; /* previous block number, 0 if none */ +{ + struct allocindir *aip; + + MALLOC(aip, struct allocindir *, sizeof(struct allocindir), + M_ALLOCINDIR, M_WAITOK); + bzero(aip, sizeof(struct allocindir)); + aip->ai_list.wk_type = D_ALLOCINDIR; + aip->ai_state = ATTACHED; + aip->ai_offset = ptrno; + aip->ai_newblkno = newblkno; + aip->ai_oldblkno = oldblkno; + aip->ai_freefrag = newfreefrag(ip, oldblkno, ip->i_fs->fs_bsize); + return (aip); +} + +/* + * Called just before setting an indirect block pointer + * to a newly allocated file page. + */ +void +softdep_setup_allocindir_page(ip, lbn, bp, ptrno, newblkno, oldblkno, nbp) + struct inode *ip; /* inode for file being extended */ + ufs_lbn_t lbn; /* allocated block number within file */ + struct buf *bp; /* buffer with indirect blk referencing page */ + int ptrno; /* offset of pointer in indirect block */ + ufs_daddr_t newblkno; /* disk block number being added */ + ufs_daddr_t oldblkno; /* previous block number, 0 if none */ + struct buf *nbp; /* buffer holding allocated page */ +{ + struct allocindir *aip; + struct pagedep *pagedep; + + aip = newallocindir(ip, ptrno, newblkno, oldblkno); + ACQUIRE_LOCK(&lk); + /* + * If we are allocating a directory page, then we must + * allocate an associated pagedep to track additions and + * deletions. + */ + if ((ip->i_mode & IFMT) == IFDIR && + pagedep_lookup(ip, lbn, DEPALLOC, &pagedep) == 0) + WORKLIST_INSERT(&nbp->b_dep, &pagedep->pd_list); + WORKLIST_INSERT(&nbp->b_dep, &aip->ai_list); + FREE_LOCK(&lk); + setup_allocindir_phase2(bp, ip, aip); +} + +/* + * Called just before setting an indirect block pointer to a + * newly allocated indirect block. + */ +void +softdep_setup_allocindir_meta(nbp, ip, bp, ptrno, newblkno) + struct buf *nbp; /* newly allocated indirect block */ + struct inode *ip; /* inode for file being extended */ + struct buf *bp; /* indirect block referencing allocated block */ + int ptrno; /* offset of pointer in indirect block */ + ufs_daddr_t newblkno; /* disk block number being added */ +{ + struct allocindir *aip; + + aip = newallocindir(ip, ptrno, newblkno, 0); + ACQUIRE_LOCK(&lk); + WORKLIST_INSERT(&nbp->b_dep, &aip->ai_list); + FREE_LOCK(&lk); + setup_allocindir_phase2(bp, ip, aip); +} + +/* + * Called to finish the allocation of the "aip" allocated + * by one of the two routines above. + */ +static void +setup_allocindir_phase2(bp, ip, aip) + struct buf *bp; /* in-memory copy of the indirect block */ + struct inode *ip; /* inode for file being extended */ + struct allocindir *aip; /* allocindir allocated by the above routines */ +{ + struct worklist *wk; + struct indirdep *indirdep, *newindirdep; + struct bmsafemap *bmsafemap; + struct allocindir *oldaip; + struct freefrag *freefrag; + struct newblk *newblk; + + if (bp->b_lblkno >= 0) + panic("setup_allocindir_phase2: not indir blk"); + for (indirdep = NULL, newindirdep = NULL; ; ) { + ACQUIRE_LOCK(&lk); + for (wk = LIST_FIRST(&bp->b_dep); wk; + wk = LIST_NEXT(wk, wk_list)) { + if (wk->wk_type != D_INDIRDEP) + continue; + indirdep = WK_INDIRDEP(wk); + break; + } + if (indirdep == NULL && newindirdep) { + indirdep = newindirdep; + WORKLIST_INSERT(&bp->b_dep, &indirdep->ir_list); + newindirdep = NULL; + } + FREE_LOCK(&lk); + if (indirdep) { + if (newblk_lookup(ip->i_fs, aip->ai_newblkno, 0, + &newblk) == 0) + panic("setup_allocindir: lost block"); + ACQUIRE_LOCK(&lk); + if (newblk->nb_state == DEPCOMPLETE) { + aip->ai_state |= DEPCOMPLETE; + aip->ai_buf = NULL; + } else { + bmsafemap = newblk->nb_bmsafemap; + aip->ai_buf = bmsafemap->sm_buf; + LIST_REMOVE(newblk, nb_deps); + LIST_INSERT_HEAD(&bmsafemap->sm_allocindirhd, + aip, ai_deps); + } + LIST_REMOVE(newblk, nb_hash); + FREE(newblk, M_NEWBLK); + aip->ai_indirdep = indirdep; + /* + * Check to see if there is an existing dependency + * for this block. If there is, merge the old + * dependency into the new one. + */ + if (aip->ai_oldblkno == 0) + oldaip = NULL; + else + for (oldaip=LIST_FIRST(&indirdep->ir_deplisthd); + oldaip; oldaip = LIST_NEXT(oldaip, ai_next)) + if (oldaip->ai_offset == aip->ai_offset) + break; + if (oldaip != NULL) { + if (oldaip->ai_newblkno != aip->ai_oldblkno) + panic("setup_allocindir_phase2: blkno"); + aip->ai_oldblkno = oldaip->ai_oldblkno; + freefrag = oldaip->ai_freefrag; + oldaip->ai_freefrag = aip->ai_freefrag; + aip->ai_freefrag = freefrag; + free_allocindir(oldaip, NULL); + } + LIST_INSERT_HEAD(&indirdep->ir_deplisthd, aip, ai_next); + ((ufs_daddr_t *)indirdep->ir_savebp->b_data) + [aip->ai_offset] = aip->ai_oldblkno; + FREE_LOCK(&lk); + } + if (newindirdep) { + if (indirdep->ir_savebp != NULL) + brelse(newindirdep->ir_savebp); + WORKITEM_FREE((caddr_t)newindirdep, D_INDIRDEP); + } + if (indirdep) + break; + MALLOC(newindirdep, struct indirdep *, sizeof(struct indirdep), + M_INDIRDEP, M_WAITOK); + newindirdep->ir_list.wk_type = D_INDIRDEP; + newindirdep->ir_state = ATTACHED; + LIST_INIT(&newindirdep->ir_deplisthd); + LIST_INIT(&newindirdep->ir_donehd); + if (bp->b_blkno == bp->b_lblkno) { + VOP_BMAP(bp->b_vp, bp->b_lblkno, NULL, &bp->b_blkno, + NULL, NULL); + } + newindirdep->ir_savebp = + getblk(ip->i_devvp, bp->b_blkno, bp->b_bcount, 0, 0); + BUF_KERNPROC(newindirdep->ir_savebp); + bcopy(bp->b_data, newindirdep->ir_savebp->b_data, bp->b_bcount); + } +} + +/* + * Block de-allocation dependencies. + * + * When blocks are de-allocated, the on-disk pointers must be nullified before + * the blocks are made available for use by other files. (The true + * requirement is that old pointers must be nullified before new on-disk + * pointers are set. We chose this slightly more stringent requirement to + * reduce complexity.) Our implementation handles this dependency by updating + * the inode (or indirect block) appropriately but delaying the actual block + * de-allocation (i.e., freemap and free space count manipulation) until + * after the updated versions reach stable storage. After the disk is + * updated, the blocks can be safely de-allocated whenever it is convenient. + * This implementation handles only the common case of reducing a file's + * length to zero. Other cases are handled by the conventional synchronous + * write approach. + * + * The ffs implementation with which we worked double-checks + * the state of the block pointers and file size as it reduces + * a file's length. Some of this code is replicated here in our + * soft updates implementation. The freeblks->fb_chkcnt field is + * used to transfer a part of this information to the procedure + * that eventually de-allocates the blocks. + * + * This routine should be called from the routine that shortens + * a file's length, before the inode's size or block pointers + * are modified. It will save the block pointer information for + * later release and zero the inode so that the calling routine + * can release it. + */ +static long num_freeblks; /* number of freeblks allocated */ +void +softdep_setup_freeblocks(ip, length) + struct inode *ip; /* The inode whose length is to be reduced */ + off_t length; /* The new length for the file */ +{ + struct freeblks *freeblks; + struct inodedep *inodedep; + struct allocdirect *adp; + struct vnode *vp; + struct buf *bp; + struct fs *fs; + int i, error; + + fs = ip->i_fs; + if (length != 0) + panic("softde_setup_freeblocks: non-zero length"); + /* + * If we are over our limit, try to improve the situation. + */ + if (num_freeblks > max_softdeps / 2 && speedup_syncer() == 0) + (void) request_cleanup(FLUSH_REMOVE, 0); + num_freeblks += 1; + MALLOC(freeblks, struct freeblks *, sizeof(struct freeblks), + M_FREEBLKS, M_WAITOK); + bzero(freeblks, sizeof(struct freeblks)); + freeblks->fb_list.wk_type = D_FREEBLKS; + freeblks->fb_uid = ip->i_uid; + freeblks->fb_previousinum = ip->i_number; + freeblks->fb_devvp = ip->i_devvp; + freeblks->fb_fs = fs; + freeblks->fb_oldsize = ip->i_size; + freeblks->fb_newsize = length; + freeblks->fb_chkcnt = ip->i_blocks; + for (i = 0; i < NDADDR; i++) { + freeblks->fb_dblks[i] = ip->i_db[i]; + ip->i_db[i] = 0; + } + for (i = 0; i < NIADDR; i++) { + freeblks->fb_iblks[i] = ip->i_ib[i]; + ip->i_ib[i] = 0; + } + ip->i_blocks = 0; + ip->i_size = 0; + /* + * Push the zero'ed inode to to its disk buffer so that we are free + * to delete its dependencies below. Once the dependencies are gone + * the buffer can be safely released. + */ + if ((error = bread(ip->i_devvp, + fsbtodb(fs, ino_to_fsba(fs, ip->i_number)), + (int)fs->fs_bsize, NOCRED, &bp)) != 0) + softdep_error("softdep_setup_freeblocks", error); + *((struct dinode *)bp->b_data + ino_to_fsbo(fs, ip->i_number)) = + ip->i_din; + /* + * Find and eliminate any inode dependencies. + */ + ACQUIRE_LOCK(&lk); + (void) inodedep_lookup(fs, ip->i_number, DEPALLOC, &inodedep); + if ((inodedep->id_state & IOSTARTED) != 0) + panic("softdep_setup_freeblocks: inode busy"); + /* + * Add the freeblks structure to the list of operations that + * must await the zero'ed inode being written to disk. + */ + WORKLIST_INSERT(&inodedep->id_bufwait, &freeblks->fb_list); + /* + * Because the file length has been truncated to zero, any + * pending block allocation dependency structures associated + * with this inode are obsolete and can simply be de-allocated. + * We must first merge the two dependency lists to get rid of + * any duplicate freefrag structures, then purge the merged list. + */ + merge_inode_lists(inodedep); + while ((adp = TAILQ_FIRST(&inodedep->id_inoupdt)) != 0) + free_allocdirect(&inodedep->id_inoupdt, adp, 1); + FREE_LOCK(&lk); + bdwrite(bp); + /* + * We must wait for any I/O in progress to finish so that + * all potential buffers on the dirty list will be visible. + * Once they are all there, walk the list and get rid of + * any dependencies. + */ + vp = ITOV(ip); + ACQUIRE_LOCK(&lk); + drain_output(vp, 1); + while (getdirtybuf(&TAILQ_FIRST(&vp->v_dirtyblkhd), MNT_WAIT)) { + bp = TAILQ_FIRST(&vp->v_dirtyblkhd); + (void) inodedep_lookup(fs, ip->i_number, 0, &inodedep); + deallocate_dependencies(bp, inodedep); + bp->b_flags |= B_INVAL | B_NOCACHE; + FREE_LOCK(&lk); + brelse(bp); + ACQUIRE_LOCK(&lk); + } + /* + * Try freeing the inodedep in case that was the last dependency. + */ + if ((inodedep_lookup(fs, ip->i_number, 0, &inodedep)) != 0) + (void) free_inodedep(inodedep); + FREE_LOCK(&lk); +} + +/* + * Reclaim any dependency structures from a buffer that is about to + * be reallocated to a new vnode. The buffer must be locked, thus, + * no I/O completion operations can occur while we are manipulating + * its associated dependencies. The mutex is held so that other I/O's + * associated with related dependencies do not occur. + */ +static void +deallocate_dependencies(bp, inodedep) + struct buf *bp; + struct inodedep *inodedep; +{ + struct worklist *wk; + struct indirdep *indirdep; + struct allocindir *aip; + struct pagedep *pagedep; + struct dirrem *dirrem; + struct diradd *dap; + int i; + + while ((wk = LIST_FIRST(&bp->b_dep)) != NULL) { + switch (wk->wk_type) { + + case D_INDIRDEP: + indirdep = WK_INDIRDEP(wk); + /* + * None of the indirect pointers will ever be visible, + * so they can simply be tossed. GOINGAWAY ensures + * that allocated pointers will be saved in the buffer + * cache until they are freed. Note that they will + * only be able to be found by their physical address + * since the inode mapping the logical address will + * be gone. The save buffer used for the safe copy + * was allocated in setup_allocindir_phase2 using + * the physical address so it could be used for this + * purpose. Hence we swap the safe copy with the real + * copy, allowing the safe copy to be freed and holding + * on to the real copy for later use in indir_trunc. + */ + if (indirdep->ir_state & GOINGAWAY) + panic("deallocate_dependencies: already gone"); + indirdep->ir_state |= GOINGAWAY; + while ((aip = LIST_FIRST(&indirdep->ir_deplisthd)) != 0) + free_allocindir(aip, inodedep); + if (bp->b_lblkno >= 0 || + bp->b_blkno != indirdep->ir_savebp->b_lblkno) + panic("deallocate_dependencies: not indir"); + bcopy(bp->b_data, indirdep->ir_savebp->b_data, + bp->b_bcount); + WORKLIST_REMOVE(wk); + WORKLIST_INSERT(&indirdep->ir_savebp->b_dep, wk); + continue; + + case D_PAGEDEP: + pagedep = WK_PAGEDEP(wk); + /* + * None of the directory additions will ever be + * visible, so they can simply be tossed. + */ + for (i = 0; i < DAHASHSZ; i++) + while ((dap = + LIST_FIRST(&pagedep->pd_diraddhd[i]))) + free_diradd(dap); + while ((dap = LIST_FIRST(&pagedep->pd_pendinghd)) != 0) + free_diradd(dap); + /* + * Copy any directory remove dependencies to the list + * to be processed after the zero'ed inode is written. + * If the inode has already been written, then they + * can be dumped directly onto the work list. + */ + for (dirrem = LIST_FIRST(&pagedep->pd_dirremhd); dirrem; + dirrem = LIST_NEXT(dirrem, dm_next)) { + LIST_REMOVE(dirrem, dm_next); + dirrem->dm_dirinum = pagedep->pd_ino; + if (inodedep == NULL) + add_to_worklist(&dirrem->dm_list); + else + WORKLIST_INSERT(&inodedep->id_bufwait, + &dirrem->dm_list); + } + WORKLIST_REMOVE(&pagedep->pd_list); + LIST_REMOVE(pagedep, pd_hash); + WORKITEM_FREE(pagedep, D_PAGEDEP); + continue; + + case D_ALLOCINDIR: + free_allocindir(WK_ALLOCINDIR(wk), inodedep); + continue; + + case D_ALLOCDIRECT: + case D_INODEDEP: + panic("deallocate_dependencies: Unexpected type %s", + TYPENAME(wk->wk_type)); + /* NOTREACHED */ + + default: + panic("deallocate_dependencies: Unknown type %s", + TYPENAME(wk->wk_type)); + /* NOTREACHED */ + } + } +} + +/* + * Free an allocdirect. Generate a new freefrag work request if appropriate. + * This routine must be called with splbio interrupts blocked. + */ +static void +free_allocdirect(adphead, adp, delay) + struct allocdirectlst *adphead; + struct allocdirect *adp; + int delay; +{ + +#ifdef DEBUG + if (lk.lkt_held == -1) + panic("free_allocdirect: lock not held"); +#endif + if ((adp->ad_state & DEPCOMPLETE) == 0) + LIST_REMOVE(adp, ad_deps); + TAILQ_REMOVE(adphead, adp, ad_next); + if ((adp->ad_state & COMPLETE) == 0) + WORKLIST_REMOVE(&adp->ad_list); + if (adp->ad_freefrag != NULL) { + if (delay) + WORKLIST_INSERT(&adp->ad_inodedep->id_bufwait, + &adp->ad_freefrag->ff_list); + else + add_to_worklist(&adp->ad_freefrag->ff_list); + } + WORKITEM_FREE(adp, D_ALLOCDIRECT); +} + +/* + * Prepare an inode to be freed. The actual free operation is not + * done until the zero'ed inode has been written to disk. + */ +static long num_freefile; /* number of freefile allocated */ +void +softdep_freefile(pvp, ino, mode) + struct vnode *pvp; + ino_t ino; + int mode; +{ + struct inode *ip = VTOI(pvp); + struct inodedep *inodedep; + struct freefile *freefile; + + /* + * If we are over our limit, try to improve the situation. + */ + if (num_freefile > max_softdeps / 2 && speedup_syncer() == 0) + (void) request_cleanup(FLUSH_REMOVE, 0); + /* + * This sets up the inode de-allocation dependency. + */ + num_freefile += 1; + MALLOC(freefile, struct freefile *, sizeof(struct freefile), + M_FREEFILE, M_WAITOK); + freefile->fx_list.wk_type = D_FREEFILE; + freefile->fx_list.wk_state = 0; + freefile->fx_mode = mode; + freefile->fx_oldinum = ino; + freefile->fx_devvp = ip->i_devvp; + freefile->fx_fs = ip->i_fs; + + /* + * If the inodedep does not exist, then the zero'ed inode has + * been written to disk and we can free the file immediately. + */ + ACQUIRE_LOCK(&lk); + if (inodedep_lookup(ip->i_fs, ino, 0, &inodedep) == 0) { + add_to_worklist(&freefile->fx_list); + FREE_LOCK(&lk); + return; + } + + /* + * If we still have a bitmap dependency, then the inode has never + * been written to disk. Drop the dependency as it is no longer + * necessary since the inode is being deallocated. We could process + * the freefile immediately, but then we would have to clear the + * id_inowait dependencies here and it is easier just to let the + * zero'ed inode be written and let them be cleaned up in the + * normal followup actions that follow the inode write. + */ + if ((inodedep->id_state & DEPCOMPLETE) == 0) { + inodedep->id_state |= DEPCOMPLETE; + LIST_REMOVE(inodedep, id_deps); + inodedep->id_buf = NULL; + } + /* + * If the inodedep has no dependencies associated with it, + * then we must free it here and free the file immediately. + * This case arises when an early allocation fails (for + * example, the user is over their file quota). + */ + if (free_inodedep(inodedep) == 0) + WORKLIST_INSERT(&inodedep->id_inowait, &freefile->fx_list); + else + add_to_worklist(&freefile->fx_list); + FREE_LOCK(&lk); +} + +/* + * Try to free an inodedep structure. Return 1 if it could be freed. + */ +static int +free_inodedep(inodedep) + struct inodedep *inodedep; +{ + + if ((inodedep->id_state & ONWORKLIST) != 0 || + (inodedep->id_state & ALLCOMPLETE) != ALLCOMPLETE || + LIST_FIRST(&inodedep->id_pendinghd) != NULL || + LIST_FIRST(&inodedep->id_bufwait) != NULL || + LIST_FIRST(&inodedep->id_inowait) != NULL || + TAILQ_FIRST(&inodedep->id_inoupdt) != NULL || + TAILQ_FIRST(&inodedep->id_newinoupdt) != NULL || + inodedep->id_nlinkdelta != 0 || inodedep->id_savedino != NULL) + return (0); + LIST_REMOVE(inodedep, id_hash); + WORKITEM_FREE(inodedep, D_INODEDEP); + num_inodedep -= 1; + return (1); +} + +/* + * This workitem routine performs the block de-allocation. + * The workitem is added to the pending list after the updated + * inode block has been written to disk. As mentioned above, + * checks regarding the number of blocks de-allocated (compared + * to the number of blocks allocated for the file) are also + * performed in this function. + */ +static void +handle_workitem_freeblocks(freeblks) + struct freeblks *freeblks; +{ + struct inode tip; + ufs_daddr_t bn; + struct fs *fs; + int i, level, bsize; + long nblocks, blocksreleased = 0; + int error, allerror = 0; + ufs_lbn_t baselbns[NIADDR], tmpval; + + tip.i_number = freeblks->fb_previousinum; + tip.i_devvp = freeblks->fb_devvp; + tip.i_dev = freeblks->fb_devvp->v_rdev; + tip.i_fs = freeblks->fb_fs; + tip.i_size = freeblks->fb_oldsize; + tip.i_uid = freeblks->fb_uid; + fs = freeblks->fb_fs; + tmpval = 1; + baselbns[0] = NDADDR; + for (i = 1; i < NIADDR; i++) { + tmpval *= NINDIR(fs); + baselbns[i] = baselbns[i - 1] + tmpval; + } + nblocks = btodb(fs->fs_bsize); + blocksreleased = 0; + /* + * Indirect blocks first. + */ + for (level = (NIADDR - 1); level >= 0; level--) { + if ((bn = freeblks->fb_iblks[level]) == 0) + continue; + if ((error = indir_trunc(&tip, fsbtodb(fs, bn), level, + baselbns[level], &blocksreleased)) == 0) + allerror = error; + ffs_blkfree(&tip, bn, fs->fs_bsize); + blocksreleased += nblocks; + } + /* + * All direct blocks or frags. + */ + for (i = (NDADDR - 1); i >= 0; i--) { + if ((bn = freeblks->fb_dblks[i]) == 0) + continue; + bsize = blksize(fs, &tip, i); + ffs_blkfree(&tip, bn, bsize); + blocksreleased += btodb(bsize); + } + +#ifdef DIAGNOSTIC + if (freeblks->fb_chkcnt != blocksreleased) + panic("handle_workitem_freeblocks: block count"); + if (allerror) + softdep_error("handle_workitem_freeblks", allerror); +#endif /* DIAGNOSTIC */ + WORKITEM_FREE(freeblks, D_FREEBLKS); + num_freeblks -= 1; +} + +/* + * Release blocks associated with the inode ip and stored in the indirect + * block dbn. If level is greater than SINGLE, the block is an indirect block + * and recursive calls to indirtrunc must be used to cleanse other indirect + * blocks. + */ +static int +indir_trunc(ip, dbn, level, lbn, countp) + struct inode *ip; + ufs_daddr_t dbn; + int level; + ufs_lbn_t lbn; + long *countp; +{ + struct buf *bp; + ufs_daddr_t *bap; + ufs_daddr_t nb; + struct fs *fs; + struct worklist *wk; + struct indirdep *indirdep; + int i, lbnadd, nblocks; + int error, allerror = 0; + + fs = ip->i_fs; + lbnadd = 1; + for (i = level; i > 0; i--) + lbnadd *= NINDIR(fs); + /* + * Get buffer of block pointers to be freed. This routine is not + * called until the zero'ed inode has been written, so it is safe + * to free blocks as they are encountered. Because the inode has + * been zero'ed, calls to bmap on these blocks will fail. So, we + * have to use the on-disk address and the block device for the + * filesystem to look them up. If the file was deleted before its + * indirect blocks were all written to disk, the routine that set + * us up (deallocate_dependencies) will have arranged to leave + * a complete copy of the indirect block in memory for our use. + * Otherwise we have to read the blocks in from the disk. + */ + ACQUIRE_LOCK(&lk); + if ((bp = incore(ip->i_devvp, dbn)) != NULL && + (wk = LIST_FIRST(&bp->b_dep)) != NULL) { + if (wk->wk_type != D_INDIRDEP || + (indirdep = WK_INDIRDEP(wk))->ir_savebp != bp || + (indirdep->ir_state & GOINGAWAY) == 0) + panic("indir_trunc: lost indirdep"); + WORKLIST_REMOVE(wk); + WORKITEM_FREE(indirdep, D_INDIRDEP); + if (LIST_FIRST(&bp->b_dep) != NULL) + panic("indir_trunc: dangling dep"); + FREE_LOCK(&lk); + } else { + FREE_LOCK(&lk); + error = bread(ip->i_devvp, dbn, (int)fs->fs_bsize, NOCRED, &bp); + if (error) + return (error); + } + /* + * Recursively free indirect blocks. + */ + bap = (ufs_daddr_t *)bp->b_data; + nblocks = btodb(fs->fs_bsize); + for (i = NINDIR(fs) - 1; i >= 0; i--) { + if ((nb = bap[i]) == 0) + continue; + if (level != 0) { + if ((error = indir_trunc(ip, fsbtodb(fs, nb), + level - 1, lbn + (i * lbnadd), countp)) != 0) + allerror = error; + } + ffs_blkfree(ip, nb, fs->fs_bsize); + *countp += nblocks; + } + bp->b_flags |= B_INVAL | B_NOCACHE; + brelse(bp); + return (allerror); +} + +/* + * Free an allocindir. + * This routine must be called with splbio interrupts blocked. + */ +static void +free_allocindir(aip, inodedep) + struct allocindir *aip; + struct inodedep *inodedep; +{ + struct freefrag *freefrag; + +#ifdef DEBUG + if (lk.lkt_held == -1) + panic("free_allocindir: lock not held"); +#endif + if ((aip->ai_state & DEPCOMPLETE) == 0) + LIST_REMOVE(aip, ai_deps); + if (aip->ai_state & ONWORKLIST) + WORKLIST_REMOVE(&aip->ai_list); + LIST_REMOVE(aip, ai_next); + if ((freefrag = aip->ai_freefrag) != NULL) { + if (inodedep == NULL) + add_to_worklist(&freefrag->ff_list); + else + WORKLIST_INSERT(&inodedep->id_bufwait, + &freefrag->ff_list); + } + WORKITEM_FREE(aip, D_ALLOCINDIR); +} + +/* + * Directory entry addition dependencies. + * + * When adding a new directory entry, the inode (with its incremented link + * count) must be written to disk before the directory entry's pointer to it. + * Also, if the inode is newly allocated, the corresponding freemap must be + * updated (on disk) before the directory entry's pointer. These requirements + * are met via undo/redo on the directory entry's pointer, which consists + * simply of the inode number. + * + * As directory entries are added and deleted, the free space within a + * directory block can become fragmented. The ufs file system will compact + * a fragmented directory block to make space for a new entry. When this + * occurs, the offsets of previously added entries change. Any "diradd" + * dependency structures corresponding to these entries must be updated with + * the new offsets. + */ + +/* + * This routine is called after the in-memory inode's link + * count has been incremented, but before the directory entry's + * pointer to the inode has been set. + */ +void +softdep_setup_directory_add(bp, dp, diroffset, newinum, newdirbp) + struct buf *bp; /* buffer containing directory block */ + struct inode *dp; /* inode for directory */ + off_t diroffset; /* offset of new entry in directory */ + long newinum; /* inode referenced by new directory entry */ + struct buf *newdirbp; /* non-NULL => contents of new mkdir */ +{ + int offset; /* offset of new entry within directory block */ + ufs_lbn_t lbn; /* block in directory containing new entry */ + struct fs *fs; + struct diradd *dap; + struct pagedep *pagedep; + struct inodedep *inodedep; + struct mkdir *mkdir1, *mkdir2; + + /* + * Whiteouts have no dependencies. + */ + if (newinum == WINO) { + if (newdirbp != NULL) + bdwrite(newdirbp); + return; + } + + fs = dp->i_fs; + lbn = lblkno(fs, diroffset); + offset = blkoff(fs, diroffset); + MALLOC(dap, struct diradd *, sizeof(struct diradd), M_DIRADD, M_WAITOK); + bzero(dap, sizeof(struct diradd)); + dap->da_list.wk_type = D_DIRADD; + dap->da_offset = offset; + dap->da_newinum = newinum; + dap->da_state = ATTACHED; + if (newdirbp == NULL) { + dap->da_state |= DEPCOMPLETE; + ACQUIRE_LOCK(&lk); + } else { + dap->da_state |= MKDIR_BODY | MKDIR_PARENT; + MALLOC(mkdir1, struct mkdir *, sizeof(struct mkdir), M_MKDIR, + M_WAITOK); + mkdir1->md_list.wk_type = D_MKDIR; + mkdir1->md_state = MKDIR_BODY; + mkdir1->md_diradd = dap; + MALLOC(mkdir2, struct mkdir *, sizeof(struct mkdir), M_MKDIR, + M_WAITOK); + mkdir2->md_list.wk_type = D_MKDIR; + mkdir2->md_state = MKDIR_PARENT; + mkdir2->md_diradd = dap; + /* + * Dependency on "." and ".." being written to disk. + */ + mkdir1->md_buf = newdirbp; + ACQUIRE_LOCK(&lk); + LIST_INSERT_HEAD(&mkdirlisthd, mkdir1, md_mkdirs); + WORKLIST_INSERT(&newdirbp->b_dep, &mkdir1->md_list); + FREE_LOCK(&lk); + bdwrite(newdirbp); + /* + * Dependency on link count increase for parent directory + */ + ACQUIRE_LOCK(&lk); + if (inodedep_lookup(dp->i_fs, dp->i_number, 0, &inodedep) == 0 + || (inodedep->id_state & ALLCOMPLETE) == ALLCOMPLETE) { + dap->da_state &= ~MKDIR_PARENT; + WORKITEM_FREE(mkdir2, D_MKDIR); + } else { + LIST_INSERT_HEAD(&mkdirlisthd, mkdir2, md_mkdirs); + WORKLIST_INSERT(&inodedep->id_bufwait,&mkdir2->md_list); + } + } + /* + * Link into parent directory pagedep to await its being written. + */ + if (pagedep_lookup(dp, lbn, DEPALLOC, &pagedep) == 0) + WORKLIST_INSERT(&bp->b_dep, &pagedep->pd_list); + dap->da_pagedep = pagedep; + LIST_INSERT_HEAD(&pagedep->pd_diraddhd[DIRADDHASH(offset)], dap, + da_pdlist); + /* + * Link into its inodedep. Put it on the id_bufwait list if the inode + * is not yet written. If it is written, do the post-inode write + * processing to put it on the id_pendinghd list. + */ + (void) inodedep_lookup(fs, newinum, DEPALLOC, &inodedep); + if ((inodedep->id_state & ALLCOMPLETE) == ALLCOMPLETE) + diradd_inode_written(dap, inodedep); + else + WORKLIST_INSERT(&inodedep->id_bufwait, &dap->da_list); + FREE_LOCK(&lk); +} + +/* + * This procedure is called to change the offset of a directory + * entry when compacting a directory block which must be owned + * exclusively by the caller. Note that the actual entry movement + * must be done in this procedure to ensure that no I/O completions + * occur while the move is in progress. + */ +void +softdep_change_directoryentry_offset(dp, base, oldloc, newloc, entrysize) + struct inode *dp; /* inode for directory */ + caddr_t base; /* address of dp->i_offset */ + caddr_t oldloc; /* address of old directory location */ + caddr_t newloc; /* address of new directory location */ + int entrysize; /* size of directory entry */ +{ + int offset, oldoffset, newoffset; + struct pagedep *pagedep; + struct diradd *dap; + ufs_lbn_t lbn; + + ACQUIRE_LOCK(&lk); + lbn = lblkno(dp->i_fs, dp->i_offset); + offset = blkoff(dp->i_fs, dp->i_offset); + if (pagedep_lookup(dp, lbn, 0, &pagedep) == 0) + goto done; + oldoffset = offset + (oldloc - base); + newoffset = offset + (newloc - base); + for (dap = LIST_FIRST(&pagedep->pd_diraddhd[DIRADDHASH(oldoffset)]); + dap; dap = LIST_NEXT(dap, da_pdlist)) { + if (dap->da_offset != oldoffset) + continue; + dap->da_offset = newoffset; + if (DIRADDHASH(newoffset) == DIRADDHASH(oldoffset)) + break; + LIST_REMOVE(dap, da_pdlist); + LIST_INSERT_HEAD(&pagedep->pd_diraddhd[DIRADDHASH(newoffset)], + dap, da_pdlist); + break; + } + if (dap == NULL) { + for (dap = LIST_FIRST(&pagedep->pd_pendinghd); + dap; dap = LIST_NEXT(dap, da_pdlist)) { + if (dap->da_offset == oldoffset) { + dap->da_offset = newoffset; + break; + } + } + } +done: + bcopy(oldloc, newloc, entrysize); + FREE_LOCK(&lk); +} + +/* + * Free a diradd dependency structure. This routine must be called + * with splbio interrupts blocked. + */ +static void +free_diradd(dap) + struct diradd *dap; +{ + struct dirrem *dirrem; + struct pagedep *pagedep; + struct inodedep *inodedep; + struct mkdir *mkdir, *nextmd; + +#ifdef DEBUG + if (lk.lkt_held == -1) + panic("free_diradd: lock not held"); +#endif + WORKLIST_REMOVE(&dap->da_list); + LIST_REMOVE(dap, da_pdlist); + if ((dap->da_state & DIRCHG) == 0) { + pagedep = dap->da_pagedep; + } else { + dirrem = dap->da_previous; + pagedep = dirrem->dm_pagedep; + dirrem->dm_dirinum = pagedep->pd_ino; + add_to_worklist(&dirrem->dm_list); + } + if (inodedep_lookup(VFSTOUFS(pagedep->pd_mnt)->um_fs, dap->da_newinum, + 0, &inodedep) != 0) + (void) free_inodedep(inodedep); + if ((dap->da_state & (MKDIR_PARENT | MKDIR_BODY)) != 0) { + for (mkdir = LIST_FIRST(&mkdirlisthd); mkdir; mkdir = nextmd) { + nextmd = LIST_NEXT(mkdir, md_mkdirs); + if (mkdir->md_diradd != dap) + continue; + dap->da_state &= ~mkdir->md_state; + WORKLIST_REMOVE(&mkdir->md_list); + LIST_REMOVE(mkdir, md_mkdirs); + WORKITEM_FREE(mkdir, D_MKDIR); + } + if ((dap->da_state & (MKDIR_PARENT | MKDIR_BODY)) != 0) + panic("free_diradd: unfound ref"); + } + WORKITEM_FREE(dap, D_DIRADD); +} + +/* + * Directory entry removal dependencies. + * + * When removing a directory entry, the entry's inode pointer must be + * zero'ed on disk before the corresponding inode's link count is decremented + * (possibly freeing the inode for re-use). This dependency is handled by + * updating the directory entry but delaying the inode count reduction until + * after the directory block has been written to disk. After this point, the + * inode count can be decremented whenever it is convenient. + */ + +/* + * This routine should be called immediately after removing + * a directory entry. The inode's link count should not be + * decremented by the calling procedure -- the soft updates + * code will do this task when it is safe. + */ +void +softdep_setup_remove(bp, dp, ip, isrmdir) + struct buf *bp; /* buffer containing directory block */ + struct inode *dp; /* inode for the directory being modified */ + struct inode *ip; /* inode for directory entry being removed */ + int isrmdir; /* indicates if doing RMDIR */ +{ + struct dirrem *dirrem; + + /* + * Allocate a new dirrem if appropriate and ACQUIRE_LOCK. + */ + dirrem = newdirrem(bp, dp, ip, isrmdir); + if ((dirrem->dm_state & COMPLETE) == 0) { + LIST_INSERT_HEAD(&dirrem->dm_pagedep->pd_dirremhd, dirrem, + dm_next); + } else { + dirrem->dm_dirinum = dirrem->dm_pagedep->pd_ino; + add_to_worklist(&dirrem->dm_list); + } + FREE_LOCK(&lk); +} + +/* + * Allocate a new dirrem if appropriate and return it along with + * its associated pagedep. Called without a lock, returns with lock. + */ +static struct dirrem * +newdirrem(bp, dp, ip, isrmdir) + struct buf *bp; /* buffer containing directory block */ + struct inode *dp; /* inode for the directory being modified */ + struct inode *ip; /* inode for directory entry being removed */ + int isrmdir; /* indicates if doing RMDIR */ +{ + int offset; + ufs_lbn_t lbn; + struct diradd *dap; + struct dirrem *dirrem; + struct pagedep *pagedep; + + /* + * Whiteouts have no deletion dependencies. + */ + if (ip == NULL) + panic("newdirrem: whiteout"); + MALLOC(dirrem, struct dirrem *, sizeof(struct dirrem), + M_DIRREM, M_WAITOK); + bzero(dirrem, sizeof(struct dirrem)); + dirrem->dm_list.wk_type = D_DIRREM; + dirrem->dm_state = isrmdir ? RMDIR : 0; + dirrem->dm_mnt = ITOV(ip)->v_mount; + dirrem->dm_oldinum = ip->i_number; + + ACQUIRE_LOCK(&lk); + lbn = lblkno(dp->i_fs, dp->i_offset); + offset = blkoff(dp->i_fs, dp->i_offset); + if (pagedep_lookup(dp, lbn, DEPALLOC, &pagedep) == 0) + WORKLIST_INSERT(&bp->b_dep, &pagedep->pd_list); + dirrem->dm_pagedep = pagedep; + /* + * Check for a diradd dependency for the same directory entry. + * If present, then both dependencies become obsolete and can + * be de-allocated. Check for an entry on both the pd_dirraddhd + * list and the pd_pendinghd list. + */ + for (dap = LIST_FIRST(&pagedep->pd_diraddhd[DIRADDHASH(offset)]); + dap; dap = LIST_NEXT(dap, da_pdlist)) + if (dap->da_offset == offset) + break; + if (dap == NULL) { + for (dap = LIST_FIRST(&pagedep->pd_pendinghd); + dap; dap = LIST_NEXT(dap, da_pdlist)) + if (dap->da_offset == offset) + break; + if (dap == NULL) + return (dirrem); + } + /* + * Must be ATTACHED at this point, so just delete it. + */ + if ((dap->da_state & ATTACHED) == 0) + panic("newdirrem: not ATTACHED"); + if (dap->da_newinum != ip->i_number) + panic("newdirrem: inum %d should be %d", + ip->i_number, dap->da_newinum); + free_diradd(dap); + dirrem->dm_state |= COMPLETE; + return (dirrem); +} + +/* + * Directory entry change dependencies. + * + * Changing an existing directory entry requires that an add operation + * be completed first followed by a deletion. The semantics for the addition + * are identical to the description of adding a new entry above except + * that the rollback is to the old inode number rather than zero. Once + * the addition dependency is completed, the removal is done as described + * in the removal routine above. + */ + +/* + * This routine should be called immediately after changing + * a directory entry. The inode's link count should not be + * decremented by the calling procedure -- the soft updates + * code will perform this task when it is safe. + */ +void +softdep_setup_directory_change(bp, dp, ip, newinum, isrmdir) + struct buf *bp; /* buffer containing directory block */ + struct inode *dp; /* inode for the directory being modified */ + struct inode *ip; /* inode for directory entry being removed */ + long newinum; /* new inode number for changed entry */ + int isrmdir; /* indicates if doing RMDIR */ +{ + int offset; + struct diradd *dap = NULL; + struct dirrem *dirrem; + struct pagedep *pagedep; + struct inodedep *inodedep; + + offset = blkoff(dp->i_fs, dp->i_offset); + + /* + * Whiteouts do not need diradd dependencies. + */ + if (newinum != WINO) { + MALLOC(dap, struct diradd *, sizeof(struct diradd), + M_DIRADD, M_WAITOK); + bzero(dap, sizeof(struct diradd)); + dap->da_list.wk_type = D_DIRADD; + dap->da_state = DIRCHG | ATTACHED | DEPCOMPLETE; + dap->da_offset = offset; + dap->da_newinum = newinum; + } + + /* + * Allocate a new dirrem and ACQUIRE_LOCK. + */ + dirrem = newdirrem(bp, dp, ip, isrmdir); + pagedep = dirrem->dm_pagedep; + /* + * The possible values for isrmdir: + * 0 - non-directory file rename + * 1 - directory rename within same directory + * inum - directory rename to new directory of given inode number + * When renaming to a new directory, we are both deleting and + * creating a new directory entry, so the link count on the new + * directory should not change. Thus we do not need the followup + * dirrem which is usually done in handle_workitem_remove. We set + * the DIRCHG flag to tell handle_workitem_remove to skip the + * followup dirrem. + */ + if (isrmdir > 1) + dirrem->dm_state |= DIRCHG; + + /* + * Whiteouts have no additional dependencies, + * so just put the dirrem on the correct list. + */ + if (newinum == WINO) { + if ((dirrem->dm_state & COMPLETE) == 0) { + LIST_INSERT_HEAD(&pagedep->pd_dirremhd, dirrem, + dm_next); + } else { + dirrem->dm_dirinum = pagedep->pd_ino; + add_to_worklist(&dirrem->dm_list); + } + FREE_LOCK(&lk); + return; + } + + /* + * Link into its inodedep. Put it on the id_bufwait list if the inode + * is not yet written. If it is written, do the post-inode write + * processing to put it on the id_pendinghd list. + */ + dap->da_previous = dirrem; + if (inodedep_lookup(dp->i_fs, newinum, DEPALLOC, &inodedep) == 0 || + (inodedep->id_state & ALLCOMPLETE) == ALLCOMPLETE) { + dap->da_state |= COMPLETE; + LIST_INSERT_HEAD(&pagedep->pd_pendinghd, dap, da_pdlist); + WORKLIST_INSERT(&inodedep->id_pendinghd, &dap->da_list); + } else { + LIST_INSERT_HEAD(&pagedep->pd_diraddhd[DIRADDHASH(offset)], + dap, da_pdlist); + WORKLIST_INSERT(&inodedep->id_bufwait, &dap->da_list); + } + /* + * If the previous inode was never written or its previous directory + * entry was never written, then we do not want to roll back to this + * previous value. Instead we want to roll back to zero and immediately + * free the unwritten or unreferenced inode. + */ + if (dirrem->dm_state & COMPLETE) { + dap->da_state &= ~DIRCHG; + dap->da_pagedep = pagedep; + dirrem->dm_dirinum = pagedep->pd_ino; + add_to_worklist(&dirrem->dm_list); + } + FREE_LOCK(&lk); +} + +/* + * Called whenever the link count on an inode is increased. + * It creates an inode dependency so that the new reference(s) + * to the inode cannot be committed to disk until the updated + * inode has been written. + */ +void +softdep_increase_linkcnt(ip) + struct inode *ip; /* the inode with the increased link count */ +{ + struct inodedep *inodedep; + + ACQUIRE_LOCK(&lk); + (void) inodedep_lookup(ip->i_fs, ip->i_number, DEPALLOC, &inodedep); + FREE_LOCK(&lk); +} + +/* + * This workitem decrements the inode's link count. + * If the link count reaches zero, the file is removed. + */ +static void +handle_workitem_remove(dirrem) + struct dirrem *dirrem; +{ + struct proc *p = CURPROC; /* XXX */ + struct inodedep *inodedep; + struct vnode *vp; + struct inode *ip; + int error; + + if ((error = VFS_VGET(dirrem->dm_mnt, dirrem->dm_oldinum, &vp)) != 0) { + softdep_error("handle_workitem_remove: vget", error); + return; + } + ip = VTOI(vp); + /* + * Normal file deletion. + */ + if ((dirrem->dm_state & RMDIR) == 0) { + ip->i_nlink--; + if (ip->i_nlink < ip->i_effnlink) + panic("handle_workitem_remove: bad file delta"); + ip->i_flag |= IN_CHANGE; + vput(vp); + WORKITEM_FREE(dirrem, D_DIRREM); + return; + } + /* + * Directory deletion. Decrement reference count for both the + * just deleted parent directory entry and the reference for ".". + * Next truncate the directory to length zero. When the + * truncation completes, arrange to have the reference count on + * the parent decremented to account for the loss of "..". + */ + ip->i_nlink -= 2; + if (ip->i_nlink < ip->i_effnlink) + panic("handle_workitem_remove: bad dir delta"); + ip->i_flag |= IN_CHANGE; + if ((error = UFS_TRUNCATE(vp, (off_t)0, 0, p->p_ucred, p)) != 0) + softdep_error("handle_workitem_remove: truncate", error); + /* + * Rename a directory to a new parent. Since, we are both deleting + * and creating a new directory entry, the link count on the new + * directory should not change. Thus we skip the followup dirrem. + */ + if (dirrem->dm_state & DIRCHG) { + vput(vp); + WORKITEM_FREE(dirrem, D_DIRREM); + return; + } + ACQUIRE_LOCK(&lk); + (void) inodedep_lookup(ip->i_fs, dirrem->dm_oldinum, DEPALLOC, + &inodedep); + dirrem->dm_state = 0; + dirrem->dm_oldinum = dirrem->dm_dirinum; + WORKLIST_INSERT(&inodedep->id_inowait, &dirrem->dm_list); + FREE_LOCK(&lk); + vput(vp); +} + +/* + * Inode de-allocation dependencies. + * + * When an inode's link count is reduced to zero, it can be de-allocated. We + * found it convenient to postpone de-allocation until after the inode is + * written to disk with its new link count (zero). At this point, all of the + * on-disk inode's block pointers are nullified and, with careful dependency + * list ordering, all dependencies related to the inode will be satisfied and + * the corresponding dependency structures de-allocated. So, if/when the + * inode is reused, there will be no mixing of old dependencies with new + * ones. This artificial dependency is set up by the block de-allocation + * procedure above (softdep_setup_freeblocks) and completed by the + * following procedure. + */ +static void +handle_workitem_freefile(freefile) + struct freefile *freefile; +{ + struct vnode vp; + struct inode tip; + struct inodedep *idp; + int error; + +#ifdef DEBUG + ACQUIRE_LOCK(&lk); + if (inodedep_lookup(freefile->fx_fs, freefile->fx_oldinum, 0, &idp)) + panic("handle_workitem_freefile: inodedep survived"); + FREE_LOCK(&lk); +#endif + tip.i_devvp = freefile->fx_devvp; + tip.i_dev = freefile->fx_devvp->v_rdev; + tip.i_fs = freefile->fx_fs; + vp.v_data = &tip; + if ((error = ffs_freefile(&vp, freefile->fx_oldinum, freefile->fx_mode)) != 0) + softdep_error("handle_workitem_freefile", error); + WORKITEM_FREE(freefile, D_FREEFILE); + num_freefile -= 1; +} + +/* + * Disk writes. + * + * The dependency structures constructed above are most actively used when file + * system blocks are written to disk. No constraints are placed on when a + * block can be written, but unsatisfied update dependencies are made safe by + * modifying (or replacing) the source memory for the duration of the disk + * write. When the disk write completes, the memory block is again brought + * up-to-date. + * + * In-core inode structure reclamation. + * + * Because there are a finite number of "in-core" inode structures, they are + * reused regularly. By transferring all inode-related dependencies to the + * in-memory inode block and indexing them separately (via "inodedep"s), we + * can allow "in-core" inode structures to be reused at any time and avoid + * any increase in contention. + * + * Called just before entering the device driver to initiate a new disk I/O. + * The buffer must be locked, thus, no I/O completion operations can occur + * while we are manipulating its associated dependencies. + */ +void +softdep_disk_io_initiation(bp) + struct buf *bp; /* structure describing disk write to occur */ +{ + struct worklist *wk, *nextwk; + struct indirdep *indirdep; + + /* + * We only care about write operations. There should never + * be dependencies for reads. + */ + if (bp->b_flags & B_READ) + panic("softdep_disk_io_initiation: read"); + /* + * Do any necessary pre-I/O processing. + */ + for (wk = LIST_FIRST(&bp->b_dep); wk; wk = nextwk) { + nextwk = LIST_NEXT(wk, wk_list); + switch (wk->wk_type) { + + case D_PAGEDEP: + initiate_write_filepage(WK_PAGEDEP(wk), bp); + continue; + + case D_INODEDEP: + initiate_write_inodeblock(WK_INODEDEP(wk), bp); + continue; + + case D_INDIRDEP: + indirdep = WK_INDIRDEP(wk); + if (indirdep->ir_state & GOINGAWAY) + panic("disk_io_initiation: indirdep gone"); + /* + * If there are no remaining dependencies, this + * will be writing the real pointers, so the + * dependency can be freed. + */ + if (LIST_FIRST(&indirdep->ir_deplisthd) == NULL) { + indirdep->ir_savebp->b_flags |= B_INVAL | B_NOCACHE; + brelse(indirdep->ir_savebp); + /* inline expand WORKLIST_REMOVE(wk); */ + wk->wk_state &= ~ONWORKLIST; + LIST_REMOVE(wk, wk_list); + WORKITEM_FREE(indirdep, D_INDIRDEP); + continue; + } + /* + * Replace up-to-date version with safe version. + */ + ACQUIRE_LOCK(&lk); + indirdep->ir_state &= ~ATTACHED; + indirdep->ir_state |= UNDONE; + MALLOC(indirdep->ir_saveddata, caddr_t, bp->b_bcount, + M_INDIRDEP, M_WAITOK); + bcopy(bp->b_data, indirdep->ir_saveddata, bp->b_bcount); + bcopy(indirdep->ir_savebp->b_data, bp->b_data, + bp->b_bcount); + FREE_LOCK(&lk); + continue; + + case D_MKDIR: + case D_BMSAFEMAP: + case D_ALLOCDIRECT: + case D_ALLOCINDIR: + continue; + + default: + panic("handle_disk_io_initiation: Unexpected type %s", + TYPENAME(wk->wk_type)); + /* NOTREACHED */ + } + } +} + +/* + * Called from within the procedure above to deal with unsatisfied + * allocation dependencies in a directory. The buffer must be locked, + * thus, no I/O completion operations can occur while we are + * manipulating its associated dependencies. + */ +static void +initiate_write_filepage(pagedep, bp) + struct pagedep *pagedep; + struct buf *bp; +{ + struct diradd *dap; + struct direct *ep; + int i; + + if (pagedep->pd_state & IOSTARTED) { + /* + * This can only happen if there is a driver that does not + * understand chaining. Here biodone will reissue the call + * to strategy for the incomplete buffers. + */ + printf("initiate_write_filepage: already started\n"); + return; + } + pagedep->pd_state |= IOSTARTED; + ACQUIRE_LOCK(&lk); + for (i = 0; i < DAHASHSZ; i++) { + for (dap = LIST_FIRST(&pagedep->pd_diraddhd[i]); dap; + dap = LIST_NEXT(dap, da_pdlist)) { + ep = (struct direct *) + ((char *)bp->b_data + dap->da_offset); + if (ep->d_ino != dap->da_newinum) + panic("%s: dir inum %d != new %d", + "initiate_write_filepage", + ep->d_ino, dap->da_newinum); + if (dap->da_state & DIRCHG) + ep->d_ino = dap->da_previous->dm_oldinum; + else + ep->d_ino = 0; + dap->da_state &= ~ATTACHED; + dap->da_state |= UNDONE; + } + } + FREE_LOCK(&lk); +} + +/* + * Called from within the procedure above to deal with unsatisfied + * allocation dependencies in an inodeblock. The buffer must be + * locked, thus, no I/O completion operations can occur while we + * are manipulating its associated dependencies. + */ +static void +initiate_write_inodeblock(inodedep, bp) + struct inodedep *inodedep; + struct buf *bp; /* The inode block */ +{ + struct allocdirect *adp, *lastadp; + struct dinode *dp; + struct fs *fs; + ufs_lbn_t prevlbn = 0; + int i, deplist; + + if (inodedep->id_state & IOSTARTED) + panic("initiate_write_inodeblock: already started"); + inodedep->id_state |= IOSTARTED; + fs = inodedep->id_fs; + dp = (struct dinode *)bp->b_data + + ino_to_fsbo(fs, inodedep->id_ino); + /* + * If the bitmap is not yet written, then the allocated + * inode cannot be written to disk. + */ + if ((inodedep->id_state & DEPCOMPLETE) == 0) { + if (inodedep->id_savedino != NULL) + panic("initiate_write_inodeblock: already doing I/O"); + MALLOC(inodedep->id_savedino, struct dinode *, + sizeof(struct dinode), M_INODEDEP, M_WAITOK); + *inodedep->id_savedino = *dp; + bzero((caddr_t)dp, sizeof(struct dinode)); + return; + } + /* + * If no dependencies, then there is nothing to roll back. + */ + inodedep->id_savedsize = dp->di_size; + if (TAILQ_FIRST(&inodedep->id_inoupdt) == NULL) + return; + /* + * Set the dependencies to busy. + */ + ACQUIRE_LOCK(&lk); + for (deplist = 0, adp = TAILQ_FIRST(&inodedep->id_inoupdt); adp; + adp = TAILQ_NEXT(adp, ad_next)) { +#ifdef DIAGNOSTIC + if (deplist != 0 && prevlbn >= adp->ad_lbn) + panic("softdep_write_inodeblock: lbn order"); + prevlbn = adp->ad_lbn; + if (adp->ad_lbn < NDADDR && + dp->di_db[adp->ad_lbn] != adp->ad_newblkno) + panic("%s: direct pointer #%ld mismatch %d != %d", + "softdep_write_inodeblock", adp->ad_lbn, + dp->di_db[adp->ad_lbn], adp->ad_newblkno); + if (adp->ad_lbn >= NDADDR && + dp->di_ib[adp->ad_lbn - NDADDR] != adp->ad_newblkno) + panic("%s: indirect pointer #%ld mismatch %d != %d", + "softdep_write_inodeblock", adp->ad_lbn - NDADDR, + dp->di_ib[adp->ad_lbn - NDADDR], adp->ad_newblkno); + deplist |= 1 << adp->ad_lbn; + if ((adp->ad_state & ATTACHED) == 0) + panic("softdep_write_inodeblock: Unknown state 0x%x", + adp->ad_state); +#endif /* DIAGNOSTIC */ + adp->ad_state &= ~ATTACHED; + adp->ad_state |= UNDONE; + } + /* + * The on-disk inode cannot claim to be any larger than the last + * fragment that has been written. Otherwise, the on-disk inode + * might have fragments that were not the last block in the file + * which would corrupt the filesystem. + */ + for (lastadp = NULL, adp = TAILQ_FIRST(&inodedep->id_inoupdt); adp; + lastadp = adp, adp = TAILQ_NEXT(adp, ad_next)) { + if (adp->ad_lbn >= NDADDR) + break; + dp->di_db[adp->ad_lbn] = adp->ad_oldblkno; + /* keep going until hitting a rollback to a frag */ + if (adp->ad_oldsize == 0 || adp->ad_oldsize == fs->fs_bsize) + continue; + dp->di_size = fs->fs_bsize * adp->ad_lbn + adp->ad_oldsize; + for (i = adp->ad_lbn + 1; i < NDADDR; i++) { +#ifdef DIAGNOSTIC + if (dp->di_db[i] != 0 && (deplist & (1 << i)) == 0) + panic("softdep_write_inodeblock: lost dep1"); +#endif /* DIAGNOSTIC */ + dp->di_db[i] = 0; + } + for (i = 0; i < NIADDR; i++) { +#ifdef DIAGNOSTIC + if (dp->di_ib[i] != 0 && + (deplist & ((1 << NDADDR) << i)) == 0) + panic("softdep_write_inodeblock: lost dep2"); +#endif /* DIAGNOSTIC */ + dp->di_ib[i] = 0; + } + FREE_LOCK(&lk); + return; + } + /* + * If we have zero'ed out the last allocated block of the file, + * roll back the size to the last currently allocated block. + * We know that this last allocated block is a full-sized as + * we already checked for fragments in the loop above. + */ + if (lastadp != NULL && + dp->di_size <= (lastadp->ad_lbn + 1) * fs->fs_bsize) { + for (i = lastadp->ad_lbn; i >= 0; i--) + if (dp->di_db[i] != 0) + break; + dp->di_size = (i + 1) * fs->fs_bsize; + } + /* + * The only dependencies are for indirect blocks. + * + * The file size for indirect block additions is not guaranteed. + * Such a guarantee would be non-trivial to achieve. The conventional + * synchronous write implementation also does not make this guarantee. + * Fsck should catch and fix discrepancies. Arguably, the file size + * can be over-estimated without destroying integrity when the file + * moves into the indirect blocks (i.e., is large). If we want to + * postpone fsck, we are stuck with this argument. + */ + for (; adp; adp = TAILQ_NEXT(adp, ad_next)) + dp->di_ib[adp->ad_lbn - NDADDR] = 0; + FREE_LOCK(&lk); +} + +/* + * This routine is called during the completion interrupt + * service routine for a disk write (from the procedure called + * by the device driver to inform the file system caches of + * a request completion). It should be called early in this + * procedure, before the block is made available to other + * processes or other routines are called. + */ +void +softdep_disk_write_complete(bp) + struct buf *bp; /* describes the completed disk write */ +{ + struct worklist *wk; + struct workhead reattach; + struct newblk *newblk; + struct allocindir *aip; + struct allocdirect *adp; + struct indirdep *indirdep; + struct inodedep *inodedep; + struct bmsafemap *bmsafemap; + +#ifdef DEBUG + if (lk.lkt_held != -1) + panic("softdep_disk_write_complete: lock is held"); + lk.lkt_held = -2; +#endif + LIST_INIT(&reattach); + while ((wk = LIST_FIRST(&bp->b_dep)) != NULL) { + WORKLIST_REMOVE(wk); + switch (wk->wk_type) { + + case D_PAGEDEP: + if (handle_written_filepage(WK_PAGEDEP(wk), bp)) + WORKLIST_INSERT(&reattach, wk); + continue; + + case D_INODEDEP: + if (handle_written_inodeblock(WK_INODEDEP(wk), bp)) + WORKLIST_INSERT(&reattach, wk); + continue; + + case D_BMSAFEMAP: + bmsafemap = WK_BMSAFEMAP(wk); + while ((newblk = LIST_FIRST(&bmsafemap->sm_newblkhd))) { + newblk->nb_state |= DEPCOMPLETE; + newblk->nb_bmsafemap = NULL; + LIST_REMOVE(newblk, nb_deps); + } + while ((adp = + LIST_FIRST(&bmsafemap->sm_allocdirecthd))) { + adp->ad_state |= DEPCOMPLETE; + adp->ad_buf = NULL; + LIST_REMOVE(adp, ad_deps); + handle_allocdirect_partdone(adp); + } + while ((aip = + LIST_FIRST(&bmsafemap->sm_allocindirhd))) { + aip->ai_state |= DEPCOMPLETE; + aip->ai_buf = NULL; + LIST_REMOVE(aip, ai_deps); + handle_allocindir_partdone(aip); + } + while ((inodedep = + LIST_FIRST(&bmsafemap->sm_inodedephd)) != NULL) { + inodedep->id_state |= DEPCOMPLETE; + LIST_REMOVE(inodedep, id_deps); + inodedep->id_buf = NULL; + } + WORKITEM_FREE(bmsafemap, D_BMSAFEMAP); + continue; + + case D_MKDIR: + handle_written_mkdir(WK_MKDIR(wk), MKDIR_BODY); + continue; + + case D_ALLOCDIRECT: + adp = WK_ALLOCDIRECT(wk); + adp->ad_state |= COMPLETE; + handle_allocdirect_partdone(adp); + continue; + + case D_ALLOCINDIR: + aip = WK_ALLOCINDIR(wk); + aip->ai_state |= COMPLETE; + handle_allocindir_partdone(aip); + continue; + + case D_INDIRDEP: + indirdep = WK_INDIRDEP(wk); + if (indirdep->ir_state & GOINGAWAY) + panic("disk_write_complete: indirdep gone"); + bcopy(indirdep->ir_saveddata, bp->b_data, bp->b_bcount); + FREE(indirdep->ir_saveddata, M_INDIRDEP); + indirdep->ir_saveddata = 0; + indirdep->ir_state &= ~UNDONE; + indirdep->ir_state |= ATTACHED; + while ((aip = LIST_FIRST(&indirdep->ir_donehd)) != 0) { + handle_allocindir_partdone(aip); + if (aip == LIST_FIRST(&indirdep->ir_donehd)) + panic("disk_write_complete: not gone"); + } + WORKLIST_INSERT(&reattach, wk); + if ((bp->b_flags & B_DELWRI) == 0) + stat_indir_blk_ptrs++; + bdirty(bp); + continue; + + default: + panic("handle_disk_write_complete: Unknown type %s", + TYPENAME(wk->wk_type)); + /* NOTREACHED */ + } + } + /* + * Reattach any requests that must be redone. + */ + while ((wk = LIST_FIRST(&reattach)) != NULL) { + WORKLIST_REMOVE(wk); + WORKLIST_INSERT(&bp->b_dep, wk); + } +#ifdef DEBUG + if (lk.lkt_held != -2) + panic("softdep_disk_write_complete: lock lost"); + lk.lkt_held = -1; +#endif +} + +/* + * Called from within softdep_disk_write_complete above. Note that + * this routine is always called from interrupt level with further + * splbio interrupts blocked. + */ +static void +handle_allocdirect_partdone(adp) + struct allocdirect *adp; /* the completed allocdirect */ +{ + struct allocdirect *listadp; + struct inodedep *inodedep; + long bsize; + + if ((adp->ad_state & ALLCOMPLETE) != ALLCOMPLETE) + return; + if (adp->ad_buf != NULL) + panic("handle_allocdirect_partdone: dangling dep"); + /* + * The on-disk inode cannot claim to be any larger than the last + * fragment that has been written. Otherwise, the on-disk inode + * might have fragments that were not the last block in the file + * which would corrupt the filesystem. Thus, we cannot free any + * allocdirects after one whose ad_oldblkno claims a fragment as + * these blocks must be rolled back to zero before writing the inode. + * We check the currently active set of allocdirects in id_inoupdt. + */ + inodedep = adp->ad_inodedep; + bsize = inodedep->id_fs->fs_bsize; + for (listadp = TAILQ_FIRST(&inodedep->id_inoupdt); listadp; + listadp = TAILQ_NEXT(listadp, ad_next)) { + /* found our block */ + if (listadp == adp) + break; + /* continue if ad_oldlbn is not a fragment */ + if (listadp->ad_oldsize == 0 || + listadp->ad_oldsize == bsize) + continue; + /* hit a fragment */ + return; + } + /* + * If we have reached the end of the current list without + * finding the just finished dependency, then it must be + * on the future dependency list. Future dependencies cannot + * be freed until they are moved to the current list. + */ + if (listadp == NULL) { +#ifdef DEBUG + for (listadp = TAILQ_FIRST(&inodedep->id_newinoupdt); listadp; + listadp = TAILQ_NEXT(listadp, ad_next)) + /* found our block */ + if (listadp == adp) + break; + if (listadp == NULL) + panic("handle_allocdirect_partdone: lost dep"); +#endif /* DEBUG */ + return; + } + /* + * If we have found the just finished dependency, then free + * it along with anything that follows it that is complete. + */ + for (; adp; adp = listadp) { + listadp = TAILQ_NEXT(adp, ad_next); + if ((adp->ad_state & ALLCOMPLETE) != ALLCOMPLETE) + return; + free_allocdirect(&inodedep->id_inoupdt, adp, 1); + } +} + +/* + * Called from within softdep_disk_write_complete above. Note that + * this routine is always called from interrupt level with further + * splbio interrupts blocked. + */ +static void +handle_allocindir_partdone(aip) + struct allocindir *aip; /* the completed allocindir */ +{ + struct indirdep *indirdep; + + if ((aip->ai_state & ALLCOMPLETE) != ALLCOMPLETE) + return; + if (aip->ai_buf != NULL) + panic("handle_allocindir_partdone: dangling dependency"); + indirdep = aip->ai_indirdep; + if (indirdep->ir_state & UNDONE) { + LIST_REMOVE(aip, ai_next); + LIST_INSERT_HEAD(&indirdep->ir_donehd, aip, ai_next); + return; + } + ((ufs_daddr_t *)indirdep->ir_savebp->b_data)[aip->ai_offset] = + aip->ai_newblkno; + LIST_REMOVE(aip, ai_next); + if (aip->ai_freefrag != NULL) + add_to_worklist(&aip->ai_freefrag->ff_list); + WORKITEM_FREE(aip, D_ALLOCINDIR); +} + +/* + * Called from within softdep_disk_write_complete above to restore + * in-memory inode block contents to their most up-to-date state. Note + * that this routine is always called from interrupt level with further + * splbio interrupts blocked. + */ +static int +handle_written_inodeblock(inodedep, bp) + struct inodedep *inodedep; + struct buf *bp; /* buffer containing the inode block */ +{ + struct worklist *wk, *filefree; + struct allocdirect *adp, *nextadp; + struct dinode *dp; + int hadchanges; + + if ((inodedep->id_state & IOSTARTED) == 0) + panic("handle_written_inodeblock: not started"); + inodedep->id_state &= ~IOSTARTED; + inodedep->id_state |= COMPLETE; + dp = (struct dinode *)bp->b_data + + ino_to_fsbo(inodedep->id_fs, inodedep->id_ino); + /* + * If we had to rollback the inode allocation because of + * bitmaps being incomplete, then simply restore it. + * Keep the block dirty so that it will not be reclaimed until + * all associated dependencies have been cleared and the + * corresponding updates written to disk. + */ + if (inodedep->id_savedino != NULL) { + *dp = *inodedep->id_savedino; + FREE(inodedep->id_savedino, M_INODEDEP); + inodedep->id_savedino = NULL; + if ((bp->b_flags & B_DELWRI) == 0) + stat_inode_bitmap++; + bdirty(bp); + return (1); + } + /* + * Roll forward anything that had to be rolled back before + * the inode could be updated. + */ + hadchanges = 0; + for (adp = TAILQ_FIRST(&inodedep->id_inoupdt); adp; adp = nextadp) { + nextadp = TAILQ_NEXT(adp, ad_next); + if (adp->ad_state & ATTACHED) + panic("handle_written_inodeblock: new entry"); + if (adp->ad_lbn < NDADDR) { + if (dp->di_db[adp->ad_lbn] != adp->ad_oldblkno) + panic("%s: %s #%ld mismatch %d != %d", + "handle_written_inodeblock", + "direct pointer", adp->ad_lbn, + dp->di_db[adp->ad_lbn], adp->ad_oldblkno); + dp->di_db[adp->ad_lbn] = adp->ad_newblkno; + } else { + if (dp->di_ib[adp->ad_lbn - NDADDR] != 0) + panic("%s: %s #%ld allocated as %d", + "handle_written_inodeblock", + "indirect pointer", adp->ad_lbn - NDADDR, + dp->di_ib[adp->ad_lbn - NDADDR]); + dp->di_ib[adp->ad_lbn - NDADDR] = adp->ad_newblkno; + } + adp->ad_state &= ~UNDONE; + adp->ad_state |= ATTACHED; + hadchanges = 1; + } + if (hadchanges && (bp->b_flags & B_DELWRI) == 0) + stat_direct_blk_ptrs++; + /* + * Reset the file size to its most up-to-date value. + */ + if (inodedep->id_savedsize == -1) + panic("handle_written_inodeblock: bad size"); + if (dp->di_size != inodedep->id_savedsize) { + dp->di_size = inodedep->id_savedsize; + hadchanges = 1; + } + inodedep->id_savedsize = -1; + /* + * If there were any rollbacks in the inode block, then it must be + * marked dirty so that its will eventually get written back in + * its correct form. + */ + if (hadchanges) + bdirty(bp); + /* + * Process any allocdirects that completed during the update. + */ + if ((adp = TAILQ_FIRST(&inodedep->id_inoupdt)) != NULL) + handle_allocdirect_partdone(adp); + /* + * Process deallocations that were held pending until the + * inode had been written to disk. Freeing of the inode + * is delayed until after all blocks have been freed to + * avoid creation of new <vfsid, inum, lbn> triples + * before the old ones have been deleted. + */ + filefree = NULL; + while ((wk = LIST_FIRST(&inodedep->id_bufwait)) != NULL) { + WORKLIST_REMOVE(wk); + switch (wk->wk_type) { + + case D_FREEFILE: + /* + * We defer adding filefree to the worklist until + * all other additions have been made to ensure + * that it will be done after all the old blocks + * have been freed. + */ + if (filefree != NULL) + panic("handle_written_inodeblock: filefree"); + filefree = wk; + continue; + + case D_MKDIR: + handle_written_mkdir(WK_MKDIR(wk), MKDIR_PARENT); + continue; + + case D_DIRADD: + diradd_inode_written(WK_DIRADD(wk), inodedep); + continue; + + case D_FREEBLKS: + case D_FREEFRAG: + case D_DIRREM: + add_to_worklist(wk); + continue; + + default: + panic("handle_written_inodeblock: Unknown type %s", + TYPENAME(wk->wk_type)); + /* NOTREACHED */ + } + } + if (filefree != NULL) { + if (free_inodedep(inodedep) == 0) + panic("handle_written_inodeblock: live inodedep"); + add_to_worklist(filefree); + return (0); + } + + /* + * If no outstanding dependencies, free it. + */ + if (free_inodedep(inodedep) || TAILQ_FIRST(&inodedep->id_inoupdt) == 0) + return (0); + return (hadchanges); +} + +/* + * Process a diradd entry after its dependent inode has been written. + * This routine must be called with splbio interrupts blocked. + */ +static void +diradd_inode_written(dap, inodedep) + struct diradd *dap; + struct inodedep *inodedep; +{ + struct pagedep *pagedep; + + dap->da_state |= COMPLETE; + if ((dap->da_state & ALLCOMPLETE) == ALLCOMPLETE) { + if (dap->da_state & DIRCHG) + pagedep = dap->da_previous->dm_pagedep; + else + pagedep = dap->da_pagedep; + LIST_REMOVE(dap, da_pdlist); + LIST_INSERT_HEAD(&pagedep->pd_pendinghd, dap, da_pdlist); + } + WORKLIST_INSERT(&inodedep->id_pendinghd, &dap->da_list); +} + +/* + * Handle the completion of a mkdir dependency. + */ +static void +handle_written_mkdir(mkdir, type) + struct mkdir *mkdir; + int type; +{ + struct diradd *dap; + struct pagedep *pagedep; + + if (mkdir->md_state != type) + panic("handle_written_mkdir: bad type"); + dap = mkdir->md_diradd; + dap->da_state &= ~type; + if ((dap->da_state & (MKDIR_PARENT | MKDIR_BODY)) == 0) + dap->da_state |= DEPCOMPLETE; + if ((dap->da_state & ALLCOMPLETE) == ALLCOMPLETE) { + if (dap->da_state & DIRCHG) + pagedep = dap->da_previous->dm_pagedep; + else + pagedep = dap->da_pagedep; + LIST_REMOVE(dap, da_pdlist); + LIST_INSERT_HEAD(&pagedep->pd_pendinghd, dap, da_pdlist); + } + LIST_REMOVE(mkdir, md_mkdirs); + WORKITEM_FREE(mkdir, D_MKDIR); +} + +/* + * Called from within softdep_disk_write_complete above. + * A write operation was just completed. Removed inodes can + * now be freed and associated block pointers may be committed. + * Note that this routine is always called from interrupt level + * with further splbio interrupts blocked. + */ +static int +handle_written_filepage(pagedep, bp) + struct pagedep *pagedep; + struct buf *bp; /* buffer containing the written page */ +{ + struct dirrem *dirrem; + struct diradd *dap, *nextdap; + struct direct *ep; + int i, chgs; + + if ((pagedep->pd_state & IOSTARTED) == 0) + panic("handle_written_filepage: not started"); + pagedep->pd_state &= ~IOSTARTED; + /* + * Process any directory removals that have been committed. + */ + while ((dirrem = LIST_FIRST(&pagedep->pd_dirremhd)) != NULL) { + LIST_REMOVE(dirrem, dm_next); + dirrem->dm_dirinum = pagedep->pd_ino; + add_to_worklist(&dirrem->dm_list); + } + /* + * Free any directory additions that have been committed. + */ + while ((dap = LIST_FIRST(&pagedep->pd_pendinghd)) != NULL) + free_diradd(dap); + /* + * Uncommitted directory entries must be restored. + */ + for (chgs = 0, i = 0; i < DAHASHSZ; i++) { + for (dap = LIST_FIRST(&pagedep->pd_diraddhd[i]); dap; + dap = nextdap) { + nextdap = LIST_NEXT(dap, da_pdlist); + if (dap->da_state & ATTACHED) + panic("handle_written_filepage: attached"); + ep = (struct direct *) + ((char *)bp->b_data + dap->da_offset); + ep->d_ino = dap->da_newinum; + dap->da_state &= ~UNDONE; + dap->da_state |= ATTACHED; + chgs = 1; + /* + * If the inode referenced by the directory has + * been written out, then the dependency can be + * moved to the pending list. + */ + if ((dap->da_state & ALLCOMPLETE) == ALLCOMPLETE) { + LIST_REMOVE(dap, da_pdlist); + LIST_INSERT_HEAD(&pagedep->pd_pendinghd, dap, + da_pdlist); + } + } + } + /* + * If there were any rollbacks in the directory, then it must be + * marked dirty so that its will eventually get written back in + * its correct form. + */ + if (chgs) { + if ((bp->b_flags & B_DELWRI) == 0) + stat_dir_entry++; + bdirty(bp); + } + /* + * If no dependencies remain, the pagedep will be freed. + * Otherwise it will remain to update the page before it + * is written back to disk. + */ + if (LIST_FIRST(&pagedep->pd_pendinghd) == 0) { + for (i = 0; i < DAHASHSZ; i++) + if (LIST_FIRST(&pagedep->pd_diraddhd[i]) != NULL) + break; + if (i == DAHASHSZ) { + LIST_REMOVE(pagedep, pd_hash); + WORKITEM_FREE(pagedep, D_PAGEDEP); + return (0); + } + } + return (1); +} + +/* + * Writing back in-core inode structures. + * + * The file system only accesses an inode's contents when it occupies an + * "in-core" inode structure. These "in-core" structures are separate from + * the page frames used to cache inode blocks. Only the latter are + * transferred to/from the disk. So, when the updated contents of the + * "in-core" inode structure are copied to the corresponding in-memory inode + * block, the dependencies are also transferred. The following procedure is + * called when copying a dirty "in-core" inode to a cached inode block. + */ + +/* + * Called when an inode is loaded from disk. If the effective link count + * differed from the actual link count when it was last flushed, then we + * need to ensure that the correct effective link count is put back. + */ +void +softdep_load_inodeblock(ip) + struct inode *ip; /* the "in_core" copy of the inode */ +{ + struct inodedep *inodedep; + + /* + * Check for alternate nlink count. + */ + ip->i_effnlink = ip->i_nlink; + ACQUIRE_LOCK(&lk); + if (inodedep_lookup(ip->i_fs, ip->i_number, 0, &inodedep) == 0) { + FREE_LOCK(&lk); + return; + } + if (inodedep->id_nlinkdelta != 0) { + ip->i_effnlink -= inodedep->id_nlinkdelta; + ip->i_flag |= IN_MODIFIED; + inodedep->id_nlinkdelta = 0; + (void) free_inodedep(inodedep); + } + FREE_LOCK(&lk); +} + +/* + * This routine is called just before the "in-core" inode + * information is to be copied to the in-memory inode block. + * Recall that an inode block contains several inodes. If + * the force flag is set, then the dependencies will be + * cleared so that the update can always be made. Note that + * the buffer is locked when this routine is called, so we + * will never be in the middle of writing the inode block + * to disk. + */ +void +softdep_update_inodeblock(ip, bp, waitfor) + struct inode *ip; /* the "in_core" copy of the inode */ + struct buf *bp; /* the buffer containing the inode block */ + int waitfor; /* nonzero => update must be allowed */ +{ + struct inodedep *inodedep; + struct worklist *wk; + int error, gotit; + + /* + * If the effective link count is not equal to the actual link + * count, then we must track the difference in an inodedep while + * the inode is (potentially) tossed out of the cache. Otherwise, + * if there is no existing inodedep, then there are no dependencies + * to track. + */ + ACQUIRE_LOCK(&lk); + if (ip->i_effnlink != ip->i_nlink) { + (void) inodedep_lookup(ip->i_fs, ip->i_number, DEPALLOC, + &inodedep); + } else if (inodedep_lookup(ip->i_fs, ip->i_number, 0, &inodedep) == 0) { + FREE_LOCK(&lk); + return; + } + if (ip->i_nlink < ip->i_effnlink) + panic("softdep_update_inodeblock: bad delta"); + inodedep->id_nlinkdelta = ip->i_nlink - ip->i_effnlink; + /* + * Changes have been initiated. Anything depending on these + * changes cannot occur until this inode has been written. + */ + inodedep->id_state &= ~COMPLETE; + if ((inodedep->id_state & ONWORKLIST) == 0) + WORKLIST_INSERT(&bp->b_dep, &inodedep->id_list); + /* + * Any new dependencies associated with the incore inode must + * now be moved to the list associated with the buffer holding + * the in-memory copy of the inode. Once merged process any + * allocdirects that are completed by the merger. + */ + merge_inode_lists(inodedep); + if (TAILQ_FIRST(&inodedep->id_inoupdt) != NULL) + handle_allocdirect_partdone(TAILQ_FIRST(&inodedep->id_inoupdt)); + /* + * Now that the inode has been pushed into the buffer, the + * operations dependent on the inode being written to disk + * can be moved to the id_bufwait so that they will be + * processed when the buffer I/O completes. + */ + while ((wk = LIST_FIRST(&inodedep->id_inowait)) != NULL) { + WORKLIST_REMOVE(wk); + WORKLIST_INSERT(&inodedep->id_bufwait, wk); + } + /* + * Newly allocated inodes cannot be written until the bitmap + * that allocates them have been written (indicated by + * DEPCOMPLETE being set in id_state). If we are doing a + * forced sync (e.g., an fsync on a file), we force the bitmap + * to be written so that the update can be done. + */ + if ((inodedep->id_state & DEPCOMPLETE) != 0 || waitfor == 0) { + FREE_LOCK(&lk); + return; + } + gotit = getdirtybuf(&inodedep->id_buf, MNT_WAIT); + FREE_LOCK(&lk); + if (gotit && + (error = VOP_BWRITE(inodedep->id_buf->b_vp, inodedep->id_buf)) != 0) + softdep_error("softdep_update_inodeblock: bwrite", error); + if ((inodedep->id_state & DEPCOMPLETE) == 0) + panic("softdep_update_inodeblock: update failed"); +} + +/* + * Merge the new inode dependency list (id_newinoupdt) into the old + * inode dependency list (id_inoupdt). This routine must be called + * with splbio interrupts blocked. + */ +static void +merge_inode_lists(inodedep) + struct inodedep *inodedep; +{ + struct allocdirect *listadp, *newadp; + + newadp = TAILQ_FIRST(&inodedep->id_newinoupdt); + for (listadp = TAILQ_FIRST(&inodedep->id_inoupdt); listadp && newadp;) { + if (listadp->ad_lbn < newadp->ad_lbn) { + listadp = TAILQ_NEXT(listadp, ad_next); + continue; + } + TAILQ_REMOVE(&inodedep->id_newinoupdt, newadp, ad_next); + TAILQ_INSERT_BEFORE(listadp, newadp, ad_next); + if (listadp->ad_lbn == newadp->ad_lbn) { + allocdirect_merge(&inodedep->id_inoupdt, newadp, + listadp); + listadp = newadp; + } + newadp = TAILQ_FIRST(&inodedep->id_newinoupdt); + } + while ((newadp = TAILQ_FIRST(&inodedep->id_newinoupdt)) != NULL) { + TAILQ_REMOVE(&inodedep->id_newinoupdt, newadp, ad_next); + TAILQ_INSERT_TAIL(&inodedep->id_inoupdt, newadp, ad_next); + } +} + +/* + * If we are doing an fsync, then we must ensure that any directory + * entries for the inode have been written after the inode gets to disk. + */ +int +softdep_fsync(vp) + struct vnode *vp; /* the "in_core" copy of the inode */ +{ + struct diradd *dap, *olddap; + struct inodedep *inodedep; + struct pagedep *pagedep; + struct worklist *wk; + struct mount *mnt; + struct vnode *pvp; + struct inode *ip; + struct buf *bp; + struct fs *fs; + struct proc *p = CURPROC; /* XXX */ + int error, ret, flushparent; + ino_t parentino; + ufs_lbn_t lbn; + + ip = VTOI(vp); + fs = ip->i_fs; + for (error = 0, flushparent = 0, olddap = NULL; ; ) { + ACQUIRE_LOCK(&lk); + if (inodedep_lookup(fs, ip->i_number, 0, &inodedep) == 0) + break; + if (LIST_FIRST(&inodedep->id_inowait) != NULL || + LIST_FIRST(&inodedep->id_bufwait) != NULL || + TAILQ_FIRST(&inodedep->id_inoupdt) != NULL || + TAILQ_FIRST(&inodedep->id_newinoupdt) != NULL) + panic("softdep_fsync: pending ops"); + if ((wk = LIST_FIRST(&inodedep->id_pendinghd)) == NULL) + break; + if (wk->wk_type != D_DIRADD) + panic("softdep_fsync: Unexpected type %s", + TYPENAME(wk->wk_type)); + dap = WK_DIRADD(wk); + /* + * If we have failed to get rid of all the dependencies + * then something is seriously wrong. + */ + if (dap == olddap) + panic("softdep_fsync: flush failed"); + olddap = dap; + /* + * Flush our parent if this directory entry + * has a MKDIR_PARENT dependency. + */ + if (dap->da_state & DIRCHG) + pagedep = dap->da_previous->dm_pagedep; + else + pagedep = dap->da_pagedep; + mnt = pagedep->pd_mnt; + parentino = pagedep->pd_ino; + lbn = pagedep->pd_lbn; + if ((dap->da_state & (MKDIR_BODY | COMPLETE)) != COMPLETE) + panic("softdep_fsync: dirty"); + flushparent = dap->da_state & MKDIR_PARENT; + /* + * If we are being fsync'ed as part of vgone'ing this vnode, + * then we will not be able to release and recover the + * vnode below, so we just have to give up on writing its + * directory entry out. It will eventually be written, just + * not now, but then the user was not asking to have it + * written, so we are not breaking any promises. + */ + if (vp->v_flag & VXLOCK) + break; + /* + * We prevent deadlock by always fetching inodes from the + * root, moving down the directory tree. Thus, when fetching + * our parent directory, we must unlock ourselves before + * requesting the lock on our parent. See the comment in + * ufs_lookup for details on possible races. + */ + FREE_LOCK(&lk); + VOP_UNLOCK(vp, 0, p); + if ((error = VFS_VGET(mnt, parentino, &pvp)) != 0) { + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); + return (error); + } + vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); + if (flushparent) { + if ((error = UFS_UPDATE(pvp, 1)) != 0) { + vput(pvp); + return (error); + } + } + /* + * Flush directory page containing the inode's name. + */ + error = bread(pvp, lbn, blksize(fs, VTOI(pvp), lbn), p->p_ucred, + &bp); + ret = VOP_BWRITE(bp->b_vp, bp); + vput(pvp); + if (error != 0) + return (error); + if (ret != 0) + return (ret); + } + FREE_LOCK(&lk); + return (0); +} + +/* + * Flush all the dirty bitmaps associated with the block device + * before flushing the rest of the dirty blocks so as to reduce + * the number of dependencies that will have to be rolled back. + */ +void +softdep_fsync_mountdev(vp) + struct vnode *vp; +{ + struct buf *bp, *nbp; + struct worklist *wk; + + if (!vn_isdisk(vp)) + panic("softdep_fsync_mountdev: vnode not a disk"); + ACQUIRE_LOCK(&lk); + for (bp = TAILQ_FIRST(&vp->v_dirtyblkhd); bp; bp = nbp) { + nbp = TAILQ_NEXT(bp, b_vnbufs); + /* + * If it is already scheduled, skip to the next buffer. + */ + if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT)) + continue; + if ((bp->b_flags & B_DELWRI) == 0) + panic("softdep_fsync_mountdev: not dirty"); + /* + * We are only interested in bitmaps with outstanding + * dependencies. + */ + if ((wk = LIST_FIRST(&bp->b_dep)) == NULL || + wk->wk_type != D_BMSAFEMAP) { + BUF_UNLOCK(bp); + continue; + } + bremfree(bp); + FREE_LOCK(&lk); + (void) bawrite(bp); + ACQUIRE_LOCK(&lk); + /* + * Since we may have slept during the I/O, we need + * to start from a known point. + */ + nbp = TAILQ_FIRST(&vp->v_dirtyblkhd); + } + drain_output(vp, 1); + FREE_LOCK(&lk); +} + +/* + * This routine is called when we are trying to synchronously flush a + * file. This routine must eliminate any filesystem metadata dependencies + * so that the syncing routine can succeed by pushing the dirty blocks + * associated with the file. If any I/O errors occur, they are returned. + */ +int +softdep_sync_metadata(ap) + struct vop_fsync_args /* { + struct vnode *a_vp; + struct ucred *a_cred; + int a_waitfor; + struct proc *a_p; + } */ *ap; +{ + struct vnode *vp = ap->a_vp; + struct pagedep *pagedep; + struct allocdirect *adp; + struct allocindir *aip; + struct buf *bp, *nbp; + struct worklist *wk; + int i, error, waitfor; + + /* + * Check whether this vnode is involved in a filesystem + * that is doing soft dependency processing. + */ + if (!vn_isdisk(vp)) { + if (!DOINGSOFTDEP(vp)) + return (0); + } else + if (vp->v_specmountpoint == NULL || + (vp->v_specmountpoint->mnt_flag & MNT_SOFTDEP) == 0) + return (0); + /* + * Ensure that any direct block dependencies have been cleared. + */ + ACQUIRE_LOCK(&lk); + if ((error = flush_inodedep_deps(VTOI(vp)->i_fs, VTOI(vp)->i_number))) { + FREE_LOCK(&lk); + return (error); + } + /* + * For most files, the only metadata dependencies are the + * cylinder group maps that allocate their inode or blocks. + * The block allocation dependencies can be found by traversing + * the dependency lists for any buffers that remain on their + * dirty buffer list. The inode allocation dependency will + * be resolved when the inode is updated with MNT_WAIT. + * This work is done in two passes. The first pass grabs most + * of the buffers and begins asynchronously writing them. The + * only way to wait for these asynchronous writes is to sleep + * on the filesystem vnode which may stay busy for a long time + * if the filesystem is active. So, instead, we make a second + * pass over the dependencies blocking on each write. In the + * usual case we will be blocking against a write that we + * initiated, so when it is done the dependency will have been + * resolved. Thus the second pass is expected to end quickly. + */ + waitfor = MNT_NOWAIT; +top: + if (getdirtybuf(&TAILQ_FIRST(&vp->v_dirtyblkhd), MNT_WAIT) == 0) { + FREE_LOCK(&lk); + return (0); + } + bp = TAILQ_FIRST(&vp->v_dirtyblkhd); +loop: + /* + * As we hold the buffer locked, none of its dependencies + * will disappear. + */ + for (wk = LIST_FIRST(&bp->b_dep); wk; + wk = LIST_NEXT(wk, wk_list)) { + switch (wk->wk_type) { + + case D_ALLOCDIRECT: + adp = WK_ALLOCDIRECT(wk); + if (adp->ad_state & DEPCOMPLETE) + break; + nbp = adp->ad_buf; + if (getdirtybuf(&nbp, waitfor) == 0) + break; + FREE_LOCK(&lk); + if (waitfor == MNT_NOWAIT) { + bawrite(nbp); + } else if ((error = VOP_BWRITE(nbp->b_vp, nbp)) != 0) { + bawrite(bp); + return (error); + } + ACQUIRE_LOCK(&lk); + break; + + case D_ALLOCINDIR: + aip = WK_ALLOCINDIR(wk); + if (aip->ai_state & DEPCOMPLETE) + break; + nbp = aip->ai_buf; + if (getdirtybuf(&nbp, waitfor) == 0) + break; + FREE_LOCK(&lk); + if (waitfor == MNT_NOWAIT) { + bawrite(nbp); + } else if ((error = VOP_BWRITE(nbp->b_vp, nbp)) != 0) { + bawrite(bp); + return (error); + } + ACQUIRE_LOCK(&lk); + break; + + case D_INDIRDEP: + restart: + for (aip = LIST_FIRST(&WK_INDIRDEP(wk)->ir_deplisthd); + aip; aip = LIST_NEXT(aip, ai_next)) { + if (aip->ai_state & DEPCOMPLETE) + continue; + nbp = aip->ai_buf; + if (getdirtybuf(&nbp, MNT_WAIT) == 0) + goto restart; + FREE_LOCK(&lk); + if ((error = VOP_BWRITE(nbp->b_vp, nbp)) != 0) { + bawrite(bp); + return (error); + } + ACQUIRE_LOCK(&lk); + goto restart; + } + break; + + case D_INODEDEP: + if ((error = flush_inodedep_deps(WK_INODEDEP(wk)->id_fs, + WK_INODEDEP(wk)->id_ino)) != 0) { + FREE_LOCK(&lk); + bawrite(bp); + return (error); + } + break; + + case D_PAGEDEP: + /* + * We are trying to sync a directory that may + * have dependencies on both its own metadata + * and/or dependencies on the inodes of any + * recently allocated files. We walk its diradd + * lists pushing out the associated inode. + */ + pagedep = WK_PAGEDEP(wk); + for (i = 0; i < DAHASHSZ; i++) { + if (LIST_FIRST(&pagedep->pd_diraddhd[i]) == 0) + continue; + if ((error = + flush_pagedep_deps(vp, pagedep->pd_mnt, + &pagedep->pd_diraddhd[i]))) { + FREE_LOCK(&lk); + bawrite(bp); + return (error); + } + } + break; + + case D_MKDIR: + /* + * This case should never happen if the vnode has + * been properly sync'ed. However, if this function + * is used at a place where the vnode has not yet + * been sync'ed, this dependency can show up. So, + * rather than panic, just flush it. + */ + nbp = WK_MKDIR(wk)->md_buf; + if (getdirtybuf(&nbp, waitfor) == 0) + break; + FREE_LOCK(&lk); + if (waitfor == MNT_NOWAIT) { + bawrite(nbp); + } else if ((error = VOP_BWRITE(nbp->b_vp, nbp)) != 0) { + bawrite(bp); + return (error); + } + ACQUIRE_LOCK(&lk); + break; + + case D_BMSAFEMAP: + /* + * This case should never happen if the vnode has + * been properly sync'ed. However, if this function + * is used at a place where the vnode has not yet + * been sync'ed, this dependency can show up. So, + * rather than panic, just flush it. + */ + nbp = WK_BMSAFEMAP(wk)->sm_buf; + if (getdirtybuf(&nbp, waitfor) == 0) + break; + FREE_LOCK(&lk); + if (waitfor == MNT_NOWAIT) { + bawrite(nbp); + } else if ((error = VOP_BWRITE(nbp->b_vp, nbp)) != 0) { + bawrite(bp); + return (error); + } + ACQUIRE_LOCK(&lk); + break; + + default: + panic("softdep_sync_metadata: Unknown type %s", + TYPENAME(wk->wk_type)); + /* NOTREACHED */ + } + } + (void) getdirtybuf(&TAILQ_NEXT(bp, b_vnbufs), MNT_WAIT); + nbp = TAILQ_NEXT(bp, b_vnbufs); + FREE_LOCK(&lk); + bawrite(bp); + ACQUIRE_LOCK(&lk); + if (nbp != NULL) { + bp = nbp; + goto loop; + } + /* + * We must wait for any I/O in progress to finish so that + * all potential buffers on the dirty list will be visible. + * Once they are all there, proceed with the second pass + * which will wait for the I/O as per above. + */ + drain_output(vp, 1); + /* + * The brief unlock is to allow any pent up dependency + * processing to be done. + */ + if (waitfor == MNT_NOWAIT) { + waitfor = MNT_WAIT; + FREE_LOCK(&lk); + ACQUIRE_LOCK(&lk); + goto top; + } + + /* + * If we have managed to get rid of all the dirty buffers, + * then we are done. For certain directories and block + * devices, we may need to do further work. + */ + if (TAILQ_FIRST(&vp->v_dirtyblkhd) == NULL) { + FREE_LOCK(&lk); + return (0); + } + + FREE_LOCK(&lk); + /* + * If we are trying to sync a block device, some of its buffers may + * contain metadata that cannot be written until the contents of some + * partially written files have been written to disk. The only easy + * way to accomplish this is to sync the entire filesystem (luckily + * this happens rarely). + */ + if (vn_isdisk(vp) && vp->v_specmountpoint && !VOP_ISLOCKED(vp, NULL) && + (error = VFS_SYNC(vp->v_specmountpoint, MNT_WAIT, ap->a_cred, + ap->a_p)) != 0) + return (error); + return (0); +} + +/* + * Flush the dependencies associated with an inodedep. + * Called with splbio blocked. + */ +static int +flush_inodedep_deps(fs, ino) + struct fs *fs; + ino_t ino; +{ + struct inodedep *inodedep; + struct allocdirect *adp; + int error, waitfor; + struct buf *bp; + + /* + * This work is done in two passes. The first pass grabs most + * of the buffers and begins asynchronously writing them. The + * only way to wait for these asynchronous writes is to sleep + * on the filesystem vnode which may stay busy for a long time + * if the filesystem is active. So, instead, we make a second + * pass over the dependencies blocking on each write. In the + * usual case we will be blocking against a write that we + * initiated, so when it is done the dependency will have been + * resolved. Thus the second pass is expected to end quickly. + * We give a brief window at the top of the loop to allow + * any pending I/O to complete. + */ + for (waitfor = MNT_NOWAIT; ; ) { + FREE_LOCK(&lk); + ACQUIRE_LOCK(&lk); + if (inodedep_lookup(fs, ino, 0, &inodedep) == 0) + return (0); + for (adp = TAILQ_FIRST(&inodedep->id_inoupdt); adp; + adp = TAILQ_NEXT(adp, ad_next)) { + if (adp->ad_state & DEPCOMPLETE) + continue; + bp = adp->ad_buf; + if (getdirtybuf(&bp, waitfor) == 0) { + if (waitfor == MNT_NOWAIT) + continue; + break; + } + FREE_LOCK(&lk); + if (waitfor == MNT_NOWAIT) { + bawrite(bp); + } else if ((error = VOP_BWRITE(bp->b_vp, bp)) != 0) { + ACQUIRE_LOCK(&lk); + return (error); + } + ACQUIRE_LOCK(&lk); + break; + } + if (adp != NULL) + continue; + for (adp = TAILQ_FIRST(&inodedep->id_newinoupdt); adp; + adp = TAILQ_NEXT(adp, ad_next)) { + if (adp->ad_state & DEPCOMPLETE) + continue; + bp = adp->ad_buf; + if (getdirtybuf(&bp, waitfor) == 0) { + if (waitfor == MNT_NOWAIT) + continue; + break; + } + FREE_LOCK(&lk); + if (waitfor == MNT_NOWAIT) { + bawrite(bp); + } else if ((error = VOP_BWRITE(bp->b_vp, bp)) != 0) { + ACQUIRE_LOCK(&lk); + return (error); + } + ACQUIRE_LOCK(&lk); + break; + } + if (adp != NULL) + continue; + /* + * If pass2, we are done, otherwise do pass 2. + */ + if (waitfor == MNT_WAIT) + break; + waitfor = MNT_WAIT; + } + /* + * Try freeing inodedep in case all dependencies have been removed. + */ + if (inodedep_lookup(fs, ino, 0, &inodedep) != 0) + (void) free_inodedep(inodedep); + return (0); +} + +/* + * Eliminate a pagedep dependency by flushing out all its diradd dependencies. + * Called with splbio blocked. + */ +static int +flush_pagedep_deps(pvp, mp, diraddhdp) + struct vnode *pvp; + struct mount *mp; + struct diraddhd *diraddhdp; +{ + struct proc *p = CURPROC; /* XXX */ + struct inodedep *inodedep; + struct ufsmount *ump; + struct diradd *dap; + struct vnode *vp; + int gotit, error = 0; + struct buf *bp; + ino_t inum; + + ump = VFSTOUFS(mp); + while ((dap = LIST_FIRST(diraddhdp)) != NULL) { + /* + * Flush ourselves if this directory entry + * has a MKDIR_PARENT dependency. + */ + if (dap->da_state & MKDIR_PARENT) { + FREE_LOCK(&lk); + if ((error = UFS_UPDATE(pvp, 1)) != 0) + break; + ACQUIRE_LOCK(&lk); + /* + * If that cleared dependencies, go on to next. + */ + if (dap != LIST_FIRST(diraddhdp)) + continue; + if (dap->da_state & MKDIR_PARENT) + panic("flush_pagedep_deps: MKDIR"); + } + /* + * Flush the file on which the directory entry depends. + * If the inode has already been pushed out of the cache, + * then all the block dependencies will have been flushed + * leaving only inode dependencies (e.g., bitmaps). Thus, + * we do a ufs_ihashget to check for the vnode in the cache. + * If it is there, we do a full flush. If it is no longer + * there we need only dispose of any remaining bitmap + * dependencies and write the inode to disk. + */ + inum = dap->da_newinum; + FREE_LOCK(&lk); + if ((vp = ufs_ihashget(ump->um_dev, inum)) == NULL) { + ACQUIRE_LOCK(&lk); + if (inodedep_lookup(ump->um_fs, inum, 0, &inodedep) == 0 + && dap == LIST_FIRST(diraddhdp)) + panic("flush_pagedep_deps: flush 1 failed"); + /* + * If the inode still has bitmap dependencies, + * push them to disk. + */ + if ((inodedep->id_state & DEPCOMPLETE) == 0) { + gotit = getdirtybuf(&inodedep->id_buf,MNT_WAIT); + FREE_LOCK(&lk); + if (gotit && + (error = VOP_BWRITE(inodedep->id_buf->b_vp, + inodedep->id_buf)) != 0) + break; + ACQUIRE_LOCK(&lk); + } + if (dap != LIST_FIRST(diraddhdp)) + continue; + /* + * If the inode is still sitting in a buffer waiting + * to be written, push it to disk. + */ + FREE_LOCK(&lk); + if ((error = bread(ump->um_devvp, + fsbtodb(ump->um_fs, ino_to_fsba(ump->um_fs, inum)), + (int)ump->um_fs->fs_bsize, NOCRED, &bp)) != 0) + break; + if ((error = VOP_BWRITE(bp->b_vp, bp)) != 0) + break; + ACQUIRE_LOCK(&lk); + if (dap == LIST_FIRST(diraddhdp)) + panic("flush_pagedep_deps: flush 2 failed"); + continue; + } + if (vp->v_type == VDIR) { + /* + * A newly allocated directory must have its "." and + * ".." entries written out before its name can be + * committed in its parent. We do not want or need + * the full semantics of a synchronous VOP_FSYNC as + * that may end up here again, once for each directory + * level in the filesystem. Instead, we push the blocks + * and wait for them to clear. + */ + if ((error = + VOP_FSYNC(vp, p->p_ucred, MNT_NOWAIT, p))) { + vput(vp); + break; + } + drain_output(vp, 0); + } + error = UFS_UPDATE(vp, 1); + vput(vp); + if (error) + break; + /* + * If we have failed to get rid of all the dependencies + * then something is seriously wrong. + */ + if (dap == LIST_FIRST(diraddhdp)) + panic("flush_pagedep_deps: flush 3 failed"); + ACQUIRE_LOCK(&lk); + } + if (error) + ACQUIRE_LOCK(&lk); + return (error); +} + +/* + * A large burst of file addition or deletion activity can drive the + * memory load excessively high. Therefore we deliberately slow things + * down and speed up the I/O processing if we find ourselves with too + * many dependencies in progress. + */ +static int +request_cleanup(resource, islocked) + int resource; + int islocked; +{ + struct callout_handle handle; + struct proc *p = CURPROC; + + /* + * We never hold up the filesystem syncer process. + */ + if (p == filesys_syncer) + return (0); + /* + * If we are resource constrained on inode dependencies, try + * flushing some dirty inodes. Otherwise, we are constrained + * by file deletions, so try accelerating flushes of directories + * with removal dependencies. We would like to do the cleanup + * here, but we probably hold an inode locked at this point and + * that might deadlock against one that we try to clean. So, + * the best that we can do is request the syncer daemon to do + * the cleanup for us. + */ + switch (resource) { + + case FLUSH_INODES: + stat_ino_limit_push += 1; + req_clear_inodedeps = 1; + break; + + case FLUSH_REMOVE: + stat_blk_limit_push += 1; + req_clear_remove = 1; + break; + + default: + panic("request_cleanup: unknown type"); + } + /* + * Hopefully the syncer daemon will catch up and awaken us. + * We wait at most tickdelay before proceeding in any case. + */ + if (islocked == 0) + ACQUIRE_LOCK(&lk); + if (proc_waiting == 0) { + proc_waiting = 1; + handle = timeout(pause_timer, NULL, + tickdelay > 2 ? tickdelay : 2); + } + FREE_LOCK_INTERLOCKED(&lk); + (void) tsleep((caddr_t)&proc_waiting, PPAUSE, "softupdate", 0); + ACQUIRE_LOCK_INTERLOCKED(&lk); + if (proc_waiting) { + untimeout(pause_timer, NULL, handle); + proc_waiting = 0; + } else { + switch (resource) { + + case FLUSH_INODES: + stat_ino_limit_hit += 1; + break; + + case FLUSH_REMOVE: + stat_blk_limit_hit += 1; + break; + } + } + if (islocked == 0) + FREE_LOCK(&lk); + return (1); +} + +/* + * Awaken processes pausing in request_cleanup and clear proc_waiting + * to indicate that there is no longer a timer running. + */ +void +pause_timer(arg) + void *arg; +{ + + proc_waiting = 0; + wakeup(&proc_waiting); +} + +/* + * Flush out a directory with at least one removal dependency in an effort + * to reduce the number of freefile and freeblks dependency structures. + */ +static void +clear_remove(p) + struct proc *p; +{ + struct pagedep_hashhead *pagedephd; + struct pagedep *pagedep; + static int next = 0; + struct mount *mp; + struct vnode *vp; + int error, cnt; + ino_t ino; + + ACQUIRE_LOCK(&lk); + for (cnt = 0; cnt < pagedep_hash; cnt++) { + pagedephd = &pagedep_hashtbl[next++]; + if (next >= pagedep_hash) + next = 0; + for (pagedep = LIST_FIRST(pagedephd); pagedep; + pagedep = LIST_NEXT(pagedep, pd_hash)) { + if (LIST_FIRST(&pagedep->pd_dirremhd) == NULL) + continue; + mp = pagedep->pd_mnt; + ino = pagedep->pd_ino; + FREE_LOCK(&lk); + if ((error = VFS_VGET(mp, ino, &vp)) != 0) { + softdep_error("clear_remove: vget", error); + return; + } + if ((error = VOP_FSYNC(vp, p->p_ucred, MNT_NOWAIT, p))) + softdep_error("clear_remove: fsync", error); + drain_output(vp, 0); + vput(vp); + return; + } + } + FREE_LOCK(&lk); +} + +/* + * Clear out a block of dirty inodes in an effort to reduce + * the number of inodedep dependency structures. + */ +static void +clear_inodedeps(p) + struct proc *p; +{ + struct inodedep_hashhead *inodedephd; + struct inodedep *inodedep; + static int next = 0; + struct mount *mp; + struct vnode *vp; + struct fs *fs; + int error, cnt; + ino_t firstino, lastino, ino; + + ACQUIRE_LOCK(&lk); + /* + * Pick a random inode dependency to be cleared. + * We will then gather up all the inodes in its block + * that have dependencies and flush them out. + */ + for (cnt = 0; cnt < inodedep_hash; cnt++) { + inodedephd = &inodedep_hashtbl[next++]; + if (next >= inodedep_hash) + next = 0; + if ((inodedep = LIST_FIRST(inodedephd)) != NULL) + break; + } + /* + * Ugly code to find mount point given pointer to superblock. + */ + fs = inodedep->id_fs; + TAILQ_FOREACH(mp, &mountlist, mnt_list) + if ((mp->mnt_flag & MNT_SOFTDEP) && fs == VFSTOUFS(mp)->um_fs) + break; + /* + * Find the last inode in the block with dependencies. + */ + firstino = inodedep->id_ino & ~(INOPB(fs) - 1); + for (lastino = firstino + INOPB(fs) - 1; lastino > firstino; lastino--) + if (inodedep_lookup(fs, lastino, 0, &inodedep) != 0) + break; + /* + * Asynchronously push all but the last inode with dependencies. + * Synchronously push the last inode with dependencies to ensure + * that the inode block gets written to free up the inodedeps. + */ + for (ino = firstino; ino <= lastino; ino++) { + if (inodedep_lookup(fs, ino, 0, &inodedep) == 0) + continue; + FREE_LOCK(&lk); + if ((error = VFS_VGET(mp, ino, &vp)) != 0) { + softdep_error("clear_inodedeps: vget", error); + return; + } + if (ino == lastino) { + if ((error = VOP_FSYNC(vp, p->p_ucred, MNT_WAIT, p))) + softdep_error("clear_inodedeps: fsync1", error); + } else { + if ((error = VOP_FSYNC(vp, p->p_ucred, MNT_NOWAIT, p))) + softdep_error("clear_inodedeps: fsync2", error); + drain_output(vp, 0); + } + vput(vp); + ACQUIRE_LOCK(&lk); + } + FREE_LOCK(&lk); +} + +/* + * Acquire exclusive access to a buffer. + * Must be called with splbio blocked. + * Return 1 if buffer was acquired. + */ +static int +getdirtybuf(bpp, waitfor) + struct buf **bpp; + int waitfor; +{ + struct buf *bp; + + for (;;) { + if ((bp = *bpp) == NULL) + return (0); + if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_NOWAIT) == 0) + break; + if (waitfor != MNT_WAIT) + return (0); + FREE_LOCK_INTERLOCKED(&lk); + if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_SLEEPFAIL) != ENOLCK) + panic("getdirtybuf: inconsistent lock"); + ACQUIRE_LOCK_INTERLOCKED(&lk); + } + if ((bp->b_flags & B_DELWRI) == 0) { + BUF_UNLOCK(bp); + return (0); + } + bremfree(bp); + return (1); +} + +/* + * Wait for pending output on a vnode to complete. + * Must be called with vnode locked. + */ +static void +drain_output(vp, islocked) + struct vnode *vp; + int islocked; +{ + + if (!islocked) + ACQUIRE_LOCK(&lk); + while (vp->v_numoutput) { + vp->v_flag |= VBWAIT; + FREE_LOCK_INTERLOCKED(&lk); + tsleep((caddr_t)&vp->v_numoutput, PRIBIO + 1, "drainvp", 0); + ACQUIRE_LOCK_INTERLOCKED(&lk); + } + if (!islocked) + FREE_LOCK(&lk); +} + +/* + * Called whenever a buffer that is being invalidated or reallocated + * contains dependencies. This should only happen if an I/O error has + * occurred. The routine is called with the buffer locked. + */ +void +softdep_deallocate_dependencies(bp) + struct buf *bp; +{ + + if ((bp->b_flags & B_ERROR) == 0) + panic("softdep_deallocate_dependencies: dangling deps"); + softdep_error(bp->b_vp->v_mount->mnt_stat.f_mntonname, bp->b_error); + panic("softdep_deallocate_dependencies: unrecovered I/O error"); +} + +/* + * Function to handle asynchronous write errors in the filesystem. + */ +void +softdep_error(func, error) + char *func; + int error; +{ + + /* XXX should do something better! */ + printf("%s: got error %d while accessing filesystem\n", func, error); +} diff --git a/sys/contrib/softupdates/softdep.h b/sys/contrib/softupdates/softdep.h new file mode 100644 index 0000000..8bbc409 --- /dev/null +++ b/sys/contrib/softupdates/softdep.h @@ -0,0 +1,548 @@ +/* + * Copyright 1998 Marshall Kirk McKusick. All Rights Reserved. + * + * The soft updates code is derived from the appendix of a University + * of Michigan technical report (Gregory R. Ganger and Yale N. Patt, + * "Soft Updates: A Solution to the Metadata Update Problem in File + * Systems", CSE-TR-254-95, August 1995). + * + * The following are the copyrights and redistribution conditions that + * apply to this copy of the soft update software. For a license + * to use, redistribute or sell the soft update software under + * conditions other than those described here, please contact the + * author at one of the following addresses: + * + * Marshall Kirk McKusick mckusick@mckusick.com + * 1614 Oxford Street +1-510-843-9542 + * Berkeley, CA 94709-1608 + * USA + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. None of the names of McKusick, Ganger, Patt, or the University of + * Michigan may be used to endorse or promote products derived from + * this software without specific prior written permission. + * 4. Redistributions in any form must be accompanied by information on + * how to obtain complete source code for any accompanying software + * that uses this software. This source code must either be included + * in the distribution or be available for no more than the cost of + * distribution plus a nominal fee, and must be freely redistributable + * under reasonable conditions. For an executable file, complete + * source code means the source code for all modules it contains. + * It does not mean source code for modules or files that typically + * accompany the operating system on which the executable file runs, + * e.g., standard library modules or system header files. + * + * THIS SOFTWARE IS PROVIDED BY MARSHALL KIRK MCKUSICK ``AS IS'' AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL MARSHALL KIRK MCKUSICK BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * @(#)softdep.h 9.6 (McKusick) 2/25/99 + * $FreeBSD$ + */ + +#include <sys/queue.h> + +/* + * Allocation dependencies are handled with undo/redo on the in-memory + * copy of the data. A particular data dependency is eliminated when + * it is ALLCOMPLETE: that is ATTACHED, DEPCOMPLETE, and COMPLETE. + * + * ATTACHED means that the data is not currently being written to + * disk. UNDONE means that the data has been rolled back to a safe + * state for writing to the disk. When the I/O completes, the data is + * restored to its current form and the state reverts to ATTACHED. + * The data must be locked throughout the rollback, I/O, and roll + * forward so that the rolled back information is never visible to + * user processes. The COMPLETE flag indicates that the item has been + * written. For example, a dependency that requires that an inode be + * written will be marked COMPLETE after the inode has been written + * to disk. The DEPCOMPLETE flag indicates the completion of any other + * dependencies such as the writing of a cylinder group map has been + * completed. A dependency structure may be freed only when both it + * and its dependencies have completed and any rollbacks that are in + * progress have finished as indicated by the set of ALLCOMPLETE flags + * all being set. The two MKDIR flags indicate additional dependencies + * that must be done when creating a new directory. MKDIR_BODY is + * cleared when the directory data block containing the "." and ".." + * entries has been written. MKDIR_PARENT is cleared when the parent + * inode with the increased link count for ".." has been written. When + * both MKDIR flags have been cleared, the DEPCOMPLETE flag is set to + * indicate that the directory dependencies have been completed. The + * writing of the directory inode itself sets the COMPLETE flag which + * then allows the directory entry for the new directory to be written + * to disk. The RMDIR flag marks a dirrem structure as representing + * the removal of a directory rather than a file. When the removal + * dependencies are completed, additional work needs to be done + * (truncation of the "." and ".." entries, an additional decrement + * of the associated inode, and a decrement of the parent inode). The + * DIRCHG flag marks a diradd structure as representing the changing + * of an existing entry rather than the addition of a new one. When + * the update is complete the dirrem associated with the inode for + * the old name must be added to the worklist to do the necessary + * reference count decrement. The GOINGAWAY flag indicates that the + * data structure is frozen from further change until its dependencies + * have been completed and its resources freed after which it will be + * discarded. The IOSTARTED flag prevents multiple calls to the I/O + * start routine from doing multiple rollbacks. The ONWORKLIST flag + * shows whether the structure is currently linked onto a worklist. + */ +#define ATTACHED 0x0001 +#define UNDONE 0x0002 +#define COMPLETE 0x0004 +#define DEPCOMPLETE 0x0008 +#define MKDIR_PARENT 0x0010 +#define MKDIR_BODY 0x0020 +#define RMDIR 0x0040 +#define DIRCHG 0x0080 +#define GOINGAWAY 0x0100 +#define IOSTARTED 0x0200 +#define ONWORKLIST 0x8000 + +#define ALLCOMPLETE (ATTACHED | COMPLETE | DEPCOMPLETE) + +/* + * The workitem queue. + * + * It is sometimes useful and/or necessary to clean up certain dependencies + * in the background rather than during execution of an application process + * or interrupt service routine. To realize this, we append dependency + * structures corresponding to such tasks to a "workitem" queue. In a soft + * updates implementation, most pending workitems should not wait for more + * than a couple of seconds, so the filesystem syncer process awakens once + * per second to process the items on the queue. + */ + +/* LIST_HEAD(workhead, worklist); -- declared in buf.h */ + +/* + * Each request can be linked onto a work queue through its worklist structure. + * To avoid the need for a pointer to the structure itself, this structure + * MUST be declared FIRST in each type in which it appears! If more than one + * worklist is needed in the structure, then a wk_data field must be added + * and the macros below changed to use it. + */ +struct worklist { + LIST_ENTRY(worklist) wk_list; /* list of work requests */ + unsigned short wk_type; /* type of request */ + unsigned short wk_state; /* state flags */ +}; +#define WK_DATA(wk) ((void *)(wk)) +#define WK_PAGEDEP(wk) ((struct pagedep *)(wk)) +#define WK_INODEDEP(wk) ((struct inodedep *)(wk)) +#define WK_NEWBLK(wk) ((struct newblk *)(wk)) +#define WK_BMSAFEMAP(wk) ((struct bmsafemap *)(wk)) +#define WK_ALLOCDIRECT(wk) ((struct allocdirect *)(wk)) +#define WK_INDIRDEP(wk) ((struct indirdep *)(wk)) +#define WK_ALLOCINDIR(wk) ((struct allocindir *)(wk)) +#define WK_FREEFRAG(wk) ((struct freefrag *)(wk)) +#define WK_FREEBLKS(wk) ((struct freeblks *)(wk)) +#define WK_FREEFILE(wk) ((struct freefile *)(wk)) +#define WK_DIRADD(wk) ((struct diradd *)(wk)) +#define WK_MKDIR(wk) ((struct mkdir *)(wk)) +#define WK_DIRREM(wk) ((struct dirrem *)(wk)) + +/* + * Various types of lists + */ +LIST_HEAD(dirremhd, dirrem); +LIST_HEAD(diraddhd, diradd); +LIST_HEAD(newblkhd, newblk); +LIST_HEAD(inodedephd, inodedep); +LIST_HEAD(allocindirhd, allocindir); +LIST_HEAD(allocdirecthd, allocdirect); +TAILQ_HEAD(allocdirectlst, allocdirect); + +/* + * The "pagedep" structure tracks the various dependencies related to + * a particular directory page. If a directory page has any dependencies, + * it will have a pagedep linked to its associated buffer. The + * pd_dirremhd list holds the list of dirrem requests which decrement + * inode reference counts. These requests are processed after the + * directory page with the corresponding zero'ed entries has been + * written. The pd_diraddhd list maintains the list of diradd requests + * which cannot be committed until their corresponding inode has been + * written to disk. Because a directory may have many new entries + * being created, several lists are maintained hashed on bits of the + * offset of the entry into the directory page to keep the lists from + * getting too long. Once a new directory entry has been cleared to + * be written, it is moved to the pd_pendinghd list. After the new + * entry has been written to disk it is removed from the pd_pendinghd + * list, any removed operations are done, and the dependency structure + * is freed. + */ +#define DAHASHSZ 6 +#define DIRADDHASH(offset) (((offset) >> 2) % DAHASHSZ) +struct pagedep { + struct worklist pd_list; /* page buffer */ +# define pd_state pd_list.wk_state /* check for multiple I/O starts */ + LIST_ENTRY(pagedep) pd_hash; /* hashed lookup */ + struct mount *pd_mnt; /* associated mount point */ + ino_t pd_ino; /* associated file */ + ufs_lbn_t pd_lbn; /* block within file */ + struct dirremhd pd_dirremhd; /* dirrem's waiting for page */ + struct diraddhd pd_diraddhd[DAHASHSZ]; /* diradd dir entry updates */ + struct diraddhd pd_pendinghd; /* directory entries awaiting write */ +}; + +/* + * The "inodedep" structure tracks the set of dependencies associated + * with an inode. One task that it must manage is delayed operations + * (i.e., work requests that must be held until the inodedep's associated + * inode has been written to disk). Getting an inode from its incore + * state to the disk requires two steps to be taken by the filesystem + * in this order: first the inode must be copied to its disk buffer by + * the VOP_UPDATE operation; second the inode's buffer must be written + * to disk. To ensure that both operations have happened in the required + * order, the inodedep maintains two lists. Delayed operations are + * placed on the id_inowait list. When the VOP_UPDATE is done, all + * operations on the id_inowait list are moved to the id_bufwait list. + * When the buffer is written, the items on the id_bufwait list can be + * safely moved to the work queue to be processed. A second task of the + * inodedep structure is to track the status of block allocation within + * the inode. Each block that is allocated is represented by an + * "allocdirect" structure (see below). It is linked onto the id_newinoupdt + * list until both its contents and its allocation in the cylinder + * group map have been written to disk. Once these dependencies have been + * satisfied, it is removed from the id_newinoupdt list and any followup + * actions such as releasing the previous block or fragment are placed + * on the id_inowait list. When an inode is updated (a VOP_UPDATE is + * done), the "inodedep" structure is linked onto the buffer through + * its worklist. Thus, it will be notified when the buffer is about + * to be written and when it is done. At the update time, all the + * elements on the id_newinoupdt list are moved to the id_inoupdt list + * since those changes are now relevant to the copy of the inode in the + * buffer. Also at update time, the tasks on the id_inowait list are + * moved to the id_bufwait list so that they will be executed when + * the updated inode has been written to disk. When the buffer containing + * the inode is written to disk, any updates listed on the id_inoupdt + * list are rolled back as they are not yet safe. Following the write, + * the changes are once again rolled forward and any actions on the + * id_bufwait list are processed (since those actions are now safe). + * The entries on the id_inoupdt and id_newinoupdt lists must be kept + * sorted by logical block number to speed the calculation of the size + * of the rolled back inode (see explanation in initiate_write_inodeblock). + * When a directory entry is created, it is represented by a diradd. + * The diradd is added to the id_inowait list as it cannot be safely + * written to disk until the inode that it represents is on disk. After + * the inode is written, the id_bufwait list is processed and the diradd + * entries are moved to the id_pendinghd list where they remain until + * the directory block containing the name has been written to disk. + * The purpose of keeping the entries on the id_pendinghd list is so that + * the softdep_fsync function can find and push the inode's directory + * name(s) as part of the fsync operation for that file. + */ +struct inodedep { + struct worklist id_list; /* buffer holding inode block */ +# define id_state id_list.wk_state /* inode dependency state */ + LIST_ENTRY(inodedep) id_hash; /* hashed lookup */ + struct fs *id_fs; /* associated filesystem */ + ino_t id_ino; /* dependent inode */ + nlink_t id_nlinkdelta; /* saved effective link count */ + struct dinode *id_savedino; /* saved dinode contents */ + LIST_ENTRY(inodedep) id_deps; /* bmsafemap's list of inodedep's */ + struct buf *id_buf; /* related bmsafemap (if pending) */ + off_t id_savedsize; /* file size saved during rollback */ + struct workhead id_pendinghd; /* entries awaiting directory write */ + struct workhead id_bufwait; /* operations after inode written */ + struct workhead id_inowait; /* operations waiting inode update */ + struct allocdirectlst id_inoupdt; /* updates before inode written */ + struct allocdirectlst id_newinoupdt; /* updates when inode written */ +}; + +/* + * A "newblk" structure is attached to a bmsafemap structure when a block + * or fragment is allocated from a cylinder group. Its state is set to + * DEPCOMPLETE when its cylinder group map is written. It is consumed by + * an associated allocdirect or allocindir allocation which will attach + * themselves to the bmsafemap structure if the newblk's DEPCOMPLETE flag + * is not set (i.e., its cylinder group map has not been written). + */ +struct newblk { + LIST_ENTRY(newblk) nb_hash; /* hashed lookup */ + struct fs *nb_fs; /* associated filesystem */ + ufs_daddr_t nb_newblkno; /* allocated block number */ + int nb_state; /* state of bitmap dependency */ + LIST_ENTRY(newblk) nb_deps; /* bmsafemap's list of newblk's */ + struct bmsafemap *nb_bmsafemap; /* associated bmsafemap */ +}; + +/* + * A "bmsafemap" structure maintains a list of dependency structures + * that depend on the update of a particular cylinder group map. + * It has lists for newblks, allocdirects, allocindirs, and inodedeps. + * It is attached to the buffer of a cylinder group block when any of + * these things are allocated from the cylinder group. It is freed + * after the cylinder group map is written and the state of its + * dependencies are updated with DEPCOMPLETE to indicate that it has + * been processed. + */ +struct bmsafemap { + struct worklist sm_list; /* cylgrp buffer */ + struct buf *sm_buf; /* associated buffer */ + struct allocdirecthd sm_allocdirecthd; /* allocdirect deps */ + struct allocindirhd sm_allocindirhd; /* allocindir deps */ + struct inodedephd sm_inodedephd; /* inodedep deps */ + struct newblkhd sm_newblkhd; /* newblk deps */ +}; + +/* + * An "allocdirect" structure is attached to an "inodedep" when a new block + * or fragment is allocated and pointed to by the inode described by + * "inodedep". The worklist is linked to the buffer that holds the block. + * When the block is first allocated, it is linked to the bmsafemap + * structure associated with the buffer holding the cylinder group map + * from which it was allocated. When the cylinder group map is written + * to disk, ad_state has the DEPCOMPLETE flag set. When the block itself + * is written, the COMPLETE flag is set. Once both the cylinder group map + * and the data itself have been written, it is safe to write the inode + * that claims the block. If there was a previous fragment that had been + * allocated before the file was increased in size, the old fragment may + * be freed once the inode claiming the new block is written to disk. + * This ad_fragfree request is attached to the id_inowait list of the + * associated inodedep (pointed to by ad_inodedep) for processing after + * the inode is written. + */ +struct allocdirect { + struct worklist ad_list; /* buffer holding block */ +# define ad_state ad_list.wk_state /* block pointer state */ + TAILQ_ENTRY(allocdirect) ad_next; /* inodedep's list of allocdirect's */ + ufs_lbn_t ad_lbn; /* block within file */ + ufs_daddr_t ad_newblkno; /* new value of block pointer */ + ufs_daddr_t ad_oldblkno; /* old value of block pointer */ + long ad_newsize; /* size of new block */ + long ad_oldsize; /* size of old block */ + LIST_ENTRY(allocdirect) ad_deps; /* bmsafemap's list of allocdirect's */ + struct buf *ad_buf; /* cylgrp buffer (if pending) */ + struct inodedep *ad_inodedep; /* associated inodedep */ + struct freefrag *ad_freefrag; /* fragment to be freed (if any) */ +}; + +/* + * A single "indirdep" structure manages all allocation dependencies for + * pointers in an indirect block. The up-to-date state of the indirect + * block is stored in ir_savedata. The set of pointers that may be safely + * written to the disk is stored in ir_safecopy. The state field is used + * only to track whether the buffer is currently being written (in which + * case it is not safe to update ir_safecopy). Ir_deplisthd contains the + * list of allocindir structures, one for each block that needs to be + * written to disk. Once the block and its bitmap allocation have been + * written the safecopy can be updated to reflect the allocation and the + * allocindir structure freed. If ir_state indicates that an I/O on the + * indirect block is in progress when ir_safecopy is to be updated, the + * update is deferred by placing the allocindir on the ir_donehd list. + * When the I/O on the indirect block completes, the entries on the + * ir_donehd list are processed by updating their corresponding ir_safecopy + * pointers and then freeing the allocindir structure. + */ +struct indirdep { + struct worklist ir_list; /* buffer holding indirect block */ +# define ir_state ir_list.wk_state /* indirect block pointer state */ + caddr_t ir_saveddata; /* buffer cache contents */ + struct buf *ir_savebp; /* buffer holding safe copy */ + struct allocindirhd ir_donehd; /* done waiting to update safecopy */ + struct allocindirhd ir_deplisthd; /* allocindir deps for this block */ +}; + +/* + * An "allocindir" structure is attached to an "indirdep" when a new block + * is allocated and pointed to by the indirect block described by the + * "indirdep". The worklist is linked to the buffer that holds the new block. + * When the block is first allocated, it is linked to the bmsafemap + * structure associated with the buffer holding the cylinder group map + * from which it was allocated. When the cylinder group map is written + * to disk, ai_state has the DEPCOMPLETE flag set. When the block itself + * is written, the COMPLETE flag is set. Once both the cylinder group map + * and the data itself have been written, it is safe to write the entry in + * the indirect block that claims the block; the "allocindir" dependency + * can then be freed as it is no longer applicable. + */ +struct allocindir { + struct worklist ai_list; /* buffer holding indirect block */ +# define ai_state ai_list.wk_state /* indirect block pointer state */ + LIST_ENTRY(allocindir) ai_next; /* indirdep's list of allocindir's */ + int ai_offset; /* pointer offset in indirect block */ + ufs_daddr_t ai_newblkno; /* new block pointer value */ + ufs_daddr_t ai_oldblkno; /* old block pointer value */ + struct freefrag *ai_freefrag; /* block to be freed when complete */ + struct indirdep *ai_indirdep; /* address of associated indirdep */ + LIST_ENTRY(allocindir) ai_deps; /* bmsafemap's list of allocindir's */ + struct buf *ai_buf; /* cylgrp buffer (if pending) */ +}; + +/* + * A "freefrag" structure is attached to an "inodedep" when a previously + * allocated fragment is replaced with a larger fragment, rather than extended. + * The "freefrag" structure is constructed and attached when the replacement + * block is first allocated. It is processed after the inode claiming the + * bigger block that replaces it has been written to disk. Note that the + * ff_state field is is used to store the uid, so may lose data. However, + * the uid is used only in printing an error message, so is not critical. + * Keeping it in a short keeps the data structure down to 32 bytes. + */ +struct freefrag { + struct worklist ff_list; /* id_inowait or delayed worklist */ +# define ff_state ff_list.wk_state /* owning user; should be uid_t */ + struct vnode *ff_devvp; /* filesystem device vnode */ + struct fs *ff_fs; /* addr of superblock */ + ufs_daddr_t ff_blkno; /* fragment physical block number */ + long ff_fragsize; /* size of fragment being deleted */ + ino_t ff_inum; /* owning inode number */ +}; + +/* + * A "freeblks" structure is attached to an "inodedep" when the + * corresponding file's length is reduced to zero. It records all + * the information needed to free the blocks of a file after its + * zero'ed inode has been written to disk. + */ +struct freeblks { + struct worklist fb_list; /* id_inowait or delayed worklist */ + ino_t fb_previousinum; /* inode of previous owner of blocks */ + struct vnode *fb_devvp; /* filesystem device vnode */ + struct fs *fb_fs; /* addr of superblock */ + off_t fb_oldsize; /* previous file size */ + off_t fb_newsize; /* new file size */ + int fb_chkcnt; /* used to check cnt of blks released */ + uid_t fb_uid; /* uid of previous owner of blocks */ + ufs_daddr_t fb_dblks[NDADDR]; /* direct blk ptrs to deallocate */ + ufs_daddr_t fb_iblks[NIADDR]; /* indirect blk ptrs to deallocate */ +}; + +/* + * A "freefile" structure is attached to an inode when its + * link count is reduced to zero. It marks the inode as free in + * the cylinder group map after the zero'ed inode has been written + * to disk and any associated blocks and fragments have been freed. + */ +struct freefile { + struct worklist fx_list; /* id_inowait or delayed worklist */ + mode_t fx_mode; /* mode of inode */ + ino_t fx_oldinum; /* inum of the unlinked file */ + struct vnode *fx_devvp; /* filesystem device vnode */ + struct fs *fx_fs; /* addr of superblock */ +}; + +/* + * A "diradd" structure is linked to an "inodedep" id_inowait list when a + * new directory entry is allocated that references the inode described + * by "inodedep". When the inode itself is written (either the initial + * allocation for new inodes or with the increased link count for + * existing inodes), the COMPLETE flag is set in da_state. If the entry + * is for a newly allocated inode, the "inodedep" structure is associated + * with a bmsafemap which prevents the inode from being written to disk + * until the cylinder group has been updated. Thus the da_state COMPLETE + * flag cannot be set until the inode bitmap dependency has been removed. + * When creating a new file, it is safe to write the directory entry that + * claims the inode once the referenced inode has been written. Since + * writing the inode clears the bitmap dependencies, the DEPCOMPLETE flag + * in the diradd can be set unconditionally when creating a file. When + * creating a directory, there are two additional dependencies described by + * mkdir structures (see their description below). When these dependencies + * are resolved the DEPCOMPLETE flag is set in the diradd structure. + * If there are multiple links created to the same inode, there will be + * a separate diradd structure created for each link. The diradd is + * linked onto the pg_diraddhd list of the pagedep for the directory + * page that contains the entry. When a directory page is written, + * the pg_diraddhd list is traversed to rollback any entries that are + * not yet ready to be written to disk. If a directory entry is being + * changed (by rename) rather than added, the DIRCHG flag is set and + * the da_previous entry points to the entry that will be "removed" + * once the new entry has been committed. During rollback, entries + * with da_previous are replaced with the previous inode number rather + * than zero. + * + * The overlaying of da_pagedep and da_previous is done to keep the + * structure down to 32 bytes in size on a 32-bit machine. If a + * da_previous entry is present, the pointer to its pagedep is available + * in the associated dirrem entry. If the DIRCHG flag is set, the + * da_previous entry is valid; if not set the da_pagedep entry is valid. + * The DIRCHG flag never changes; it is set when the structure is created + * if appropriate and is never cleared. + */ +struct diradd { + struct worklist da_list; /* id_inowait or id_pendinghd list */ +# define da_state da_list.wk_state /* state of the new directory entry */ + LIST_ENTRY(diradd) da_pdlist; /* pagedep holding directory block */ + doff_t da_offset; /* offset of new dir entry in dir blk */ + ino_t da_newinum; /* inode number for the new dir entry */ + union { + struct dirrem *dau_previous; /* entry being replaced in dir change */ + struct pagedep *dau_pagedep; /* pagedep dependency for addition */ + } da_un; +}; +#define da_previous da_un.dau_previous +#define da_pagedep da_un.dau_pagedep + +/* + * Two "mkdir" structures are needed to track the additional dependencies + * associated with creating a new directory entry. Normally a directory + * addition can be committed as soon as the newly referenced inode has been + * written to disk with its increased link count. When a directory is + * created there are two additional dependencies: writing the directory + * data block containing the "." and ".." entries (MKDIR_BODY) and writing + * the parent inode with the increased link count for ".." (MKDIR_PARENT). + * These additional dependencies are tracked by two mkdir structures that + * reference the associated "diradd" structure. When they have completed, + * they set the DEPCOMPLETE flag on the diradd so that it knows that its + * extra dependencies have been completed. The md_state field is used only + * to identify which type of dependency the mkdir structure is tracking. + * It is not used in the mainline code for any purpose other than consistency + * checking. All the mkdir structures in the system are linked together on + * a list. This list is needed so that a diradd can find its associated + * mkdir structures and deallocate them if it is prematurely freed (as for + * example if a mkdir is immediately followed by a rmdir of the same directory). + * Here, the free of the diradd must traverse the list to find the associated + * mkdir structures that reference it. The deletion would be faster if the + * diradd structure were simply augmented to have two pointers that referenced + * the associated mkdir's. However, this would increase the size of the diradd + * structure from 32 to 64-bits to speed a very infrequent operation. + */ +struct mkdir { + struct worklist md_list; /* id_inowait or buffer holding dir */ +# define md_state md_list.wk_state /* type: MKDIR_PARENT or MKDIR_BODY */ + struct diradd *md_diradd; /* associated diradd */ + struct buf *md_buf; /* MKDIR_BODY: buffer holding dir */ + LIST_ENTRY(mkdir) md_mkdirs; /* list of all mkdirs */ +}; +LIST_HEAD(mkdirlist, mkdir) mkdirlisthd; + +/* + * A "dirrem" structure describes an operation to decrement the link + * count on an inode. The dirrem structure is attached to the pg_dirremhd + * list of the pagedep for the directory page that contains the entry. + * It is processed after the directory page with the deleted entry has + * been written to disk. + * + * The overlaying of dm_pagedep and dm_dirinum is done to keep the + * structure down to 32 bytes in size on a 32-bit machine. It works + * because they are never used concurrently. + */ +struct dirrem { + struct worklist dm_list; /* delayed worklist */ +# define dm_state dm_list.wk_state /* state of the old directory entry */ + LIST_ENTRY(dirrem) dm_next; /* pagedep's list of dirrem's */ + struct mount *dm_mnt; /* associated mount point */ + ino_t dm_oldinum; /* inum of the removed dir entry */ + union { + struct pagedep *dmu_pagedep; /* pagedep dependency for remove */ + ino_t dmu_dirinum; /* parent inode number (for rmdir) */ + } dm_un; +}; +#define dm_pagedep dm_un.dmu_pagedep +#define dm_dirinum dm_un.dmu_dirinum |