diff options
author | jal2 <jal2> | 2003-03-21 20:21:20 +0000 |
---|---|---|
committer | jal2 <jal2> | 2003-03-21 20:21:20 +0000 |
commit | 8703b030d3f92034d70064d9a14b2e18e60419f1 (patch) | |
tree | 7a4c14df84db6c236ba9ce0d121460d33160e69b |
Initial revision
-rw-r--r-- | COPYING | 340 | ||||
-rw-r--r-- | Makefile | 81 | ||||
-rw-r--r-- | README | 96 | ||||
-rw-r--r-- | at76c503.c | 3202 | ||||
-rw-r--r-- | at76c503.h | 304 | ||||
-rw-r--r-- | at76c503fw.c | 362 | ||||
-rw-r--r-- | externalr.h | 1500 | ||||
-rw-r--r-- | ieee802_11.h | 223 | ||||
-rw-r--r-- | internalr.h | 2170 | ||||
-rw-r--r-- | rom2h.c | 39 | ||||
-rw-r--r-- | usbdfu.c | 735 | ||||
-rw-r--r-- | usbdfu.h | 19 |
12 files changed, 9071 insertions, 0 deletions
@@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2eb9e46 --- /dev/null +++ b/Makefile @@ -0,0 +1,81 @@ +VERSION = 0.8 + +CC=gcc + +KERNEL_VERSION = $(shell uname -r) + +KERNEL_SRC = /lib/modules/$(KERNEL_VERSION)/build +KERNEL_HEADERS = $(KERNEL_SRC)/include + +MODULES = at76c503.o usbdfu.o + +SRCS = at76c503.c usbdfu.c at76c503fw.c rom2h.c +HDRS = internalr.h externalr.h at76c503.h ieee802_11.h usbdfu.h +MODULE_DIR = $(DESTDIR)/lib/modules/$(KERNEL_VERSION)/kernel/drivers/usb/ +CPPFLAGS = -D__KERNEL__ \ + -DMODULE -DEXPORT_SYMTAB \ + -DDRIVER_VERSION=\"v$(VERSION)\" \ + -I$(KERNEL_HEADERS) +CFLAGS = -O2 -Wall -Wstrict-prototypes -pipe + +MODVER = $(shell if cat $(KERNEL_HEADERS)/linux/autoconf.h 2>/dev/null | \ +grep -q '^[[:space:]]*\#define[[:space:]]*CONFIG_MODVERSIONS[[:space:]]*1'; \ +then echo 1; else echo 0; fi) + +ifeq ($(MODVER),1) +MFLAG = -DMODVERSIONS -include $(KERNEL_HEADERS)/linux/modversions.h +endif + +CCDEP = $(CC) $(CFLAGS) -M +TAR = tar + +DISTFILES = $(SRCS) $(HDRS) Makefile README COPYING +TOPDISTFILES = +DISTNAME = at76c503-$(VERSION) +DISTDIR = ../dist + +all: $(MODULES) + +at76c503fw: at76c503fw.c + $(CC) $(CFLAGS) -o $@ $< -lusb + +rom2h: rom2h.c + $(CC) $(CFLAGS) -o $@ $< + +TAGS: + rm -f TAGS + find $(KERNEL_SRC)/ -name '*.[ch]' | xargs etags --append + etags --append $(SRCS) $(HDRS) + +install: all + mkdir -p $(MODULE_DIR) + for f in $(MODULES); do install -m 644 -o 0 -g 0 $$f $(MODULE_DIR)/$$f; done + /sbin/depmod -a + +uninstall: + for f in $(MODULES); do rm $(MODULE_DIR)/$$f; done + +clean: + rm -f at76c503fw rom2h + rm -f core *.o *~ a.out *.d + rm -f *.s *.i + +dist: + [ -d $(DISTNAME) ] && rm -rf $(DISTNAME) || true + mkdir $(DISTNAME) + cp -aR $(DISTFILES) $(DISTNAME) + tar zcvf $(DISTNAME).tar.gz $(DISTNAME) + rm -rf $(DISTNAME) + +.PHONY: dist + +%.o: %.c + $(CC) -MD $(CFLAGS) $(CPPFLAGS) $(MFLAG) -c $< + +%.s: %.c + $(CC) -MD $(CFLAGS) $(CPPFLAGS) -S $< + +%.i: %.c + $(CC) -MD $(CPPFLAGS) -E $< -o $@ + +-include $(SRCS:%.c=%.d) @@ -0,0 +1,96 @@ +at76c503 - linux driver for Atmel at76c503 based usb wlan adapters +------------------------------------------------------------------ + +This is a another driver for the Atmel based USB WLAN adaptors. I am +developing this driver in private. I am not associated with Atmel, or +any cooperation that builds devices with this chip. My only +information source is the driver from +http://atmelwlandriver.sourceforge.net. + +Known devices with this chip are: +- Belkin F5D6050 +- Dynalink/Askey WLL013 +- Linksys WUSB11 v2.6 +- Netgear MA101B + +It is early in development. Currently, it has some limitations: + +- to change the essid or channel, the network has to be restarted + (with ifconfig) + +If you are looking for a more complete driver, look at +http://atmelwlandriver.sourceforge.net. + +Reqirements: +------------ + +- Kernel 2.4.x. I am developing the driver on 2.4.20, but it + reportedly also works on 2.4.19, 2.4.18 and 2.4.16. I am not sure + about 2.5.x. + +Installation: +------------- + +make +make install + +Running: +-------- + +Plug in the adapter. If you already used it under Windows or with the +driver from atmelwlandriver.sourceforge.net, replug the device +(ie. plug out and in again). + +If you have hotplug installed, the drivers should now be loaded. If not, +load them by hand: + +modprobe -v at76c503 +or +insmod usbdfu.o; insmod at76c503 + +You can give the network device another name than eth by giving +the module the eth_name parameter. Eg. +insmod at76c50.o eth_name=wlan%d +would give the first device the name wlan0, the second wlan1 etc... + +Check if the modules are loaded with lsmod. It should look like this: + +... +at76c503 49972 0 +usbdfu 6164 0 [at76c503] +... + +setup networking (replace <iface> with eth0, eth1, ..., <ch> with a +channel number (1..14) <essid> with your network id (a string), <ip> +with an IP address) + +iwconfig <iface> channel <ch> mode ad-hoc essid <essid> +ifonfig <iface> <ip> up + +Example: +iwconfig eth2 mode ad-hoc channel 10 essid okuwlan +ifconfig eth2 192.168.3.1 up + +Test it by pinging another host with a wlan adaptor. + +To change a parameter with iwconfig, do: +ifconfig <iface> down +iwconfig ... +ifconfig <iface> up + +Note that the firmware survives reboots of the computer, but not +unplugging the device. + +If you get problems: +Look with dmesg, if there are error messages + +Thanks to: +- the authors of the usbvnet driver (atmelwlandriver.sourceforge.net) +- Joerg Albert for lots of patches +- Brad Hards and Bas Vermeulen for the firmeware code, which I ported to kernel space +- David Gibson, I used his orinoco driver for learning +- the author(s) of the usbnet driver +- the author(s) of the rtl8150 driver +- lots of other authors of usb and wlan drivers, where I stole code from + +Oliver Kurth <oku@masqmail.cx>, Mon, 6 Jan 2003 22:39:47 +0100 diff --git a/at76c503.c b/at76c503.c new file mode 100644 index 0000000..5ca2244 --- /dev/null +++ b/at76c503.c @@ -0,0 +1,3202 @@ +/* -*- linux-c -*- */ +/* + * USB at76c503 driver + * + * Copyright (c) 2002 - 2003 Oliver Kurth <oku@masqmail.cx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * + * This driver is derived from usb-skeleton.c + * + * History: + * + * 2002_12_31: + * - first ping, ah-hoc mode works, fw version 0.90.2 only + * + * 2003_01_07 0.1: + * - first release + * + * 2003_01_08 0.2: + * - moved rx code into tasklet + * - added locking in keventd handler + * - support big endian in ieee802_11.h + * - external firmware downloader now in this module + * + * 2003_01_10 0.3: + * - now using 8 spaces for tab indentations + * - added tx rate settings (patch from Joerg Albert (jal)) + * - created functions for mib settings + * + * 2003_01_19 0.4: + * - use usbdfu for the internal firmware + * + * 2003_01_27 0.5: + * - implemented WEP. Thanks to jal + * - added frag and rts ioctl calls (jal again) + * - module parameter to give names other than eth + * + * 2003_01_28 0.6: + * - make it compile with kernel < 2.4.20 (there is no owner field + * in struct usb_driver) + * - fixed a small bug for the module param eth_name + * - do not use GFP_DMA, GFP_KERNEL is enough + * - no down() in _tx() because that's in interrupt. Use + * spin_lock_irq() instead + * - should not stop net queue on urb errors + * - cleanup in ioctl(): locked it altogether, this makes it easier + * to maintain + * - tried to implement promisc. mode: does not work with this device + * - tried to implement setting mac address: does not + * seem to work with this device + * - now use fw version 0.90.2 #140 (prev. was #93). Does not help... + * + * 2003_01_30 0.7: + * - now works with fw 0.100.2 (solution was: wait for completion + * of commands) + * - setting MAC address now works (thx to a small fix by jal) + * - it turned out that promisc. mode is not possible. The firmware + * does not allow it. I hope that it will be implemented in a future + * version. + * + * 2003_02_13 0.8: + * - scan mode implemented by jal + * - infra structure mode by jal + * - some small cleanups (removed dead code) + * + * TODO: + * - monitor mode + * - should not need do drive device down, if changes are + * made with iwconfig + * - scan for BSS + * - infrastructure mode (if I can get an AP) + * - fw 0.100.x + * - optimize rx and tx (no memcpy) + * + */ + +#include <linux/config.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/signal.h> +#include <linux/errno.h> +#include <linux/poll.h> +#include <linux/init.h> +#include <linux/slab.h> +#include <linux/fcntl.h> +#include <linux/module.h> +#include <linux/spinlock.h> +#include <linux/list.h> +#include <linux/smp_lock.h> +#include <linux/devfs_fs_kernel.h> +#include <linux/usb.h> +#include <linux/netdevice.h> +#include <linux/if_arp.h> +#include <linux/etherdevice.h> +#include <linux/wireless.h> + +#include "at76c503.h" +#include "ieee802_11.h" +#include "usbdfu.h" + +typedef unsigned char UCHAR; +#include "internalr.h" +#include "externalr.h" + +#ifdef CONFIG_USB_DEBUG +static int debug = 1; +#else +static int debug; +#endif + +/* Use our own dbg macro */ +#undef dbg +#define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg); } while (0) + +#ifndef min +#define min(x,y) ((x) < (y) ? (x) : (y)) +#endif + +#define assert(x) \ + do {\ + if (!(x)) \ + err(__FILE__ ":%d assertion " #x " failed", __LINE__);\ + } while (0) + +/* how often do we re-try these packets ? */ +#define AUTH_RETRIES 3 +#define ASSOC_RETRIES 3 +#define DISASSOC_RETRIES 3 + +#define NEW_STATE(dev,newstate) \ + do {\ + dbg("%s: state %d -> %d (" #newstate ")",\ + dev->netdev->name, dev->istate, newstate);\ + dev->istate = newstate;\ + } while (0) + +/* the beacon timeout in infra mode when we are connected (in seconds) */ +#define BEACON_TIMEOUT 10 + +/* after how many seconds do we re-scan the channels in infra mode */ +#define RESCAN_TIME 10 + +/* Version Information */ +#define DRIVER_AUTHOR "Oliver Kurth <oku@masqmail.cx>, Joerg Albert <joerg.albert@gmx.de>" +#define DRIVER_DESC "Atmel at76c503 Wireless LAN Driver" + +/* Module paramaters */ +MODULE_PARM(debug, "i"); +MODULE_PARM_DESC(debug, "Debug enabled or not"); + +static char eth_name[IFNAMSIZ+1] = "eth%d"; +MODULE_PARM(eth_name, "c" __MODULE_STRING(IFNAMSIZ)); +MODULE_PARM_DESC(eth_name, + "the device name (default is eth%d)"); + +/* except for belkin and netgear, none of these are tested: */ + +#define VENDOR_ID_ATMEL 0x03eb +#define PRODUCT_ID_ATMEL_503 0x7605 +#define PRODUCT_ID_ATMEL_505 0x7606 /* not yet supported, but there will be a time.. */ + +#define VENDOR_ID_BELKIN 0x0d5c +#define PRODUCT_ID_BELKIN 0xa002 /* Belkin F5D6050 */ + +#define VENDOR_ID_DYNALINK 0x069a +#define PRODUCT_ID_DYNALINK 0x0321 /* Dynalink/Askey WLL013 */ + +#define VENDOR_ID_LINKSYS 0x077b +#define PRODUCT_ID_LINKSYS 0x2219 /* Linksys WUSB11 v2.6 */ + +#define VENDOR_ID_NETGEAR 0x0864 +#define PRODUCT_ID_NETGEAR_MA101B 0x4102 /* Netgear MA 101 Rev. B */ + +static struct usb_device_id at76c503_table [] = { + { USB_DEVICE(VENDOR_ID_ATMEL, PRODUCT_ID_ATMEL_503) }, + { USB_DEVICE(VENDOR_ID_BELKIN, PRODUCT_ID_BELKIN) }, + { USB_DEVICE(VENDOR_ID_DYNALINK, PRODUCT_ID_DYNALINK) }, + { USB_DEVICE(VENDOR_ID_LINKSYS, PRODUCT_ID_LINKSYS) }, + { USB_DEVICE(VENDOR_ID_NETGEAR, PRODUCT_ID_NETGEAR_MA101B) }, + { } +}; + +MODULE_DEVICE_TABLE (usb, at76c503_table); + +struct header_struct { + /* 802.3 */ + u8 dest[ETH_ALEN]; + u8 src[ETH_ALEN]; + u16 len; + /* 802.2 */ + u8 dsap; + u8 ssap; + u8 ctrl; + /* SNAP */ + u8 oui[3]; + u16 ethertype; +} __attribute__ ((packed)); + +#define DEF_RTS_THRESHOLD 1536 +#define DEF_FRAG_THRESHOLD 1536 +#define DEF_ESSID "okuwlan" +#define DEF_ESSID_LEN 7 +#define DEF_CHANNEL 10 + +#define MAX_RTS_THRESHOLD 2347 +#define MAX_FRAG_THRESHOLD 2346 +#define MIN_FRAG_THRESHOLD 256 + +/* The frequency of each channel in MHz */ +const long channel_frequency[] = { + 2412, 2417, 2422, 2427, 2432, 2437, 2442, + 2447, 2452, 2457, 2462, 2467, 2472, 2484 +}; +#define NUM_CHANNELS ( sizeof(channel_frequency) / sizeof(channel_frequency[0]) ) + +/* the broadcast address */ +const u8 bc_addr[ETH_ALEN] = {0xff,0xff,0xff,0xff,0xff,0xff}; + +/* the basic rates of this hardware */ +const u8 hw_rates[4] = {0x82,0x84,0x8b,0x96}; + +/* the max padding size for tx in bytes */ +#define MAX_PADDING_SIZE 53 + +struct ieee802_11_mgmt { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; /* destination addr */ + u8 addr2[ETH_ALEN]; /* source addr */ + u8 addr3[ETH_ALEN]; /* BSSID */ + u16 seq_ctl; + u8 data[1508]; + u32 fcs; +} __attribute__ ((packed)); + +/* the size of the ieee802.11 header (incl. the at76c503 tx header) */ +#define IEEE802_11_MGMT_HEADER_SIZE \ + (offsetof(struct at76c503_tx_buffer, packet) +\ + offsetof(struct ieee802_11_mgmt, data)) + +/* beacon in ieee802_11_mgmt.data */ +struct ieee802_11_beacon_data { + u8 timestamp[8]; // TSFTIMER + u16 beacon_interval; // Kms between TBTTs (Target Beacon Transmission Times) + u16 capability_information; + u8 data[1500]; /* contains: SSID (tag,length,value), + Supported Rates (tlv), channel */ +} __attribute__ ((packed)); + +/* disassoc frame in ieee802_11_mgmt.data */ +struct ieee802_11_disassoc_frame { + u16 reason; +} __attribute__ ((packed)); +#define DISASSOC_FRAME_SIZE \ + (IEEE802_11_MGMT_HEADER_SIZE +\ + sizeof(struct ieee802_11_disassoc_frame)) + +/* assoc request in ieee802_11_mgmt.data */ +struct ieee802_11_assoc_req { + u16 capability; + u16 listen_interval; + u8 data[1]; /* variable number of bytes for SSID + and supported rates (tlv coded) */ +}; +/* the maximum size of an AssocReq packet */ +#define ASSOCREQ_MAX_SIZE \ + (IEEE802_11_MGMT_HEADER_SIZE +\ + offsetof(struct ieee802_11_assoc_req,data) +\ + 1+1+IW_ESSID_MAX_SIZE + 1+1+4) + +/* reassoc request in ieee802_11_mgmt.data */ +struct ieee802_11_reassoc_req { + u16 capability; + u16 listen_interval; + u8 curr_ap[ETH_ALEN]; /* the bssid of the AP we are + currently associated to */ + u8 data[1]; /* variable number of bytes for SSID + and supported rates (tlv coded) */ +} __attribute__ ((packed)); + +/* the maximum size of an AssocReq packet */ +#define REASSOCREQ_MAX_SIZE \ + (IEEE802_11_MGMT_HEADER_SIZE +\ + offsetof(struct ieee802_11_reassoc_req,data) +\ + 1+1+IW_ESSID_MAX_SIZE + 1+1+4) + + +/* assoc/reassoc response */ +struct ieee802_11_assoc_resp { + u16 capability; + u16 status; + u16 assoc_id; + u8 data[1]; /* variable number of bytes for + supported rates (tlv coded) */ +} __attribute__ ((packed)); + +/* auth. request/response in ieee802_11_mgmt.data */ +struct ieee802_11_auth_frame { + u16 algorithm; + u16 seq_nr; + u16 status; + /* no challenge text (yet) */ +} __attribute__ ((packed)); + +/* deauth frame in ieee802_11_mgmt.data */ +struct ieee802_11_deauth_frame { + u16 reason; +} __attribute__ ((packed)); +#define DEAUTH_FRAME_SIZE \ + (IEEE802_11_MGMT_HEADER_SIZE +\ + sizeof(struct ieee802_11_disauth_frame)) + +/* for shared key, add the challenge text size */ +#define AUTH_FRAME_SIZE \ + (IEEE802_11_MGMT_HEADER_SIZE +\ + sizeof(struct ieee802_11_auth_frame)) + + +#define KEVENT_CTRL_HALT 1 +#define KEVENT_NEW_BSS 2 +#define KEVENT_SET_PROMISC 3 +#define KEVENT_MGMT_TIMEOUT 4 +#define KEVENT_SCANJOIN 5 /* SCAN and JOIN are used in infrastructure mode only */ + +/* struct to store BSS info found during scan */ +#define MAX_RATE_LEN 32 /* 32 rates should be enough ... */ + +struct bss_info{ + u8 mac[ETH_ALEN]; /* real mac address, differs + for ad-hoc from bssid */ + u8 bssid[ETH_ALEN]; /* bssid */ + u8 ssid[IW_ESSID_MAX_SIZE+1]; /* ssid, +1 for trailing \0 + to make it printable */ + u8 ssid_len; /* length of ssid above */ + u8 channel; + u16 capa; /* the capabilities of the BSS (in original endianess - + we only check IEEE802_11 bits in it) */ + u16 beacon_interval; /* the beacon interval (in cpu endianess - + we must calc. values from it */ + u8 rates[MAX_RATE_LEN]; /* supported rates (list of bytes: + (basic_rate ? 0x80 : 0) + rate/(500 Kbit/s); e.g. + x82,x84,x8b,x96 for basic rates 1,2,5.5,11 MBit/s) */ + u8 rates_len; + + /* quality of received beacon */ + u8 rssi; + u8 link_qual; + u8 noise_level; +}; + +#define NR_BSS_INFO 16 /* how many BSS do we record */ + +/* states in infrastructure mode */ +enum infra_state { + INIT, + SCANNING, + AUTHENTICATING, + ASSOCIATING, + REASSOCIATING, + DISASSOCIATING, + JOINING, + CONNECTED +}; + +struct at76c503 { + struct usb_device *udev; /* save off the usb device pointer */ + struct net_device *netdev; /* save off the net device pointer */ + struct net_device_stats stats; + struct iw_statistics wstats; + struct usb_interface *interface; /* the interface for this device */ + + unsigned char num_ports; /* the number of ports this device has */ + char num_interrupt_in; /* number of interrupt in endpoints we have */ + char num_bulk_in; /* number of bulk in endpoints we have */ + char num_bulk_out; /* number of bulk out endpoints we have */ + + unsigned char * bulk_in_buffer; /* the buffer to receive data */ + int bulk_in_size; /* the size of the receive buffer */ + __u8 bulk_in_endpointAddr; /* the address of the bulk in endpoint */ + + unsigned char * bulk_out_buffer; /* the buffer to send data */ + int bulk_out_size; /* the size of the send buffer */ + struct urb * write_urb; /* the urb used to send data */ + struct urb * read_urb; + __u8 bulk_out_endpointAddr; /* the address of the bulk out endpoint */ + + struct tq_struct tqueue; /* task queue for line discipline waking up */ + int open_count; /* number of times this port has been opened */ + struct semaphore sem; /* locks this structure */ + + + u32 kevent_flags; + struct tq_struct kevent; + + struct tasklet_struct tasklet; + struct urb *rx_urb; /* tmp urb pointer for rx_tasklet */ + + unsigned char *ctrl_buffer; + struct urb *ctrl_urb; + + u8 op_mode; + + /* the WEP stuff */ + int wep_excl_unencr; /* 1 if unencrypted packets shall be discarded */ + int wep_enabled; /* 1 if WEP is enabled */ + int wep_key_id; /* key id to be used */ + u8 wep_keys[NR_WEP_KEYS][WEP_KEY_SIZE]; /* the four WEP keys, + 5 or 13 bytes are used */ + u8 wep_keys_len[NR_WEP_KEYS]; /* the length of the above keys */ + + int channel; + int iw_mode; + int curr_ap; + u8 bssid[ETH_ALEN]; + u8 essid[IW_ESSID_MAX_SIZE]; + int essid_size; + int radio_on; + int promisc; + + int preamble_type; /* 0 - long preamble, 1 - short preamble */ + int txrate; /* 0,1,2,3 = 1,2,5.5,11 MBit, 4 is auto-fallback */ + int frag_threshold; /* threshold for fragmentation of tx packets */ + int rts_threshold; /* threshold for RTS mechanism */ + + struct bss_info bss[NR_BSS_INFO]; /* the list we got from scanning */ + int bss_nr; /* how many valid entries in bss[] (from 0)? */ + + /* some data for infrastructure mode only */ + spinlock_t mgmt_spinlock; /* this spinlock protects access to + next_mgmt_bulk and istate */ + struct at76c503_tx_buffer *next_mgmt_bulk; /* pending management msg to + send via bulk out */ + enum infra_state istate; + int curr_bss; /* if istate == AUTH, ASSOC, REASSOC, JOIN or CONN + dev->bss[curr_bss] is the currently selected BSS + we operate on */ + int new_bss; /* if istate == REASSOC dev->bss[new_bss] is the new bss + we want to reassoc to */ + struct timer_list mgmt_timer; /* the timer we use to repeat auth_req etc. */ + int retries; /* counts backwards while re-trying to send auth/assoc_req's */ + u16 assoc_id; /* the assoc_id for states JOINING, REASSOCIATING, CONNECTED */ + + /* provide hooks for non-rfmd */ + union{ + struct hwcfg_rfmd rfmd; + struct hwcfg_r505 r505; + struct hwcfg_other other; + }hwcfg; + + struct at76c503_card_config card_config; + struct mib_fw_version fw_version; +}; + +static DECLARE_WAIT_QUEUE_HEAD(wait_queue); + +/* local function prototypes */ + +static void * at76c503_probe(struct usb_device *dev, unsigned int ifnum, + const struct usb_device_id *id); +static void at76c503_disconnect(struct usb_device *dev, void *ptr); +static void at76c503_write_bulk_callback(struct urb *urb); +static void defer_kevent (struct at76c503 *dev, int flag); +static int find_matching_bss(struct at76c503 *dev, int start); +static int auth_req(struct at76c503 *dev, int idx); +static int disassoc_req(struct at76c503 *dev, int idx); +static int assoc_req(struct at76c503 *dev, int idx); +static int reassoc_req(struct at76c503 *dev, int curr, int new); +static void dump_bss_table(struct at76c503 *dev); + +/* usb specific object needed to register this driver with the usb subsystem */ +static struct usb_driver at76c503_driver = { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) + owner: THIS_MODULE, +#endif + name: "at76c503", + probe: at76c503_probe, + disconnect: at76c503_disconnect, + id_table: at76c503_table, +}; + +/* hexdump len many bytes from buf into obuf, separated by delim, + add a trailing \0 into obuf */ +static char *hex2str(char *obuf, u8 *buf, int len, char delim) +{ +#define BIN2HEX(x) ((x) < 10 ? '0'+(x) : (x)+'A'-10) + + char *ret = obuf; + while (len--) { + *obuf++ = BIN2HEX(*buf>>4); + *obuf++ = BIN2HEX(*buf&0xf); + if (delim != '\0') + *obuf++ = delim; + buf++; + } + if (delim != '\0' && obuf > ret) + obuf--; // remove last inserted delimiter + *obuf = '\0'; + + return ret; +} + +static inline char *mac2str(u8 *mac) +{ + static char str [6*3]; + + sprintf(str, "%02x:%02x:%02x:%02x:%02x:%02x", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + return str; +} + +static inline void usb_debug_data (const char *function, const unsigned char *data, int size) +{ + int i; + + if (!debug) + return; + + printk (KERN_DEBUG __FILE__": %s - length = %d, data = ", + function, size); + for (i = 0; i < size; ++i) { + if((i % 8) == 0) + printk ("\n"); + printk ("%.2x ", data[i]); + } + printk ("\n"); +} + +static inline +int remap(struct usb_device *udev) +{ + return usb_control_msg(udev, usb_sndctrlpipe(udev,0), + 0x0a, INTERFACE_VENDOR_REQUEST_OUT, + 0, 0, + NULL, 0, HZ); +} + +static inline +int get_op_mode(struct at76c503 *dev) +{ + int ret; + ret = usb_control_msg(dev->udev, usb_rcvctrlpipe(dev->udev,0), + 0x33, INTERFACE_VENDOR_REQUEST_IN, + 0x01, 0, + &dev->op_mode, 1, HZ); + if(ret < 0) + return ret; + return dev->op_mode; +} + +/* this loads a block of the second part of the firmware */ +static inline +int load_ext_fw_block(struct usb_device *udev, + int i, unsigned char *buf, int bsize) +{ + return usb_control_msg(udev, usb_sndctrlpipe(udev,0), + 0x0e, DEVICE_VENDOR_REQUEST_OUT, + 0x0802, i, + buf, bsize, HZ); +} + +static inline +int get_hw_cfg(struct usb_device *udev, + unsigned char *buf, int buf_size) +{ + return usb_control_msg(udev, usb_rcvctrlpipe(udev,0), + 0x33, INTERFACE_VENDOR_REQUEST_IN, + ((0x0a << 8) | 0x02), 0, + buf, buf_size, HZ); +} + +static inline +int get_mib(struct usb_device *udev, + u16 mib, u8 *buf, int buf_size) +{ + return usb_control_msg(udev, usb_rcvctrlpipe(udev,0), + 0x33, INTERFACE_VENDOR_REQUEST_IN, + mib << 8, 0, + buf, buf_size, HZ); +} + +static inline +int get_cmd_status(struct usb_device *udev, + u8 cmd, u8 *cmd_status) +{ + return usb_control_msg(udev, usb_rcvctrlpipe(udev,0), + 0x22, INTERFACE_VENDOR_REQUEST_IN, + cmd, 0, + cmd_status, 40, HZ); +} + +#define EXT_FW_BLOCK_SIZE 1024 +static int +download_external_fw(struct usb_device *udev, u8 *buf, int size) +{ + int i = 0, ret = 0; + u8 *block; + + if(size < 0) return -EINVAL; + if((size > 0) && (buf == NULL)) return -EFAULT; + + block = kmalloc(EXT_FW_BLOCK_SIZE, GFP_KERNEL); + if(block == NULL) return -ENOMEM; + + info("downloading external firmware"); + + while(size > 0){ + int bsize = size > EXT_FW_BLOCK_SIZE ? EXT_FW_BLOCK_SIZE : size; + + memcpy(block, buf, bsize); + dbg("ext fw, size left = %5d, bsize = %4d, i = %2d", size, bsize, i); + if((ret = load_ext_fw_block(udev, i, block, bsize)) < 0){ + err("load_ext_fw_block failed: %d, i = %d", ret, i); + goto exit; + } + buf += bsize; + size -= bsize; + i++; + } + + /* for fw >= 0.100, the device needs + an extra empty block: */ + if((ret = load_ext_fw_block(udev, i, block, 0)) < 0){ + err("load_ext_fw_block failed: %d, i = %d", ret, i); + goto exit; + } + + exit: + kfree(block); + return ret; +} + +static +int set_card_command(struct usb_device *udev, int cmd, + unsigned char *buf, int buf_size) +{ + int ret; + struct at76c503_command *cmd_buf = + (struct at76c503_command *)kmalloc( + sizeof(struct at76c503_command) + buf_size, + GFP_KERNEL); + + if(cmd_buf){ + cmd_buf->cmd = cmd; + cmd_buf->reserved = 0; + cmd_buf->size = cpu_to_le16(buf_size); + if(buf_size > 0) + memcpy(&(cmd_buf[1]), buf, buf_size); + ret = usb_control_msg(udev, usb_sndctrlpipe(udev,0), + 0x0e, DEVICE_VENDOR_REQUEST_OUT, + 0, 0, + cmd_buf, + sizeof(struct at76c503_command) + buf_size, + HZ); + kfree(cmd_buf); + return ret; + } + + return -ENOMEM; +} + +/* TODO: should timeout */ +int wait_completion(struct at76c503 *dev, int cmd) +{ + u8 *cmd_status = kmalloc(40, GFP_KERNEL); + struct net_device *netdev = dev->netdev; + int ret = 0; + + do{ + ret = get_cmd_status(dev->udev, cmd, cmd_status); + if(ret < 0){ + err("%s: get_cmd_status failed: %d", netdev->name, ret); + break; + } +#if 0 + info("cmd %d,cmd_status[5] = %d", cmd,cmd_status[5]); +#endif + + if(cmd_status[5] == CMD_STATUS_IN_PROGRESS || + cmd_status[5] == CMD_STATUS_IDLE){ + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ/10); // 100 ms + }else break; + }while(1); + if (ret >= 0) + /* if get_cmd_status did not fail, return the status + retrieved */ + ret = cmd_status[5]; + kfree(cmd_status); + return ret; +} + +static inline +int set_mib(struct usb_device *udev, struct set_mib_buffer *buf) +{ + int ret; + struct at76c503_command *cmd_buf = + (struct at76c503_command *)kmalloc( + sizeof(struct at76c503_command) + buf->size + 4, + GFP_KERNEL); + + if(cmd_buf){ + cmd_buf->cmd = CMD_SET_MIB; + cmd_buf->reserved = 0; + cmd_buf->size = cpu_to_le16(buf->size + 4); + memcpy(&(cmd_buf[1]), buf, buf->size + 4); + ret = usb_control_msg(udev, usb_sndctrlpipe(udev,0), + 0x0e, DEVICE_VENDOR_REQUEST_OUT, + 0, 0, + cmd_buf, + sizeof(struct at76c503_command) + buf->size + 4, + HZ); + kfree(cmd_buf); + return ret; + } + + return -ENOMEM; +} + +static +int set_radio(struct at76c503 *dev, int on_off) +{ + int ret = 0; + + if(dev->radio_on != on_off){ + ret = set_card_command(dev->udev, CMD_RADIO, NULL, 0); + if(ret < 0){ + err("%s: set_card_command(CMD_RADIO) failed: %d", dev->netdev->name, ret); + } + dev->radio_on = on_off; + } + return ret; +} + + +static +int set_preamble(struct at76c503 *dev, u8 type) +{ + int ret = 0; + struct set_mib_buffer mib_buf; + + memset(&mib_buf, 0, sizeof(struct set_mib_buffer)); + mib_buf.type = MIB_LOCAL; + mib_buf.size = 1; + mib_buf.index = PREAMBLE_TYPE_OFFSET; + mib_buf.data[0] = type; + ret = set_mib(dev->udev, &mib_buf); + if(ret < 0){ + err("%s: set_mib (preamble) failed: %d", dev->netdev->name, ret); + } + return ret; +} + +static +int set_frag(struct at76c503 *dev, u16 size) +{ + int ret = 0; + struct set_mib_buffer mib_buf; + + memset(&mib_buf, 0, sizeof(struct set_mib_buffer)); + mib_buf.type = MIB_MAC; + mib_buf.size = 2; + mib_buf.index = FRAGMENTATION_OFFSET; + *(u16*)mib_buf.data = cpu_to_le16(size); + ret = set_mib(dev->udev, &mib_buf); + if(ret < 0){ + err("%s: set_mib (frag threshold) failed: %d", dev->netdev->name, ret); + } + return ret; +} + +static +int set_rts(struct at76c503 *dev, u16 size) +{ + int ret = 0; + struct set_mib_buffer mib_buf; + + memset(&mib_buf, 0, sizeof(struct set_mib_buffer)); + mib_buf.type = MIB_MAC; + mib_buf.size = 2; + mib_buf.index = RTS_OFFSET; + *(u16*)mib_buf.data = cpu_to_le16(size); + ret = set_mib(dev->udev, &mib_buf); + if(ret < 0){ + err("%s: set_mib (rts) failed: %d", dev->netdev->name, ret); + } + return ret; +} + +static +int set_autorate_fallback(struct at76c503 *dev, int onoff) +{ + int ret = 0; + struct set_mib_buffer mib_buf; + + memset(&mib_buf, 0, sizeof(struct set_mib_buffer)); + mib_buf.type = MIB_LOCAL; + mib_buf.size = 1; + mib_buf.index = TX_AUTORATE_FALLBACK_OFFSET; + mib_buf.data[0] = onoff; + ret = set_mib(dev->udev, &mib_buf); + if(ret < 0){ + err("%s: set_mib (autorate fallback) failed: %d", dev->netdev->name, ret); + } + return ret; +} + +static int set_mac_address(struct at76c503 *dev, void *addr) +{ + struct set_mib_buffer mib_buf; + int ret = 0; + + memset(&mib_buf, 0, sizeof(struct set_mib_buffer)); + mib_buf.type = MIB_MAC_ADD; + mib_buf.size = ETH_ALEN; + mib_buf.index = offsetof(struct mib_mac_addr, mac_addr); + memcpy(mib_buf.data, addr, ETH_ALEN); + ret = set_mib(dev->udev, &mib_buf); + if(ret < 0){ + err("%s: set_mib (MAC_ADDR, mac_addr) failed: %d", + dev->netdev->name, ret); + } + return ret; +} + +#if 0 +/* implemented to get promisc. mode working, but does not help. + May still be useful for multicast eventually. */ +static int set_group_address(struct at76c503 *dev, u8 *addr, int n) +{ + struct set_mib_buffer mib_buf; + int ret = 0; + + memset(&mib_buf, 0, sizeof(struct set_mib_buffer)); + mib_buf.type = MIB_MAC_ADD; + mib_buf.size = ETH_ALEN; + mib_buf.index = offsetof(struct mib_mac_addr, group_addr) + n*ETH_ALEN; + memcpy(mib_buf.data, addr, ETH_ALEN); + ret = set_mib(dev->udev, &mib_buf); + if(ret < 0){ + err("%s: set_mib (MIB_MAC_ADD, group_addr) failed: %d", + dev->netdev->name, ret); + } + +#if 1 + /* I do not know anything about the group_addr_status field... (oku)*/ + wait_completion(dev, CMD_SET_MIB); + + memset(&mib_buf, 0, sizeof(struct set_mib_buffer)); + mib_buf.type = MIB_MAC_ADD; + mib_buf.size = 1; + mib_buf.index = offsetof(struct mib_mac_addr, group_addr_status) + n; + mib_buf.data[0] = 1; + ret = set_mib(dev->udev, &mib_buf); + if(ret < 0){ + err("%s: set_mib (MIB_MAC_ADD, group_addr_status) failed: %d", + dev->netdev->name, ret); + } +#endif + return ret; +} +#endif + +static +int set_promisc(struct at76c503 *dev, int onoff) +{ + int ret = 0; + struct set_mib_buffer mib_buf; + + memset(&mib_buf, 0, sizeof(struct set_mib_buffer)); + mib_buf.type = MIB_LOCAL; + mib_buf.size = 1; + mib_buf.index = offsetof(struct mib_local, promiscuous_mode); + mib_buf.data[0] = onoff ? 1 : 0; + ret = set_mib(dev->udev, &mib_buf); + if(ret < 0){ + err("%s: set_mib (promiscous_mode) failed: %d", dev->netdev->name, ret); + } + return ret; +} + +static +int get_current_bssid(struct at76c503 *dev) +{ + int ret = 0; + struct mib_mac_mgmt *mac_mgmt = + kmalloc(sizeof(struct mib_mac_mgmt), GFP_KERNEL); + + if(!mac_mgmt){ + ret = -ENOMEM; + goto exit; + } + + ret = get_mib(dev->udev, MIB_MAC_MGMT, + (u8*)mac_mgmt, sizeof(struct mib_mac_mgmt)); + if(ret < 0){ + err("%s: get_mib failed: %d", dev->netdev->name, ret); + goto err; + } + memcpy(dev->bssid, mac_mgmt->current_bssid, ETH_ALEN); + info("using BSSID %s", mac2str(dev->bssid)); + err: + kfree(mac_mgmt); + exit: + return ret; +} + +static +int get_current_channel(struct at76c503 *dev) +{ + int ret = 0; + struct mib_phy *phy = + kmalloc(sizeof(struct mib_phy), GFP_KERNEL); + + if(!phy){ + ret = -ENOMEM; + goto exit; + } + ret = get_mib(dev->udev, MIB_PHY, (u8*)phy, + sizeof(struct mib_phy)); + if(ret < 0){ + err("%s: get_mib(MIB_PHY) failed: %d", dev->netdev->name, ret); + goto err; + } + dev->channel = phy->channel_id; + err: + kfree(phy); + exit: + return ret; +} + +static +int start_scan(struct at76c503 *dev) +{ + struct at76c503_start_scan scan; + + dev->bss_nr = 0; /* empty the table dev->bss[] */ + dev->curr_bss = dev->new_bss = -1; + + memset(&scan, 0, sizeof(struct at76c503_start_scan)); + memset(scan.bssid, 0xff, ETH_ALEN); + //jal: we scan for all SSID and choose the right one later + // to see our env etc. + //memcpy(scan.essid, dev->essid, IW_ESSID_MAX_SIZE); + scan.essid_size = 0; + scan.probe_delay = 10000; + //jal: why should we start at a certain channel? we do scan the whole range + //allowed by reg domain. + scan.channel = dev->channel; + + /* atmelwlandriver differs between scan type 0 and 1. + For ad-hoc mode, it uses type 0 only.*/ + + scan.min_channel_time = 10; + scan.max_channel_time = 120; + /* other values are set to 0 for type 0 */ + + return set_card_command(dev->udev, CMD_SCAN, + (unsigned char*)&scan, sizeof(scan)); +} + +static +int start_ibss(struct at76c503 *dev) +{ + struct at76c503_start_bss bss; + + memset(&bss, 0, sizeof(struct at76c503_start_bss)); + memset(bss.bssid, 0xff, ETH_ALEN); + memcpy(bss.essid, dev->essid, IW_ESSID_MAX_SIZE); + bss.essid_size = dev->essid_size; + bss.bss_type = ADHOC_MODE; + bss.channel = dev->channel; + + return set_card_command(dev->udev, CMD_START_IBSS, + (unsigned char*)&bss, sizeof(struct at76c503_start_bss)); +} + +/* idx points into dev->bss */ +static +int join_bss(struct at76c503 *dev, int idx) +{ + struct at76c503_join join; + struct bss_info *ptr; + + assert(idx < dev->bss_nr); + ptr = dev->bss+idx; + + memset(&join, 0, sizeof(struct at76c503_join)); + memcpy(join.bssid, ptr->bssid, ETH_ALEN); + memcpy(join.essid, ptr->ssid, ptr->ssid_len); + join.essid_size = ptr->ssid_len; + join.bss_type = (dev->iw_mode == IW_MODE_ADHOC ? 1 : 2); + join.channel = ptr->channel; + join.timeout = 2000; + + dbg("%s join addr %s ssid %d:%s type %d ch %d timeout %d", + dev->netdev->name, mac2str(join.bssid), + join.essid_size, join.essid, + join.bss_type, join.channel, join.timeout); + return set_card_command(dev->udev, CMD_JOIN, + (unsigned char*)&join, + sizeof(struct at76c503_join)); +} /* join_bss */ + +/* we got a timeout for a infrastructure mgmt packet */ +void mgmt_timeout(unsigned long par) +{ + struct at76c503 *dev = (struct at76c503 *)par; + defer_kevent(dev, KEVENT_MGMT_TIMEOUT); +} + +/* the deferred procedure called from kevent() */ +void handle_mgmt_timeout(struct at76c503 *dev) +{ + + dbg("%s: timeout, state %d", dev->netdev->name, dev->istate); + + switch(dev->istate) { + + case SCANNING: /* we use the mgmt_timer to delay the next scan for some time */ + defer_kevent(dev, KEVENT_SCANJOIN); + break; + + case JOINING: + assert(0); + break; + + case CONNECTED: /* we haven't received the beacon of this BSS for + BEACON_TIMEOUT seconds */ + info("%s: lost beacon bssid %s", + dev->netdev->name, mac2str(dev->bss[dev->curr_bss].bssid)); + netif_carrier_off(dev->netdev); /* disable running netdev watchdog */ + netif_stop_queue(dev->netdev); /* stop tx data packets */ + NEW_STATE(dev,SCANNING); + defer_kevent(dev,KEVENT_SCANJOIN); + break; + + case AUTHENTICATING: + if (dev->retries-- >= 0) { + auth_req(dev,dev->curr_bss); + mod_timer(&dev->mgmt_timer, jiffies+HZ); + } else { + /* try to get next matching BSS */ + dev->curr_bss = find_matching_bss(dev,dev->curr_bss+1); + if (dev->curr_bss >= 0) { + NEW_STATE(dev,JOINING); + } else { + NEW_STATE(dev,SCANNING); + } + defer_kevent(dev,KEVENT_SCANJOIN); + } + break; + + case ASSOCIATING: + if (dev->retries-- >= 0) { + assoc_req(dev,dev->curr_bss); + mod_timer(&dev->mgmt_timer, jiffies+HZ); + } else { + /* jal: TODO: we may be authenticated to several + BSS and may try to associate to the next of them here + in the future ... */ + + /* try to get next matching BSS */ + dev->curr_bss = find_matching_bss(dev,dev->curr_bss+1); + if (dev->curr_bss >= 0) { + NEW_STATE(dev,JOINING); + } else { + NEW_STATE(dev,SCANNING); + } + defer_kevent(dev,KEVENT_SCANJOIN); + } + break; + + case REASSOCIATING: + if (dev->retries-- >= 0) + reassoc_req(dev, dev->curr_bss, dev->new_bss); + else { + /* we disassociate from the curr_bss and + scan again ... */ + NEW_STATE(dev,DISASSOCIATING); + dev->retries = DISASSOC_RETRIES; + disassoc_req(dev, dev->curr_bss); + } + mod_timer(&dev->mgmt_timer, jiffies+HZ); + break; + + case DISASSOCIATING: + if (dev->retries-- >= 0) { + disassoc_req(dev, dev->curr_bss); + mod_timer(&dev->mgmt_timer,jiffies+HZ); + } else { + /* we scan again ... */ + NEW_STATE(dev,SCANNING); + defer_kevent(dev,KEVENT_SCANJOIN); + } + break; + + case INIT: + assert(0); + break; + + default: + assert(0); + } /* switch (dev->istate) */ + +}/* handle_mgmt_timeout */ + +/* calc. the padding from txbuf->wlength (which excludes the USB TX header) */ +static inline +int calc_padding(int wlen) +{ + wlen += offsetof(struct at76c503_tx_buffer,packet); /* add the USB TX header */ + + wlen = wlen % 64; + + if (wlen < 50) + return 50 - wlen; + + if (wlen >=61) + return 114 - wlen; + + return 0; +} + +/* send a management frame on bulk-out */ +static +int send_mgmt_bulk(struct at76c503 *dev, struct at76c503_tx_buffer *txbuf) +{ + unsigned long flags; + char obuf[3*64+1] __attribute__ ((unused)); + int ret = 0; + int urb_status; + void *oldbuf = NULL; + + netif_carrier_off(dev->netdev); /* disable running netdev watchdog */ + netif_stop_queue(dev->netdev); /* stop tx data packets */ + + spin_lock_irqsave(&dev->mgmt_spinlock, flags); + + if ((urb_status=dev->write_urb->status) == USB_ST_URB_PENDING) { + oldbuf=dev->next_mgmt_bulk; /* to kfree below */ + dev->next_mgmt_bulk = txbuf; + txbuf = NULL; + } + spin_unlock_irqrestore(&dev->mgmt_spinlock, flags); + + if (oldbuf) { + /* a data/mgmt tx is already pending in the URB - + if this is no error in some situations we must + implement a queue or silently modify the old msg */ + err("%s:" __FUNCTION__ " removed pending mgmt buffer " + "%s", + dev->netdev->name, + hex2str(obuf, (u8 *)dev->next_mgmt_bulk, 64,' ')); + kfree(dev->next_mgmt_bulk); + } + + if (txbuf) { + + txbuf->tx_rate = 0; + txbuf->padding = 0; +// txbuf->padding = +// cpu_to_le16(calc_padding(le16_to_cpu(txbuf->wlength))); + if (dev->next_mgmt_bulk) { + err("%s:" __FUNCTION__ " URB status %d, " + "but mgmt is pending", + dev->netdev->name, urb_status); + } +#if 0 + dbg("%s: tx mgmt: wlen %d tx_rate %d pad %d %s", + dev->netdev->name, le16_to_cpu(txbuf->wlength), + txbuf->tx_rate, txbuf->padding, + hex2str(obuf,txbuf->packet, + min((sizeof(obuf)-1)/2, + (size_t)le16_to_cpu(txbuf->wlength)),'\0')); +#endif + /* txbuf was not consumed above -> send mgmt msg immediately */ + memcpy(dev->bulk_out_buffer, txbuf, + le16_to_cpu(txbuf->wlength) + + offsetof(struct at76c503_tx_buffer,packet)); + FILL_BULK_URB(dev->write_urb, dev->udev, + usb_sndbulkpipe(dev->udev, + dev->bulk_out_endpointAddr), + dev->bulk_out_buffer, + le16_to_cpu(txbuf->wlength) + + le16_to_cpu(txbuf->padding) + + offsetof(struct at76c503_tx_buffer,packet), + at76c503_write_bulk_callback, dev); + ret = usb_submit_urb(dev->write_urb); + if (ret) { + err("%s:" __FUNCTION__ " error in tx submit urb: %d", + dev->netdev->name, ret); + } + kfree(txbuf); + } /* if (txbuf) */ + + return ret; + +} /* send_mgmt_bulk */ + +static +int disassoc_req(struct at76c503 *dev, int idx) +{ + struct at76c503_tx_buffer *tx_buffer; + struct ieee802_11_mgmt *mgmt; + struct ieee802_11_disassoc_frame *req; + struct bss_info *bss = dev->bss+idx; + + assert(idx >= 0 && idx < dev->bss_nr); + + tx_buffer = kmalloc(DISASSOC_FRAME_SIZE, GFP_ATOMIC); + if (!tx_buffer) + return -ENOMEM; + + mgmt = (struct ieee802_11_mgmt *)&(tx_buffer->packet); + req = (struct ieee802_11_disassoc_frame *)&(mgmt->data); + + /* make wireless header */ + /* no need to care about endianness of constants - is taken care + of in ieee802_11.h */ + mgmt->frame_ctl = IEEE802_11_FTYPE_MGMT|IEEE802_11_STYPE_AUTH; + if (dev->wep_enabled) + mgmt->frame_ctl |= IEEE802_11_FCTL_WEP; + mgmt->duration_id = cpu_to_le16(0x8000); + memcpy(mgmt->addr1, bss->bssid, ETH_ALEN); + memcpy(mgmt->addr2, dev->netdev->dev_addr, ETH_ALEN); + memcpy(mgmt->addr3, bss->bssid, ETH_ALEN); + mgmt->seq_ctl = 0; + + req->reason = 0; + + /* init. at76c503 tx header */ + tx_buffer->wlength = cpu_to_le16(DISASSOC_FRAME_SIZE - + offsetof(struct at76c503_tx_buffer, packet)); + + dbg("%s: DisAssocReq bssid %s", + dev->netdev->name, mac2str(mgmt->addr3)); + + /* either send immediately (if no data tx is pending + or put it in pending list */ + return send_mgmt_bulk(dev, tx_buffer); + +} /* disassoc_req */ + +static +int auth_req(struct at76c503 *dev, int idx) +{ + struct at76c503_tx_buffer *tx_buffer; + struct ieee802_11_mgmt *mgmt; + struct ieee802_11_auth_frame *req; + struct bss_info *bss = dev->bss+idx; + + assert(idx >= 0 && idx < dev->bss_nr); + + tx_buffer = kmalloc(AUTH_FRAME_SIZE+MAX_PADDING_SIZE, GFP_ATOMIC); + if (!tx_buffer) + return -ENOMEM; + + mgmt = (struct ieee802_11_mgmt *)&(tx_buffer->packet); + req = (struct ieee802_11_auth_frame *)&(mgmt->data); + + /* make wireless header */ + /* no need to care about endianness of constants - is taken care + of in ieee802_11.h */ + /* first auth msg is not encrypted */ + mgmt->frame_ctl = IEEE802_11_FTYPE_MGMT|IEEE802_11_STYPE_AUTH; + mgmt->duration_id = cpu_to_le16(0x8000); + memcpy(mgmt->addr1, bss->bssid, ETH_ALEN); + memcpy(mgmt->addr2, dev->netdev->dev_addr, ETH_ALEN); + memcpy(mgmt->addr3, bss->bssid, ETH_ALEN); + mgmt->seq_ctl = 0; + + req->algorithm = IEEE802_11_AUTH_ALG_OPEN_SYSTEM; + req->seq_nr = cpu_to_le16(1); + req->status = 0; + + /* init. at76c503 tx header */ + tx_buffer->wlength = cpu_to_le16(AUTH_FRAME_SIZE - + offsetof(struct at76c503_tx_buffer, packet)); + + dbg("%s: AuthReq bssid %s algorithm %d trans_seq %d", + dev->netdev->name, mac2str(mgmt->addr3), + req->algorithm, req->seq_nr); + + /* either send immediately (if no data tx is pending + or put it in pending list */ + return send_mgmt_bulk(dev, tx_buffer); + +} /* auth_req */ + +static +int assoc_req(struct at76c503 *dev, int idx) +{ + struct at76c503_tx_buffer *tx_buffer; + struct ieee802_11_mgmt *mgmt; + struct ieee802_11_assoc_req *req; + struct bss_info *bss = dev->bss+idx; + u8 *tlv; + + assert(idx >= 0 && idx < dev->bss_nr); + + tx_buffer = kmalloc(ASSOCREQ_MAX_SIZE, GFP_ATOMIC); + if (!tx_buffer) + return -ENOMEM; + + mgmt = (struct ieee802_11_mgmt *)&(tx_buffer->packet); + req = (struct ieee802_11_assoc_req *)&(mgmt->data); + tlv = req->data; + + /* make wireless header */ + /* no need to care about endianness of constants - is taken care + of in ieee802_11.h */ + mgmt->frame_ctl = IEEE802_11_FTYPE_MGMT|IEEE802_11_STYPE_ASSOC_REQ; + if (dev->wep_enabled) + mgmt->frame_ctl |= IEEE802_11_FCTL_WEP; + + mgmt->duration_id = cpu_to_le16(0x8000); + memcpy(mgmt->addr1, bss->bssid, ETH_ALEN); + memcpy(mgmt->addr2, dev->netdev->dev_addr, ETH_ALEN); + memcpy(mgmt->addr3, bss->bssid, ETH_ALEN); + mgmt->seq_ctl = 0; + + req->capability = bss->capa; + + /* we must set the Privacy bit in the capabilites to assure an + Agere-based AP with optional WEP transmits encrypted frames + to us. AP only set the Privacy bit in their capabilities + if WEP is mandatory in the BSS! */ + if (dev->wep_enabled) + req->capability |= IEEE802_11_CAPA_PRIVACY; + if (dev->preamble_type == PREAMBLE_TYPE_SHORT) + req->capability |= IEEE802_11_CAPA_SHORT_PREAMBLE; + + req->listen_interval = cpu_to_le16(2 * bss->beacon_interval); + + /* write TLV data elements */ + + *tlv++ = IE_ID_SSID; + *tlv++ = bss->ssid_len; + memcpy(tlv,bss->ssid, bss->ssid_len); + tlv += bss->ssid_len; + + *tlv++ = IE_ID_SUPPORTED_RATES; + *tlv++ = sizeof(hw_rates); + memcpy(tlv, hw_rates, sizeof(hw_rates)); + tlv += sizeof(hw_rates); /* tlv points behind the supp_rates field */ + + /* init. at76c503 tx header */ + tx_buffer->wlength = cpu_to_le16(tlv-(u8 *)mgmt); + + { + /* output buffer for ssid and rates */ + char ossid[IW_ESSID_MAX_SIZE+1] __attribute__ ((unused)); + char orates[4*2+1] __attribute__ ((unused)); + int len; + + tlv = req->data; + len = min(sizeof(ossid)-1,(size_t)*(tlv+1)); + memcpy(ossid, tlv+2, len); + ossid[len] = '\0'; + tlv += (1 + 1 + *(tlv+1)); /* points to IE of rates now */ + dbg("%s: AssocReq bssid %s capa x%04x ssid %s rates %s", + dev->netdev->name, mac2str(mgmt->addr3), + req->capability, ossid, + hex2str(orates,tlv+2,min((sizeof(orates)-1)/2,(size_t)*(tlv+1)), + '\0')); + } + + /* either send immediately (if no data tx is pending + or put it in pending list */ + return send_mgmt_bulk(dev, tx_buffer); + +} /* assoc_req */ + +/* we are currently associated to dev->bss[curr] and + want to reassoc to dev->bss[idx] */ +static +int reassoc_req(struct at76c503 *dev, int curr, int idx) +{ + struct at76c503_tx_buffer *tx_buffer; + struct ieee802_11_mgmt *mgmt; + struct ieee802_11_reassoc_req *req; + struct bss_info *bss = dev->bss+idx; + u8 *tlv; + + assert(curr >= 0 && curr < dev->bss_nr); + assert(idx >= 0 && idx < dev->bss_nr); + + tx_buffer = kmalloc(REASSOCREQ_MAX_SIZE, GFP_ATOMIC); + if (!tx_buffer) + return -ENOMEM; + + mgmt = (struct ieee802_11_mgmt *)&(tx_buffer->packet); + req = (struct ieee802_11_reassoc_req *)&(mgmt->data); + tlv = req->data; + + /* make wireless header */ + /* no need to care about endianness of constants - is taken care + of in ieee802_11.h */ + /* jal: encrypt this packet if wep_enabled is TRUE ??? */ + mgmt->frame_ctl = IEEE802_11_FTYPE_MGMT|IEEE802_11_STYPE_REASSOC_REQ; + if (dev->wep_enabled) + mgmt->frame_ctl |= IEEE802_11_FCTL_WEP; + mgmt->duration_id = cpu_to_le16(0x8000); + memcpy(mgmt->addr1, bss->bssid, ETH_ALEN); + memcpy(mgmt->addr2, dev->netdev->dev_addr, ETH_ALEN); + memcpy(mgmt->addr3, bss->bssid, ETH_ALEN); + mgmt->seq_ctl = 0; + + req->capability = bss->capa; + + /* we must set the Privacy bit in the capabilites to assure an + Agere-based AP with optional WEP transmits encrypted frames + to us. AP only set the Privacy bit in their capabilities + if WEP is mandatory in the BSS! */ + if (dev->wep_enabled) + req->capability |= IEEE802_11_CAPA_PRIVACY; + if (dev->preamble_type == PREAMBLE_TYPE_SHORT) + req->capability |= IEEE802_11_CAPA_SHORT_PREAMBLE; + + req->listen_interval = cpu_to_le16(2 * bss->beacon_interval); + + memcpy(req->curr_ap, dev->bss[curr].bssid, ETH_ALEN); + + /* write TLV data elements */ + + *tlv++ = IE_ID_SSID; + *tlv++ = bss->ssid_len; + memcpy(tlv,bss->ssid, bss->ssid_len); + tlv += bss->ssid_len; + + *tlv++ = IE_ID_SUPPORTED_RATES; + *tlv++ = sizeof(hw_rates); + memcpy(tlv, hw_rates, sizeof(hw_rates)); + tlv += sizeof(hw_rates); /* tlv points behind the supp_rates field */ + + /* init. at76c503 tx header */ + tx_buffer->wlength = cpu_to_le16(tlv-(u8 *)mgmt); + + { + /* output buffer for ssid and rates */ + char ossid[IW_ESSID_MAX_SIZE+1] __attribute__ ((unused)); + char orates[4*2+1] __attribute__ ((unused)); + char ocurr[6*3+1] __attribute__ ((unused)); + tlv = req->data; + memcpy(ossid, tlv+2, min(sizeof(ossid),(size_t)*(tlv+1))); + ossid[sizeof(ossid)-1] = '\0'; + tlv += (1 + 1 + *(tlv+1)); /* points to IE of rates now */ + dbg("%s: ReAssocReq curr %s new %s capa x%04x ssid %s rates %s", + dev->netdev->name, + hex2str(ocurr, req->curr_ap, ETH_ALEN, ':'), + mac2str(mgmt->addr3), req->capability, ossid, + hex2str(orates,tlv+2,min((sizeof(orates)-1)/2,(size_t)*(tlv+1)), + '\0')); + } + + /* either send immediately (if no data tx is pending + or put it in pending list */ + return send_mgmt_bulk(dev, tx_buffer); + +} /* reassoc_req */ + + +/* shamelessly copied from usbnet.c (oku) */ +static void defer_kevent (struct at76c503 *dev, int flag) +{ + set_bit (flag, &dev->kevent_flags); + if (!schedule_task (&dev->kevent)) + err ("%s: kevent %d may have been dropped", + dev->netdev->name, flag); + else + dbg ("%s: kevent %d scheduled", dev->netdev->name, flag); +} + +static void +kevent(void *data) +{ + struct at76c503 *dev = data; + int ret; + + /* on errors, bits aren't cleared, but no reschedule + is done. So work will be done next time something + else has to be done. This is ugly. TODO! (oku) */ + + dbg("%s: kevent flags=x%x", dev->netdev->name, dev->kevent_flags); + + down(&dev->sem); + + if(test_bit(KEVENT_CTRL_HALT, &dev->kevent_flags)){ + /* this never worked... but it seems + that it's rarely necessary, if at all (oku) */ + ret = usb_clear_halt(dev->udev, + usb_sndctrlpipe (dev->udev, 0)); + if(ret < 0) + err("usb_clear_halt() failed: %d", ret); + else{ + clear_bit(KEVENT_CTRL_HALT, &dev->kevent_flags); + info("usb_clear_halt() succesful"); + } + } + if(test_bit(KEVENT_NEW_BSS, &dev->kevent_flags)){ + struct net_device *netdev = dev->netdev; + struct mib_mac_mgmt *mac_mgmt = kmalloc(sizeof(struct mib_mac_mgmt), GFP_KERNEL); + struct set_mib_buffer mib_buf; + + ret = get_mib(dev->udev, MIB_MAC_MGMT, (u8*)mac_mgmt, + sizeof(struct mib_mac_mgmt)); + if(ret < 0){ + err("%s: get_mib failed: %d", netdev->name, ret); + goto new_bss_clean; + } + // usb_debug_data(__FUNCTION__, (unsigned char *)mac_mgmt, sizeof(struct mib_mac_mgmt)); + + + dbg("ibss_change = 0x%2x", mac_mgmt->ibss_change); + memcpy(dev->bssid, mac_mgmt->current_bssid, ETH_ALEN); + info("using BSSID %s", mac2str(dev->bssid)); + + memset(&mib_buf, 0, sizeof(struct set_mib_buffer)); + mib_buf.type = MIB_MAC_MGMT; + mib_buf.size = 1; + mib_buf.index = IBSS_CHANGE_OK_OFFSET; + ret = set_mib(dev->udev, &mib_buf); + if(ret < 0){ + err("%s: set_mib (ibss change ok) failed: %d", netdev->name, ret); + goto new_bss_clean; + } + + wait_completion(dev, CMD_SET_MIB); + + clear_bit(KEVENT_NEW_BSS, &dev->kevent_flags); + new_bss_clean: + kfree(mac_mgmt); + } + if(test_bit(KEVENT_SET_PROMISC, &dev->kevent_flags)){ + info("%s: KEVENT_SET_PROMISC", dev->netdev->name); + + set_promisc(dev, dev->promisc); + wait_completion(dev, CMD_SET_MIB); + clear_bit(KEVENT_SET_PROMISC, &dev->kevent_flags); + } + + if(test_bit(KEVENT_MGMT_TIMEOUT, &dev->kevent_flags)){ + clear_bit(KEVENT_MGMT_TIMEOUT, &dev->kevent_flags); + handle_mgmt_timeout(dev); + } + + if (test_bit(KEVENT_SCANJOIN, &dev->kevent_flags)) { + clear_bit(KEVENT_SCANJOIN, &dev->kevent_flags); + if (dev->istate == SCANNING) { + if ((ret=start_scan(dev)) < 0) + err("%s: start_scan failed with %d", + dev->netdev->name, ret); + else { + if ((ret=wait_completion(dev,CMD_SCAN)) != + CMD_STATUS_COMPLETE) { + err("%s start_scan completed with %d", + dev->netdev->name, ret); + } + } + /* if start_scan failed above, the bss table is empty ... */ + dump_bss_table(dev); + if ((dev->curr_bss=find_matching_bss(dev,0)) >= 0) { + NEW_STATE(dev,JOINING); + /* call join_bss immediately after + re-schedule in kevent */ + defer_kevent(dev,KEVENT_SCANJOIN); + } else { + /* haven't found a matching BSS - + use timer to try again in 10 seconds */ + mod_timer(&dev->mgmt_timer,jiffies+RESCAN_TIME*HZ); + } + } else { + assert(dev->istate == JOINING); + assert(dev->curr_bss >= 0 && + dev->curr_bss < dev->bss_nr); + if ((ret=join_bss(dev,dev->curr_bss)) < 0) + err("%s: join_bss failed with %d", + dev->netdev->name, ret); + else { + ret=wait_completion(dev,CMD_JOIN); + if (ret != CMD_STATUS_COMPLETE) { + if (ret != CMD_STATUS_TIME_OUT) + err("%s join_bss completed with %d", + dev->netdev->name, ret); + else + info("%s join_bss timed out", + dev->netdev->name); + if ((dev->curr_bss= + find_matching_bss(dev,dev->curr_bss+1)) >= 0) { + /* try to join the next bss immediately */ + defer_kevent(dev,KEVENT_SCANJOIN); + } else { + /* scan again, after 10 seconds */ + NEW_STATE(dev,SCANNING); + mod_timer(&dev->mgmt_timer,jiffies+ + RESCAN_TIME*HZ); + } + } else { + /* send auth req */ + NEW_STATE(dev,AUTHENTICATING); + auth_req(dev,dev->curr_bss); + mod_timer(&dev->mgmt_timer, jiffies+HZ); + } + } + } + } /* if (test_bit(KEVENT_SCANJOIN, &dev->kevent_flags)) */ + + up(&dev->sem); + + return; +} + +static +int essid_matched(struct at76c503 *dev, struct bss_info *ptr) +{ + u8 zeros[32]; + + memset(zeros, 0, 32); + + if (dev->iw_mode != IW_MODE_ADHOC) { + if (ptr->ssid_len == 0) + return 1; /* bss cloaked its ssid */ + if (ptr->ssid_len == 1 && ptr->ssid == '\0') + return 1; /* Agere APs cloaking method */ + if (ptr->ssid_len == dev->essid_size && + !memcmp(ptr->ssid, zeros, ptr->ssid_len)) + return 1; /* Belkin AP cloaking method */ + } + + /* common criteria for both modi */ + return dev->essid_size == 0 || + (dev->essid_size == ptr->ssid_len && + !memcmp(dev->essid, ptr->ssid, ptr->ssid_len)); +} + +static inline +int mode_matched(struct at76c503 *dev, struct bss_info *ptr) +{ + if (dev->iw_mode == IW_MODE_ADHOC) + return ptr->capa & IEEE802_11_CAPA_IBSS; + else + return ptr->capa & IEEE802_11_CAPA_ESS; +} + +static +int rates_matched(struct at76c503 *dev, struct bss_info *ptr) +{ + int i; + u8 *rate; + + for(i=0,rate=ptr->rates; i < ptr->rates_len; i++,rate++) + if (*rate & 0x80) { + /* this is a basic rate we have to support + (see IEEE802.11, ch. 7.3.2.2) */ + if (*rate != hw_rates[0] && *rate != hw_rates[1] && + *rate != hw_rates[2] && *rate != hw_rates[3]) { + info("%s: bssid %s: basic rate %02x not supported", + dev->netdev->name, mac2str(ptr->bssid),*rate); + return 0; + } + } + return 1; +} + +static inline +int wep_matched(struct at76c503 *dev, struct bss_info *ptr) +{ + if (!dev->wep_enabled && + ptr->capa & IEEE802_11_CAPA_PRIVACY) + /* we have disabled WEP, but the BSS signals privacy */ + return 0; + /* otherwise if the BSS does not signal privacy it may well + except encrypted packets from us ... */ + return 1; +} + +static void dump_bss_table(struct at76c503 *dev) +{ + struct bss_info *ptr; + /* hex dump output buffer for debug */ + char hexssid[IW_ESSID_MAX_SIZE*2+1] __attribute__ ((unused)); + char hexrates[MAX_RATE_LEN*3+1] __attribute__ ((unused)); + int i; + int nr=dev->bss_nr; /* copy it in case the rx callback adds + a new BSS */ + + dbg("%s BSS table:", dev->netdev->name); + for(i=0,ptr=dev->bss; i < nr; i++,ptr++) { + dbg("%d.BSS %s channel %d ssid %s (%d:%s)" + " capa x%04x rates %s rssi %d link %d noise %d", + i, mac2str(ptr->bssid), + ptr->channel, + ptr->ssid, ptr->ssid_len, + hex2str(hexssid,ptr->ssid,ptr->ssid_len,'\0'), + le16_to_cpu(ptr->capa), + hex2str(hexrates, ptr->rates, + ptr->rates_len, ' '), + ptr->rssi, ptr->link_qual, ptr->noise_level); + } +} + +/* try to find a matching bss in dev->bss, starting at index start. + returns the first index of a matching bss in the array or + -1 if none found */ +static int find_matching_bss(struct at76c503 *dev, int start) +{ + struct bss_info *ptr; + int i, ret; + int nr = dev->bss_nr; /* copy it in case the rx callback adds + a new BSS */ + char hexssid[IW_ESSID_MAX_SIZE*2+1] __attribute__ ((unused)); + char ossid[IW_ESSID_MAX_SIZE+1]; + + for(i=start, ptr = dev->bss + start; i < nr; i++, ptr++) { + if (essid_matched(dev,ptr) && + mode_matched(dev,ptr) && + wep_matched(dev,ptr) && + rates_matched(dev,ptr)) + break; + } + + ret = i < nr ? i : -1; + + /* make dev->essid printable */ + assert(dev->essid_size <= IW_ESSID_MAX_SIZE); + memcpy(ossid, dev->essid, dev->essid_size); + ossid[dev->essid_size] = '\0'; + + dbg("%s " __FUNCTION__ ": try to match ssid %s (%s) mode %s wep %s, start at %d," + " return %d", + dev->netdev->name, ossid, + hex2str(hexssid,dev->essid,dev->essid_size,'\0'), + dev->iw_mode == IW_MODE_ADHOC ? "adhoc" : "infra", + dev->wep_enabled ? "enabled" : "disabled", start, ret); + + return ret; +} /* find_matching_bss */ + + +/* we got an association response */ +static void rx_mgmt_assoc(struct at76c503 *dev, + struct at76c503_rx_buffer *buf) +{ + struct ieee802_11_mgmt *mgmt = (struct ieee802_11_mgmt *)buf->packet; + struct ieee802_11_assoc_resp *resp = + (struct ieee802_11_assoc_resp *)mgmt->data; + char orates[2*8+1] __attribute__((unused)); + + dbg("%s: rx AssocResp bssid %s capa x%04x status x%04x " + "assoc_id x%04x rates %s", + dev->netdev->name, mac2str(mgmt->addr3), + le16_to_cpu(resp->capability), le16_to_cpu(resp->status), + le16_to_cpu(resp->assoc_id), + hex2str(orates, resp->data+2, + min((size_t)*(resp->data+1),(sizeof(orates)-1)/2), '\0')); + + if (dev->istate == ASSOCIATING) { + if (resp->status == IEEE802_11_STATUS_SUCCESS) { + struct bss_info *ptr = dev->bss+dev->curr_bss; + dev->assoc_id = le16_to_cpu(resp->assoc_id); + netif_carrier_on(dev->netdev); + netif_wake_queue(dev->netdev); /* _start_queue ??? */ + NEW_STATE(dev,CONNECTED); + dbg("%s: connected to BSSID %s", + dev->netdev->name, mac2str(dev->bss[dev->curr_bss].bssid)); + /* update iwconfig params */ + memcpy(dev->bssid, ptr->bssid, ETH_ALEN); + memcpy(dev->essid, ptr->ssid, ptr->ssid_len); + dev->essid_size = ptr->ssid_len; + dev->channel = ptr->channel; + } else { + if ((dev->curr_bss= + find_matching_bss(dev,dev->curr_bss+1)) >= 0) { + NEW_STATE(dev,JOINING); + } else { + NEW_STATE(dev,SCANNING); + } + defer_kevent(dev,KEVENT_SCANJOIN); + } + del_timer_sync(&dev->mgmt_timer); + } else + info("%s: AssocResp in state %d ignored", + dev->netdev->name, dev->istate); +} /* rx_mgmt_assoc */ + +static void rx_mgmt_reassoc(struct at76c503 *dev, + struct at76c503_rx_buffer *buf) +{ + struct ieee802_11_mgmt *mgmt = (struct ieee802_11_mgmt *)buf->packet; + struct ieee802_11_assoc_resp *resp = + (struct ieee802_11_assoc_resp *)mgmt->data; + char orates[2*8+1] __attribute__((unused)); + + dbg("%s: rx ReAssocResp bssid %s capa x%04x status x%04x " + "assoc_id x%04x rates %s", + dev->netdev->name, mac2str(mgmt->addr3), + le16_to_cpu(resp->capability), le16_to_cpu(resp->status), + le16_to_cpu(resp->assoc_id), + hex2str(orates, resp->data+2, + min((size_t)*(resp->data+1),(sizeof(orates)-1)/2), '\0')); + + if (dev->istate == REASSOCIATING) { + if (resp->status == IEEE802_11_STATUS_SUCCESS) { + dev->assoc_id = le16_to_cpu(resp->assoc_id); + NEW_STATE(dev,JOINING); + join_bss(dev,dev->curr_bss); + mod_timer(&dev->mgmt_timer, jiffies+HZ); + } else { + if ((dev->curr_bss= + find_matching_bss(dev,dev->curr_bss+1)) >= 0) { + NEW_STATE(dev,JOINING); + } else { + NEW_STATE(dev,SCANNING); + } + del_timer_sync(&dev->mgmt_timer); + defer_kevent(dev,KEVENT_SCANJOIN); + } + } else + info("%s: ReAssocResp in state %d ignored", + dev->netdev->name, dev->istate); +} /* rx_mgmt_reassoc */ + +static void rx_mgmt_disassoc(struct at76c503 *dev, + struct at76c503_rx_buffer *buf) +{ + struct ieee802_11_mgmt *mgmt = (struct ieee802_11_mgmt *)buf->packet; + struct ieee802_11_disassoc_frame *resp = + (struct ieee802_11_disassoc_frame *)mgmt->data; + char obuf[ETH_ALEN*3+1] __attribute__ ((unused)); + + dbg("%s: rx DisAssoc bssid %s reason x%04x destination %s", + dev->netdev->name, mac2str(mgmt->addr3), + le16_to_cpu(resp->reason), + hex2str(obuf, mgmt->addr1, ETH_ALEN, ':')); + + if (!memcmp(mgmt->addr3,dev->bss[dev->curr_bss].bssid, ETH_ALEN) && + (!memcmp(dev->netdev->dev_addr, mgmt->addr1, ETH_ALEN) || + !memcmp(bc_addr, mgmt->addr1, ETH_ALEN))) { + /* this is a DisAssoc from the BSS we are connected or + trying to connect to, directed to us or broadcasted */ + + if (dev->istate == DISASSOCIATING || + dev->istate == REASSOCIATING || + dev->istate == CONNECTED || + dev->istate == JOINING) + { + if ((dev->curr_bss= + find_matching_bss(dev,dev->curr_bss+1)) >= 0) { + NEW_STATE(dev,JOINING); + } else { + NEW_STATE(dev,SCANNING); + } + del_timer_sync(&dev->mgmt_timer); + defer_kevent(dev,KEVENT_SCANJOIN); + } else + /* ignore DisAssoc in states SCANNING, AUTH, ASSOC */ + info("%s: DisAssoc in state %d ignored", + dev->netdev->name, dev->istate); + } + /* ignore DisAssoc to other STA or from other BSSID */ +} /* rx_mgmt_disassoc */ + +static void rx_mgmt_auth(struct at76c503 *dev, + struct at76c503_rx_buffer *buf) +{ + struct ieee802_11_mgmt *mgmt = (struct ieee802_11_mgmt *)buf->packet; + struct ieee802_11_auth_frame *resp = + (struct ieee802_11_auth_frame *)mgmt->data; + char obuf[ETH_ALEN*3+1] __attribute__ ((unused)); + + dbg("%s: rx AuthFrame bssid %s alg %d seq_nr %d status %d " + "destination %s", + dev->netdev->name, mac2str(mgmt->addr3), + le16_to_cpu(resp->algorithm), + le16_to_cpu(resp->seq_nr), + le16_to_cpu(resp->status), + hex2str(obuf, mgmt->addr1, ETH_ALEN, ':')); + + if (dev->istate != AUTHENTICATING) + return; + if (!memcmp(mgmt->addr3,dev->bss[dev->curr_bss].bssid, ETH_ALEN) && + !memcmp(dev->netdev->dev_addr, mgmt->addr1, ETH_ALEN)) { + /* this is a AuthFrame from the BSS we are connected or + trying to connect to, directed to us */ + if (resp->status != IEEE802_11_STATUS_SUCCESS) { + if ((dev->curr_bss= + find_matching_bss(dev,dev->curr_bss+1)) >= 0) { + NEW_STATE(dev,JOINING); + } else { + NEW_STATE(dev,SCANNING); + defer_kevent(dev,KEVENT_SCANJOIN); + } + del_timer_sync(&dev->mgmt_timer); + } else { + dev->retries = ASSOC_RETRIES; + NEW_STATE(dev,ASSOCIATING); + assoc_req(dev, dev->curr_bss); + mod_timer(&dev->mgmt_timer,jiffies+HZ); + } + } + /* else: ignore AuthFrames to other receipients */ +} /* rx_mgmt_auth */ + +static void rx_mgmt_deauth(struct at76c503 *dev, + struct at76c503_rx_buffer *buf) +{ + struct ieee802_11_mgmt *mgmt = (struct ieee802_11_mgmt *)buf->packet; + struct ieee802_11_deauth_frame *resp = + (struct ieee802_11_deauth_frame *)mgmt->data; + char obuf[ETH_ALEN*3+1] __attribute__ ((unused)); + + dbg("%s: rx DeAuth bssid %s reason x%04x destination %s", + dev->netdev->name, mac2str(mgmt->addr3), + le16_to_cpu(resp->reason), + hex2str(obuf, mgmt->addr1, ETH_ALEN, ':')); + + if (!memcmp(mgmt->addr3,dev->bss[dev->curr_bss].bssid, ETH_ALEN) && + (!memcmp(dev->netdev->dev_addr, mgmt->addr1, ETH_ALEN) || + !memcmp(bc_addr, mgmt->addr1, ETH_ALEN))) { + /* this is a DeAuth from the BSS we are connected or + trying to connect to, directed to us or broadcasted */ + + if (dev->istate == DISASSOCIATING || + dev->istate == AUTHENTICATING || + dev->istate == ASSOCIATING || + dev->istate == REASSOCIATING || + dev->istate == CONNECTED || + dev->istate == JOINING) + { + if ((dev->curr_bss= + find_matching_bss(dev,dev->curr_bss+1)) >= 0) { + NEW_STATE(dev,JOINING); + } else { + NEW_STATE(dev,SCANNING); + defer_kevent(dev,KEVENT_SCANJOIN); + } + del_timer_sync(&dev->mgmt_timer); + } else + /* ignore DeAuth in states SCANNING */ + info("%s: DeAuth in state %d ignored", + dev->netdev->name, dev->istate); + } + /* ignore DeAuth to other STA or from other BSSID */ +} /* rx_mgmt_deauth */ + +static void rx_mgmt_beacon(struct at76c503 *dev, + struct at76c503_rx_buffer *buf) +{ + struct ieee802_11_mgmt *mgmt = (struct ieee802_11_mgmt *)buf->packet; + struct ieee802_11_beacon_data *bdata = + (struct ieee802_11_beacon_data *)mgmt->data; + struct bss_info *bss_ptr; + u8 *tlv_ptr; + int i; + + if (dev->istate == CONNECTED) { + /* in state CONNECTED we use the mgmt_timer to control + the beacon of the BSS */ + assert(dev->curr_bss >= 0); + assert(dev->curr_bss < dev->bss_nr); + bss_ptr = dev->bss+dev->curr_bss; + if (!memcmp(bss_ptr->bssid,mgmt->addr3,ETH_ALEN)) { + mod_timer(&dev->mgmt_timer, jiffies+BEACON_TIMEOUT*HZ); + bss_ptr->rssi = buf->rssi; + return; + } + } + + /* look if we have this BSS already in the list */ + for(i=0,bss_ptr=dev->bss; i < dev->bss_nr; i++,bss_ptr++) { + if (!memcmp(bss_ptr->bssid,mgmt->addr3,ETH_ALEN)) + break; + } + + if (i >= NR_BSS_INFO) { + /* table is full */ + info("%s: scan bss table overflow",dev->netdev->name); + return; + } + + /* we either overwrite an existing entry or append a new one + bss_ptr points to the entry in both cases */ + + /* capa is in little endian format (!) */ + bss_ptr->capa = bdata->capability_information; + + /* while beacon_interval is not (!) */ + bss_ptr->beacon_interval = le16_to_cpu(bdata->beacon_interval); + + bss_ptr->rssi = buf->rssi; + bss_ptr->link_qual = buf->link_quality; + bss_ptr->noise_level = buf->noise_level; + + memcpy(bss_ptr->mac,mgmt->addr2,ETH_ALEN); //just for info + memcpy(bss_ptr->bssid,mgmt->addr3,ETH_ALEN); + + tlv_ptr = bdata->data; + + assert(*tlv_ptr == IE_ID_SSID); + bss_ptr->ssid_len = min(IW_ESSID_MAX_SIZE,(int)*(tlv_ptr+1)); + memcpy(bss_ptr->ssid, tlv_ptr+2, bss_ptr->ssid_len); + tlv_ptr += (1+1 + *(tlv_ptr+1)); + + assert(*tlv_ptr == IE_ID_SUPPORTED_RATES); + bss_ptr->rates_len = min(MAX_RATE_LEN,(int)*(tlv_ptr+1)); + memcpy(bss_ptr->rates, tlv_ptr+2, bss_ptr->rates_len); + tlv_ptr += (1+1 + *(tlv_ptr+1)); + + assert(*tlv_ptr == IE_ID_DS_PARAM_SET); + bss_ptr->channel = *(tlv_ptr+2); + + if (i >= dev->bss_nr) { + dev->bss_nr++; + } +} + +static void rx_mgmt(struct at76c503 *dev, struct at76c503_rx_buffer *buf) +{ + struct ieee802_11_mgmt *mgmt = ( struct ieee802_11_mgmt *)buf->packet; + u16 subtype = mgmt->frame_ctl & IEEE802_11_FCTL_STYPE; + +#if 0 + char obuf[128*2+1] __attribute__ ((unused)); + dbg("%s rx mgmt subtype x%x %s", dev->netdev->name, subtype, + hex2str(obuf, (u8 *)mgmt, + min((sizeof(obuf)-1)/2, + (size_t)le16_to_cpu(buf->wlength)), '\0')); +#endif + + switch (subtype) { + case IEEE802_11_STYPE_BEACON: + case IEEE802_11_STYPE_PROBE_RESP: + rx_mgmt_beacon(dev,buf); + break; + + case IEEE802_11_STYPE_ASSOC_RESP: + rx_mgmt_assoc(dev,buf); + break; + + case IEEE802_11_STYPE_REASSOC_RESP: + rx_mgmt_reassoc(dev,buf); + break; + + case IEEE802_11_STYPE_DISASSOC: + rx_mgmt_disassoc(dev,buf); + break; + + case IEEE802_11_STYPE_AUTH: + rx_mgmt_auth(dev,buf); + break; + + case IEEE802_11_STYPE_DEAUTH: + rx_mgmt_deauth(dev,buf); + break; + + default: + info("%s: mgmt, but not beacon, subtype = %x", + dev->netdev->name, subtype); + } + + return; +} + +/* shamelessly copied from orinoco.c */ +static inline int +is_snap(struct header_struct *hdr) +{ + return (hdr->dsap == 0xaa) && (hdr->ssap == 0xaa) && (hdr->ctrl == 0x03); +} + +static void rx_data(struct at76c503 *dev, struct at76c503_rx_buffer *buf) +{ + struct net_device *netdev = (struct net_device *)dev->netdev; + struct net_device_stats *stats = &dev->stats; + struct ieee802_11_hdr *i802_11_hdr = (struct ieee802_11_hdr *)buf->packet; + struct sk_buff *skb; + struct header_struct *hdr_eth = (struct header_struct *)&buf->packet[10]; + int length, offset; + + if(is_snap(hdr_eth)){ + length = le16_to_cpu(buf->wlength) - 18 - 4; + offset = 18; + }else{ + info("it's not a snap frame"); + length = le16_to_cpu(buf->wlength) - 10 - 4; + offset = 10; + } + + /* TODO: submit skb->data directly, this saves the memcpy */ + skb = dev_alloc_skb(length+2); + if(skb == NULL) { + err("%s: could not allocate skb for rx\n", netdev->name); + stats->rx_dropped++; + goto drop; + } + skb_reserve(skb, 2); + + memcpy(skb_put(skb, length), &(buf->packet[offset]), length); + + hdr_eth = (struct header_struct *)skb->data; + + if(dev->iw_mode == IW_MODE_ADHOC){ + memcpy(hdr_eth->dest, i802_11_hdr->addr1, ETH_ALEN); + memcpy(hdr_eth->src, i802_11_hdr->addr2, ETH_ALEN); + }else if(dev->iw_mode == IW_MODE_INFRA){ + memcpy(hdr_eth->dest, i802_11_hdr->addr1, ETH_ALEN); + memcpy(hdr_eth->src, i802_11_hdr->addr3, ETH_ALEN); + } + +#if 0 + info("rx addr1: %s", mac2str(i802_11_hdr->addr1)); + info("rx addr2: %s", mac2str(i802_11_hdr->addr2)); + info("rx addr3: %s", mac2str(i802_11_hdr->addr3)); +#endif + + skb->dev = netdev; + skb->protocol = eth_type_trans(skb, netdev); + netdev->last_rx = jiffies; + skb->ip_summed = CHECKSUM_NONE; + netif_rx(skb); + stats->rx_packets++; + stats->rx_bytes += length; + + drop: + return; +} + +/* we are doing a lot of things here in an interrupt. Need + a bh handler (Watching TV with a TV card is probably + a good test: if you see flickers, we are doing too much. + Currently I do see flickers... even with our tasklet :-( ) + Maybe because the bttv driver and usb-uhci use the same interrupt +*/ +static void at76c503_read_bulk_callback (struct urb *urb) +{ + struct at76c503 *dev = (struct at76c503 *)urb->context; + + dev->rx_urb = urb; + tasklet_schedule(&dev->tasklet); + + return; +} + +static void rx_tasklet(unsigned long param) +{ + struct at76c503 *dev = (struct at76c503 *)param; + struct urb *urb = dev->rx_urb; + struct net_device *netdev = (struct net_device *)dev->netdev; + struct at76c503_rx_buffer *buf = (struct at76c503_rx_buffer *)dev->bulk_in_buffer; + struct ieee802_11_hdr *i802_11_hdr = (struct ieee802_11_hdr *)buf->packet; + int ret; + u8 frame_type; +// int flags; + + if(!urb) return; // paranoid + + if(urb->status != 0){ + if ((urb->status != -ENOENT) && + (urb->status != -ECONNRESET)) { + dbg(__FUNCTION__ " %s: - nonzero read bulk status received: %d", + netdev->name, urb->status); + goto next_urb; + } + return; + } + + //info("%s: rxrate %d\n",netdev->name,buf->rx_rate); + + /* there is a new bssid around, accept it: */ + if(buf->newbss && dev->iw_mode == IW_MODE_ADHOC){ + info("%s: rx newbss", netdev->name); + defer_kevent(dev, KEVENT_NEW_BSS); + } + + /* no need to care about endianness of constants - is taken care + of in ieee802_11.h */ + frame_type = i802_11_hdr->frame_ctl & IEEE802_11_FCTL_FTYPE; + + if(frame_type == IEEE802_11_FTYPE_DATA){ +// info("rx: it's a data frame"); + rx_data(dev, buf); + }else if(frame_type == IEEE802_11_FTYPE_MGMT){ +// info("rx: it's a mgmt frame"); + rx_mgmt(dev, buf); + }else if(frame_type == IEEE802_11_FTYPE_CTL) + info("rx: it's a ctrl frame: %2x", i802_11_hdr->frame_ctl); + else + info("rx: it's a frame from mars: %2x", i802_11_hdr->frame_ctl); + + next_urb: + FILL_BULK_URB(dev->read_urb, dev->udev, + usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr), + dev->bulk_in_buffer, sizeof(struct at76c503_rx_buffer), + at76c503_read_bulk_callback, dev); + ret = usb_submit_urb(dev->read_urb); + if(ret < 0){ + err("%s: rx, usb_submit_urb failed: %d", netdev->name, ret); + goto exit; + } + + exit: + return; +} + +static void at76c503_write_bulk_callback (struct urb *urb) +{ + struct at76c503 *dev = (struct at76c503 *)urb->context; + struct net_device_stats *stats = &dev->stats; + unsigned long flags; + struct at76c503_tx_buffer *mgmt_buf; + int ret; + + if(urb->status != 0){ + if((urb->status != -ENOENT) && + (urb->status != -ECONNRESET)) { + dbg(__FUNCTION__ " - nonzero write bulk status received: %d", + urb->status); + }else + return; /* urb has been unlinked */ + stats->tx_errors++; + }else + stats->tx_packets++; + + spin_lock_irqsave(&dev->mgmt_spinlock, flags); + mgmt_buf = dev->next_mgmt_bulk; + dev->next_mgmt_bulk = NULL; + spin_unlock_irqrestore(&dev->mgmt_spinlock, flags); + + if (mgmt_buf) { + memcpy(dev->bulk_out_buffer, mgmt_buf, + le16_to_cpu(mgmt_buf->wlength) + + le16_to_cpu(mgmt_buf->padding) + + offsetof(struct at76c503_tx_buffer,packet)); + FILL_BULK_URB(dev->write_urb, dev->udev, + usb_sndbulkpipe(dev->udev, + dev->bulk_out_endpointAddr), + dev->bulk_out_buffer, + le16_to_cpu(mgmt_buf->wlength) + + le16_to_cpu(mgmt_buf->padding) + + offsetof(struct at76c503_tx_buffer,packet), + at76c503_write_bulk_callback, dev); + ret = usb_submit_urb(dev->write_urb); + if (ret) { + err("%s:" __FUNCTION__ " error in tx submit urb: %d", + dev->netdev->name, ret); + } + kfree(mgmt_buf); + } else + netif_wake_queue(dev->netdev); + +} + +static int +at76c503_tx(struct sk_buff *skb, struct net_device *netdev) +{ + struct at76c503 *dev = (struct at76c503 *)(netdev->priv); + struct net_device_stats *stats = &dev->stats; + int ret; + int len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len; + int wlen = len + 18; + int submit_len; + struct at76c503_tx_buffer *tx_buffer = + (struct at76c503_tx_buffer *)dev->bulk_out_buffer; + struct ieee802_11_hdr *i802_11_hdr = + (struct ieee802_11_hdr *)&(tx_buffer->packet); + + /* we can get rid of memcpy, if we set netdev->hard_header_len + to 8 + sizeof(struct ieee802_11_hdr), because then we have + enough space */ + // dbg("skb->data - skb->head = %d", skb->data - skb->head); + + /* 18 = sizeof(ieee802_11_hdr) - 2 * ETH_ALEN */ + /* ssap and dsap stay in the data */ + memcpy(&(tx_buffer->packet[18]), skb->data, len); + + /* make wireless header */ + /* no need to care about endianness of constants - is taken care + of in ieee802_11.h */ + i802_11_hdr->frame_ctl = IEEE802_11_FTYPE_DATA; + + /* jal TODO: if the destination has sent us unencrypted packets + and we did not exclude them, do not encrypt the answers. + -> have a table of peers */ + if (dev->wep_enabled) + i802_11_hdr->frame_ctl |= IEEE802_11_FCTL_WEP; + + if(dev->iw_mode == IW_MODE_ADHOC){ + memcpy(i802_11_hdr->addr1, skb->data, ETH_ALEN); /* destination */ + memcpy(i802_11_hdr->addr2, netdev->dev_addr, ETH_ALEN); /* source */ + memcpy(i802_11_hdr->addr3, dev->bssid, ETH_ALEN); + }else if(dev->iw_mode == IW_MODE_INFRA){ + i802_11_hdr->frame_ctl |= IEEE802_11_FCTL_TODS; + memcpy(i802_11_hdr->addr1, dev->bssid, ETH_ALEN); + memcpy(i802_11_hdr->addr2, netdev->dev_addr, ETH_ALEN); /* source */ + memcpy(i802_11_hdr->addr3, skb->data, ETH_ALEN); /* destination */ + } + memset(i802_11_hdr->addr4, 0, ETH_ALEN); + + i802_11_hdr->duration_id = 0; + i802_11_hdr->seq_ctl = 0; + + /* setup 'atmel' header */ + tx_buffer->wlength = cpu_to_le16(wlen); + tx_buffer->tx_rate = dev->txrate; + + //info("txrate %d\n", dev->txrate); + +#if 0 /* does not seem to be necessary */ + { + /* strange things, as done in atmelwlandriver + - I do not really understand this (oku) */ + int tmp = wlen%64; + tx_buffer->padding = tmp < 50 ? 50 - tmp : 114 - tmp; + } +#endif + memset(tx_buffer->reserved, 0, 4); + + tx_buffer->padding = 0; + submit_len = wlen + 8 + tx_buffer->padding; + + /* send stuff */ + netif_stop_queue(netdev); + netdev->trans_start = jiffies; + + FILL_BULK_URB(dev->write_urb, dev->udev, + usb_sndbulkpipe(dev->udev, dev->bulk_out_endpointAddr), + tx_buffer, submit_len, + at76c503_write_bulk_callback, dev); + ret = usb_submit_urb(dev->write_urb); + if(ret){ + stats->tx_errors++; + err("%s: error in tx submit urb: %d", netdev->name, ret); + goto err; + } + + stats->tx_bytes += len; + + dev_kfree_skb(skb); + return 0; + + err: + return ret; +} + +static +void at76c503_tx_timeout(struct net_device *netdev) +{ + struct at76c503 *dev = (struct at76c503 *)(netdev->priv); + + if (!dev) + return; + warn("%s: tx timeout.", netdev->name); + dev->write_urb->transfer_flags |= USB_ASYNC_UNLINK; + usb_unlink_urb(dev->write_urb); + dev->stats.tx_errors++; +} + +static +int at76c503_open(struct net_device *netdev) +{ + struct at76c503 *dev = (struct at76c503 *)(netdev->priv); + int ret = 0; + struct set_mib_buffer mib_buf; + + if(down_interruptible(&dev->sem)) + return -EINTR; + + { + struct at76c503_card_config *ccfg = &dev->card_config; + + memset(ccfg, 0, sizeof(struct at76c503_card_config)); + ccfg->exclude_unencrypted = dev->wep_excl_unencr; + ccfg->promiscuous_mode = 0; + ccfg->promiscuous_mode = 1; + ccfg->short_retry_limit = 8; + + if (dev->wep_enabled && + dev->wep_keys_len[dev->wep_key_id] > WEP_SMALL_KEY_LEN) + ccfg->encryption_type = 2; + else + ccfg->encryption_type = 1; + + + ccfg->rts_threshold = dev->rts_threshold; + ccfg->fragmentation_threshold = dev->frag_threshold; + + memcpy(ccfg->basic_rate_set, hw_rates, 4); + /* jal: really needed, we do a set_mib for autorate later ??? */ + ccfg->auto_rate_fallback = (dev->txrate == 4 ? 1 : 0); + ccfg->channel = dev->channel; + ccfg->privacy_invoked = dev->wep_enabled; + memcpy(ccfg->current_ssid, dev->essid, IW_ESSID_MAX_SIZE); + ccfg->ssid_len = dev->essid_size; + + ccfg->wep_default_key_id = dev->wep_key_id; + memcpy(ccfg->wep_default_key_value, dev->wep_keys, 4 * WEP_KEY_SIZE); + + ccfg->short_preamble = dev->preamble_type; + ccfg->beacon_period = 100; + } + + ret = set_card_command(dev->udev, CMD_STARTUP, (unsigned char *)&dev->card_config, + sizeof(struct at76c503_card_config)); + if(ret < 0){ + err("%s: set_card_command failed: %d", netdev->name, ret); + goto err; + } + + wait_completion(dev, CMD_STARTUP); + + set_radio(dev, 1); + wait_completion(dev, CMD_RADIO); + + set_preamble(dev, dev->preamble_type); + set_frag(dev, dev->frag_threshold); + set_rts(dev, dev->rts_threshold); + set_autorate_fallback(dev, dev->txrate == 4 ? 1 : 0); + + FILL_BULK_URB(dev->read_urb, dev->udev, + usb_rcvbulkpipe(dev->udev, dev->bulk_in_endpointAddr), + dev->bulk_in_buffer, sizeof(struct at76c503_rx_buffer), + at76c503_read_bulk_callback, dev); + + ret = usb_submit_urb(dev->read_urb); + if(ret < 0){ + err("%s: open: usb_submit_urb failed: %d", netdev->name, ret); + goto err; + } + + if (dev->iw_mode == IW_MODE_INFRA) { + NEW_STATE(dev,SCANNING); + defer_kevent(dev,KEVENT_SCANJOIN); + netif_carrier_off(dev->netdev); /* disable running netdev watchdog */ + netif_stop_queue(dev->netdev); /* stop tx data packets */ + + goto good_end; + } + + /* here we go in adhoc mode only */ + ret = start_scan(dev); + if(ret < 0){ + err("%s: start_scan failed: %d", netdev->name, ret); + goto err; + } + + wait_completion(dev, CMD_SCAN); + +// dump_bss_table(dev); + + if ((dev->curr_bss = find_matching_bss(dev,0)) >= 0) { + ret = join_bss(dev, dev->curr_bss); + if(ret < 0){ + err("%s: join_bss failed: %d", + netdev->name, ret); + } else { + ret = wait_completion(dev, CMD_JOIN); + if (ret != CMD_STATUS_COMPLETE) { + /* it may time out -> dbg, not err */ + dbg("%s join failed to complete,%d", + netdev->name, ret); + } else { + dbg("%s: join succeeded", netdev->name); + netif_start_queue(netdev); + + ret = get_current_bssid(dev); + if(ret < 0) goto err; + + ret = get_current_channel(dev); + if(ret < 0) goto err; + + goto good_end; + } + } + }else + dbg("%s: cannot find matching IBSS - start own", + dev->netdev->name); + + /* we either didn't find a matching BSS or + repeately failed to join it */ + ret = start_ibss(dev); + if(ret < 0){ + err("%s: start_ibss failed: %d", netdev->name, ret); + goto err; + } + + ret = wait_completion(dev, CMD_START_IBSS); + if (ret != CMD_STATUS_COMPLETE) { + err("%s start_ibss failed to complete,%d", + netdev->name, ret); + goto err; + } + + ret = get_current_bssid(dev); + if(ret < 0) goto err; + + ret = get_current_channel(dev); + if(ret < 0) goto err; + + // usb_debug_data(__FUNCTION__, (unsigned char *)phy, sizeof(struct mib_phy)); + + + /* not sure what this is good for */ + memset(&mib_buf, 0, sizeof(struct set_mib_buffer)); + mib_buf.type = MIB_MAC_MGMT; + mib_buf.size = 1; + mib_buf.index = IBSS_CHANGE_OK_OFFSET; + ret = set_mib(dev->udev, &mib_buf); + if(ret < 0){ + err("%s: set_mib (ibss change ok) failed: %d", netdev->name, ret); + goto err; + } + + netif_start_queue(netdev); + + good_end: + dbg("at76c503_open end"); + err: + up(&dev->sem); + return ret < 0 ? ret : 0; +} + +static +int at76c503_stop(struct net_device *netdev) +{ + struct at76c503 *dev = (struct at76c503 *)(netdev->priv); + unsigned long flags; + + down(&dev->sem); + + netif_stop_queue(netdev); + + set_radio(dev, 0); + + usb_unlink_urb(dev->read_urb); + usb_unlink_urb(dev->write_urb); + usb_unlink_urb(dev->ctrl_urb); + + del_timer_sync(&dev->mgmt_timer); + + spin_lock_irqsave(&dev->mgmt_spinlock,flags); + if (dev->next_mgmt_bulk) { + kfree(dev->next_mgmt_bulk); + dev->next_mgmt_bulk = NULL; + } + spin_unlock_irqrestore(&dev->mgmt_spinlock,flags); + + up(&dev->sem); + + return 0; +} + +static +struct net_device_stats *at76c503_get_stats(struct net_device *netdev) +{ + struct at76c503 *dev = (struct at76c503 *)netdev->priv; + + return &dev->stats; +} + +static +struct iw_statistics *at76c503_get_wireless_stats(struct net_device *netdev) +{ + struct at76c503 *dev = (struct at76c503 *)netdev->priv; + + return &dev->wstats; +} + +static +void at76c503_set_multicast(struct net_device *netdev) +{ + struct at76c503 *dev = (struct at76c503 *)netdev->priv; + int promisc; + + promisc = ((netdev->flags & IFF_PROMISC) != 0); + if(promisc != dev->promisc){ + /* grmbl. This gets called in interrupt. */ + dev->promisc = promisc; + defer_kevent(dev, KEVENT_SET_PROMISC); + } +} + +static +int at76c503_set_mac_address(struct net_device *netdev, void *addr) +{ + struct at76c503 *dev = (struct at76c503 *)netdev->priv; + struct sockaddr *mac = addr; + int ret; + + if (down_interruptible(&dev->sem)) + return -EINTR; + + ret = set_mac_address(dev, mac->sa_data); + if(ret >= 0){ + memcpy(netdev->dev_addr, mac->sa_data, ETH_ALEN); + } + + up(&dev->sem); + + return ret; +} + +static +int at76c503_ioctl(struct net_device *netdev, struct ifreq *rq, int cmd) +{ + struct at76c503 *dev = netdev->priv; + struct iwreq *wrq = (struct iwreq *)rq; + int ret = 0; + // int changed = 0; + + if (! netif_device_present(netdev)) + return -ENODEV; + + if (down_interruptible(&dev->sem)) + return -EINTR; + + switch (cmd) { + case SIOCGIWNAME: + dbg("%s: SIOCGIWNAME", netdev->name); + strcpy(wrq->u.name, "IEEE 802.11-DS"); + break; + + case SIOCGIWAP: + dbg("%s: SIOCGIWAP", netdev->name); + wrq->u.ap_addr.sa_family = ARPHRD_ETHER; + + memcpy(wrq->u.ap_addr.sa_data, dev->bssid, ETH_ALEN); + + break; + + case SIOCSIWRTS: + dbg("%s: SIOCSIWRTS", netdev->name); + { + int rthr = wrq->u.rts.value; +#if 0 + printk(KERN_DEBUG "%s: ioctl SIOCSIWRTS, value %d, disabled %d\n", + dev->name, wrq->u.rts.value, wrq->u.rts.disabled); +#endif + if(wrq->u.rts.disabled) + rthr = MAX_RTS_THRESHOLD; + if((rthr < 0) || (rthr > MAX_RTS_THRESHOLD)) { + ret = -EINVAL; + goto error; + } + dev->rts_threshold = rthr; + } + break; + + // Get the current RTS threshold + case SIOCGIWRTS: + dbg("%s: SIOCGIWRTS", netdev->name); +#if 0 + printk(KERN_DEBUG "%s: ioctl SIOCGIWRTS\n", dev->name); +#endif + wrq->u.rts.value = dev->rts_threshold; + wrq->u.rts.disabled = (wrq->u.rts.value == MAX_RTS_THRESHOLD); + wrq->u.rts.fixed = 1; + break; + + // Set the desired fragmentation threshold + + case SIOCSIWFRAG: + dbg("%s: SIOCSIWFRAG", netdev->name); + { + int fthr = wrq->u.frag.value; +#if 0 + printk(KERN_DEBUG "%s: ioctl SIOCSIWFRAG, value %d, disabled %d\n", + dev->name, wrq->u.frag.value, wrq->u.frag.disabled); +#endif + if(wrq->u.frag.disabled) + fthr = MAX_FRAG_THRESHOLD; + if((fthr < MIN_FRAG_THRESHOLD) || (fthr > MAX_FRAG_THRESHOLD)){ + ret = -EINVAL; + goto error; + }else{ + dev->frag_threshold = fthr & ~0x1; // get an even value + } + } + break; + + // Get the current fragmentation threshold + case SIOCGIWFRAG: + dbg("%s: SIOCGIWFRAG", netdev->name); + + wrq->u.frag.value = dev->frag_threshold; + wrq->u.frag.disabled = (wrq->u.frag.value >= MAX_FRAG_THRESHOLD); + wrq->u.frag.fixed = 1; + break; + + case SIOCGIWFREQ: + dbg("%s: SIOCGIWFREQ", netdev->name); + wrq->u.freq.m = dev->channel; + wrq->u.freq.e = 0; + wrq->u.freq.i = 0; + break; + + case SIOCSIWFREQ: + dbg("%s: SIOCGIWFREQ", netdev->name); + /* copied from orinoco.c */ + { + struct iw_freq *frq = &wrq->u.freq; + int chan = -1; + + /* We can only use this in Ad-Hoc demo mode to set the operating + * frequency, or in IBSS mode to set the frequency where the IBSS + * will be created - Jean II */ + /* dunno if this also applies for this device (oku) */ + if(dev->iw_mode != IW_MODE_ADHOC){ + ret = -EOPNOTSUPP; + goto error; + } + + if((frq->e == 0) && (frq->m <= 1000)){ + /* Setting by channel number */ + chan = frq->m; + }else{ + /* Setting by frequency - search the table */ + int mult = 1; + int i; + + for(i = 0; i < (6 - frq->e); i++) + mult *= 10; + + for(i = 0; i < NUM_CHANNELS; i++) + if(frq->m == (channel_frequency[i] * mult)) + chan = i+1; + } + + /* TODO: we should also check if the channel is + supported by the device (oku) */ + if ((chan < 1) || (chan > NUM_CHANNELS)){ + ret = -EINVAL; + goto error; + } + + dev->channel = chan; + } + break; + + case SIOCGIWMODE: + dbg("%s: SIOCGIWMODE", netdev->name); + wrq->u.mode = dev->iw_mode; + break; + + case SIOCSIWMODE: + dbg("%s: SIOCSIWMODE %d", netdev->name, wrq->u.mode); + dev->iw_mode = wrq->u.mode; + break; + + case SIOCGIWESSID: + dbg("%s: SIOCGIWESSID", netdev->name); + { + char essidbuf[IW_ESSID_MAX_SIZE]; + struct iw_point *erq = &wrq->u.essid; + + memcpy(essidbuf, dev->essid, sizeof(essidbuf)); + erq->flags = 1; + erq->length = strlen(essidbuf); + + if(erq->pointer){ + if(copy_to_user(erq->pointer, essidbuf, erq->length)){ + ret = -EFAULT; + goto error; + } + } + + } + break; + + case SIOCSIWESSID: + dbg("%s: SIOCSIWESSID", netdev->name); + { + char essidbuf[IW_ESSID_MAX_SIZE]; + struct iw_point *erq = &wrq->u.essid; + + memset(&essidbuf, 0, sizeof(essidbuf)); + + if (erq->flags) { + if (erq->length > IW_ESSID_MAX_SIZE){ + ret = -E2BIG; + goto error; + } + + if (copy_from_user(essidbuf, erq->pointer, erq->length)){ + ret = -EFAULT; + goto error; + } + + /* iwconfig gives len including 0 byte - + 3 hours debugging... grrrr (oku) */ + dev->essid_size = erq->length - 1; + memcpy(dev->essid, essidbuf, IW_ESSID_MAX_SIZE); + } + } + break; + + case SIOCGIWRATE: + wrq->u.bitrate.value = dev->txrate == 0 ? 1000000 : + dev->txrate == 1 ? 2000000 : dev->txrate == 2 ? 5500000 : + dev->txrate == 3 ? 11000000 : 11000000; + wrq->u.bitrate.fixed = (dev->txrate != 4); + wrq->u.bitrate.disabled = 0; + break; + + case SIOCSIWRATE: + dbg("%s: SIOCSIWRATE %d", netdev->name, wrq->u.bitrate.value); + switch (wrq->u.bitrate.value){ + case -1: dev->txrate = 4; break; /* auto rate */ + case 1000000: dev->txrate = 0; break; + case 2000000: dev->txrate = 1; break; + case 5500000: dev->txrate = 2; break; + case 11000000: dev->txrate = 3; break; + default: + ret = -EINVAL; + } + break; + + case SIOCSIWENCODE: + dbg("%s: SIOCSIWENCODE", netdev->name); +#if 1 + printk(KERN_DEBUG "%s: ioctl SIOCSIWENCODE enc.flags %08x " + "pointer %p len %d\n", + dev->netdev->name, wrq->u.encoding.flags, + wrq->u.encoding.pointer, wrq->u.encoding.length); + printk(KERN_DEBUG "%s: old wepstate: enabled %d key_id %d " + "excl_unencr %d\n", + dev->netdev->name, dev->wep_enabled, dev->wep_key_id, + dev->wep_excl_unencr); +#endif + { + int index = (wrq->u.encoding.flags & IW_ENCODE_INDEX) - 1; + /* take the old default key if index is invalid */ + if((index < 0) || (index >= NR_WEP_KEYS)) + index = dev->wep_key_id; + if(wrq->u.encoding.pointer){ + int len = wrq->u.encoding.length; + + if(len > WEP_LARGE_KEY_LEN){ + len = WEP_LARGE_KEY_LEN; + } + + memset(dev->wep_keys[index], 0, WEP_KEY_SIZE); + if(copy_from_user(dev->wep_keys[index], + wrq->u.encoding.pointer, len)) { + dev->wep_keys_len[index] = 0; + ret = -EFAULT; + }else{ + dev->wep_keys_len[index] = + len <= WEP_SMALL_KEY_LEN ? + WEP_SMALL_KEY_LEN : WEP_LARGE_KEY_LEN; +#if 0 + printk(KERN_DEBUG "%s: new key index %d, len %d: ", + dev->netdev->name, index, dev->wep_keys_len[index]); +#endif + dev->wep_enabled = 1; + } + } + + dev->wep_key_id = index; + dev->wep_enabled = ((wrq->u.encoding.flags & IW_ENCODE_DISABLED) == 0); + if (wrq->u.encoding.flags & IW_ENCODE_RESTRICTED) + dev->wep_excl_unencr = 1; + if (wrq->u.encoding.flags & IW_ENCODE_OPEN) + dev->wep_excl_unencr = 0; +#if 1 + printk(KERN_DEBUG "%s: new wepstate: enabled %d key_id %d key_len %d " + "excl_unencr %d\n", + dev->netdev->name, dev->wep_enabled, dev->wep_key_id, + dev->wep_keys_len[dev->wep_key_id], + dev->wep_excl_unencr); +#endif + } + break; + + // Get the WEP keys and mode + case SIOCGIWENCODE: + dbg("%s: SIOCGIWENCODE", netdev->name); + { + int index = (wrq->u.encoding.flags & IW_ENCODE_INDEX) - 1; + if ((index < 0) || (index >= NR_WEP_KEYS)) + index = dev->wep_key_id; + + wrq->u.encoding.flags = + (dev->wep_excl_unencr) ? IW_ENCODE_RESTRICTED : IW_ENCODE_OPEN; + if(!dev->wep_enabled) + wrq->u.encoding.flags |= IW_ENCODE_DISABLED; + if(wrq->u.encoding.pointer){ + wrq->u.encoding.length = dev->wep_keys_len[index]; + if (copy_to_user(wrq->u.encoding.pointer, + dev->wep_keys[index], + dev->wep_keys_len[index])) + ret = -EFAULT; + wrq->u.encoding.flags |= (index + 1); + } + } + break; + + default: + dbg("%s: not supported (%ux)", netdev->name, cmd); + ret = -EOPNOTSUPP; + } + + error: + up(&dev->sem); + return ret; +} + +static inline void at76c503_delete(struct at76c503 *dev) +{ + if(dev){ + if(dev->bulk_in_buffer != NULL) + kfree(dev->bulk_in_buffer); + if(dev->bulk_out_buffer != NULL) + kfree(dev->bulk_out_buffer); + if(dev->ctrl_buffer != NULL) + kfree(dev->ctrl_buffer); + + if(dev->write_urb != NULL) + usb_free_urb(dev->write_urb); + if(dev->read_urb != NULL) + usb_free_urb(dev->read_urb); + if(dev->ctrl_buffer != NULL) + usb_free_urb(dev->ctrl_urb); + + kfree (dev->netdev); /* dev is in net_dev */ + } +} + +static int at76c503_alloc_urbs(struct at76c503 *dev) +{ + struct usb_interface *interface = dev->interface; + struct usb_interface_descriptor *iface_desc = &interface->altsetting[0]; + struct usb_endpoint_descriptor *endpoint; + struct usb_device *udev = dev->udev; + int i, buffer_size; + + for(i = 0; i < iface_desc->bNumEndpoints; i++) { + endpoint = &iface_desc->endpoint[i]; + + if ((endpoint->bEndpointAddress & 0x80) && + ((endpoint->bmAttributes & 3) == 0x02)) { + /* we found a bulk in endpoint */ + + dev->read_urb = usb_alloc_urb(0); + if (!dev->read_urb) { + err("No free urbs available"); + return -1; + } + buffer_size = sizeof(struct at76c503_rx_buffer); + dev->bulk_in_size = buffer_size; + dev->bulk_in_endpointAddr = endpoint->bEndpointAddress; + dev->bulk_in_buffer = kmalloc (buffer_size, GFP_KERNEL); + if (!dev->bulk_in_buffer) { + err("Couldn't allocate bulk_in_buffer"); + return -1; + } + FILL_BULK_URB(dev->read_urb, udev, + usb_rcvbulkpipe(udev, + endpoint->bEndpointAddress), + dev->bulk_in_buffer, buffer_size, + at76c503_read_bulk_callback, dev); + } + + if (((endpoint->bEndpointAddress & 0x80) == 0x00) && + ((endpoint->bmAttributes & 3) == 0x02)) { + /* we found a bulk out endpoint */ + dev->write_urb = usb_alloc_urb(0); + if (!dev->write_urb) { + err("no free urbs available"); + return -1; + } + buffer_size = sizeof(struct at76c503_tx_buffer); + dev->bulk_out_size = buffer_size; + dev->bulk_out_endpointAddr = endpoint->bEndpointAddress; + dev->bulk_out_buffer = kmalloc (buffer_size, GFP_KERNEL); + if (!dev->bulk_out_buffer) { + err("couldn't allocate bulk_out_buffer"); + return -1; + } + FILL_BULK_URB(dev->write_urb, udev, + usb_sndbulkpipe(udev, + endpoint->bEndpointAddress), + dev->bulk_out_buffer, buffer_size, + at76c503_write_bulk_callback, dev); + } + } + + dev->ctrl_urb = usb_alloc_urb(0); + if (!dev->ctrl_urb) { + err("no free urbs available"); + return -1; + } + dev->ctrl_buffer = kmalloc(1024, GFP_KERNEL); + if (!dev->ctrl_buffer) { + err("couldn't allocate ctrl_buffer"); + return -1; + } + + return 0; +} + +static void *at76c503_probe(struct usb_device *udev, unsigned int ifnum, const struct usb_device_id *id) +{ + struct net_device *netdev; + struct at76c503 *dev = NULL; + struct usb_interface *interface; + int ret; + + /* allocate memory for our device state and intialize it */ + netdev = alloc_etherdev(sizeof(struct at76c503)); + if (netdev == NULL) { + err("out of memory"); + goto error; + } + + dev = (struct at76c503 *)netdev->priv; + dev->udev = udev; + dev->netdev = netdev; + + init_MUTEX (&dev->sem); + INIT_TQUEUE (&dev->kevent, kevent, dev); + + init_timer(&dev->mgmt_timer); + dev->mgmt_timer.data = (unsigned long)dev; + dev->mgmt_timer.function = mgmt_timeout; + dev->mgmt_spinlock = SPIN_LOCK_UNLOCKED; + dev->next_mgmt_bulk = NULL; + dev->istate = INIT; + dev->curr_bss = dev->new_bss = -1; + + dev->tasklet.func = rx_tasklet; + dev->tasklet.data = (unsigned long)dev; + + if((ret = usb_get_configuration(udev)) != 0) { + err("get configuration failed: %d", ret); + goto error; + } + + if ((ret = usb_set_configuration(udev, 1)) != 0) { + err("set configuration to 1 failed: %d", ret); + goto error; + } + + /* set up the endpoint information */ + /* check out the endpoints */ + interface = &udev->actconfig->interface[0]; + dev->interface = interface; + + ret = get_op_mode(dev); + if(ret < 0){ + err("getting op mode failed: is the firmware loaded?"); + goto error; + } + + if(dev->op_mode == 0){ + err("firmware is not loaded"); + goto error; + } + + if(at76c503_alloc_urbs(dev) < 0) + goto error; + + /* download external firmware */ + /* checking for presence of ext. fw by eg. checking the version does not work: + if it's not present, just the get_mib command will fubar the device, + so that not even usb_clear_halt() helps. + But it does not seem to hurt if we reload the ext. fw again. (oku) + */ + ret = download_external_fw(dev->udev, ExternalRFMD, sizeof(ExternalRFMD)); + if(ret < 0){ + err("downloading external firmware failed: %d", ret); + goto error; + } + + /* get firmware version */ + ret = get_mib(dev->udev, MIB_FW_VERSION, (u8*)&dev->fw_version, sizeof(dev->fw_version)); + if((ret < 0) || ((dev->fw_version.major == 0) && + (dev->fw_version.minor == 0) && + (dev->fw_version.patch == 0) && + (dev->fw_version.build == 0))){ + err("getting firmware failed with %d, or version is 0", ret); + err("this probably means that the ext. fw was not loaded correctly"); + goto error; + } + info("firmware version %d.%d.%d #%d", + dev->fw_version.major, dev->fw_version.minor, + dev->fw_version.patch, dev->fw_version.build); + + /* MAC address */ + ret = get_hw_cfg(dev->udev, (unsigned char *)&dev->hwcfg.rfmd, sizeof(struct hwcfg_rfmd)); + if(ret < 0){ + err("could not get MAC: get_hw_cfg() failed, ret = %d", ret); + goto error; + } + memcpy(netdev->dev_addr, &(dev->hwcfg.rfmd.mac_addr), ETH_ALEN); + info("using MAC %s", mac2str(netdev->dev_addr)); + + set_mac_address(dev, netdev->dev_addr); /* may have been changed, write back original */ + + /* initializing */ + dev->channel = DEF_CHANNEL; + dev->iw_mode = IW_MODE_ADHOC; + memset(dev->essid, 0, IW_ESSID_MAX_SIZE); + memcpy(dev->essid, DEF_ESSID, DEF_ESSID_LEN); + dev->essid_size = DEF_ESSID_LEN; + dev->rts_threshold = DEF_RTS_THRESHOLD; + dev->frag_threshold = DEF_FRAG_THRESHOLD; + dev->txrate = TX_RATE_AUTO; + dev->preamble_type = PREAMBLE_TYPE_LONG; + + netdev->flags &= ~IFF_MULTICAST; /* not yet or never */ + netdev->open = at76c503_open; + netdev->stop = at76c503_stop; + netdev->get_stats = at76c503_get_stats; + netdev->get_wireless_stats = at76c503_get_wireless_stats; + netdev->hard_start_xmit = at76c503_tx; + netdev->tx_timeout = at76c503_tx_timeout; + netdev->do_ioctl = at76c503_ioctl; + netdev->set_multicast_list = at76c503_set_multicast; + netdev->set_mac_address = at76c503_set_mac_address; + strcpy(netdev->name, eth_name); + // netdev->hard_header_len = 8 + sizeof(struct ieee802_11_hdr); + /* +// netdev->hard_header = at76c503_header; +*/ + SET_MODULE_OWNER(netdev); + + register_netdev(netdev); + + info("using net device %s", netdev->name); + + goto exit; + + error: + at76c503_delete(dev); + dev = NULL; + + exit: + return dev; +} + + +/** + * at76c503_disconnect + * + * Called by the usb core when the device is removed from the system. + */ +static void at76c503_disconnect(struct usb_device *udev, void *ptr) +{ + struct at76c503 *dev; + + dbg("udev=%p, ptr=%p", udev, ptr); + + dev = (struct at76c503 *)ptr; + + unregister_netdev(dev->netdev); + at76c503_delete(dev); + + info("at76c503 now disconnected"); +} + +/** + * at76c503_usb_init + */ +static int __init at76c503_init(void) +{ + int result; + + info(DRIVER_DESC " " DRIVER_VERSION); + + usbdfu_register(&at76c503_driver, InternalRFMD, sizeof(InternalRFMD)); + /* register this driver with the USB subsystem */ + result = usb_register(&at76c503_driver); + info("driver registered"); + if (result < 0) { + err("usb_register failed for the "__FILE__" driver. Error number %d", + result); + return -1; + } + return 0; +} + +/** + * at76c503_usb_exit + */ +static void __exit at76c503_exit(void) +{ + info(DRIVER_DESC " " DRIVER_VERSION "exit"); + /* deregister this driver with the USB subsystem */ + usbdfu_deregister(&at76c503_driver); + usb_deregister(&at76c503_driver); +} + +module_init (at76c503_init); +module_exit (at76c503_exit); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); diff --git a/at76c503.h b/at76c503.h new file mode 100644 index 0000000..1149761 --- /dev/null +++ b/at76c503.h @@ -0,0 +1,304 @@ +/* -*- linux-c -*- */ +/* + * USB at76c503 driver + * + * Copyright (c) 2002 - 2003 Oliver Kurth <oku@masqmail.cx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + */ + +#define DEVICE_VENDOR_REQUEST_OUT 0x40 +#define DEVICE_VENDOR_REQUEST_IN 0xc0 +#define INTERFACE_VENDOR_REQUEST_OUT 0x41 +#define INTERFACE_VENDOR_REQUEST_IN 0xc1 +#define CLASS_REQUEST_OUT 0x21 +#define CLASS_REQUEST_IN 0xa1 + +#define CMD_STATUS_IDLE 0x00 +#define CMD_STATUS_COMPLETE 0x01 +#define CMD_STATUS_UNKNOWN 0x02 +#define CMD_STATUS_INVALID_PARAMETER 0x03 +#define CMD_STATUS_FUNCTION_NOT_SUPPORTED 0x04 +#define CMD_STATUS_TIME_OUT 0x07 +#define CMD_STATUS_IN_PROGRESS 0x08 +#define CMD_STATUS_HOST_FAILURE 0xff +#define CMD_STATUS_SCAN_FAILED 0xf0 + +#define CMD_SET_MIB 0x01 +#define CMD_GET_MIB 0x02 +#define CMD_SCAN 0x03 +#define CMD_JOIN 0x04 +#define CMD_START_IBSS 0x05 +#define CMD_RADIO 0x06 +#define CMD_STARTUP 0x0B + +#define MIB_LOCAL 0x01 +#define MIB_MAC_ADD 0x02 +#define MIB_MAC 0x03 +#define MIB_MAC_MGMT 0x05 +#define MIB_MAC_WEP 0x06 +#define MIB_PHY 0x07 +#define MIB_FW_VERSION 0x08 +#define MIB_MDOMAIN 0x09 + +#define ADHOC_MODE 1 +#define INFRASTRUCTURE_MODE 2 + +/* values for struct mib_local, field preamble_type */ +#define PREAMBLE_TYPE_SHORT 1 +#define PREAMBLE_TYPE_LONG 0 + +/* values for tx_rate */ +#define TX_RATE_1MBIT 0 +#define TX_RATE_2MBIT 1 +#define TX_RATE_5_5MBIT 2 +#define TX_RATE_11MBIT 3 +#define TX_RATE_AUTO 4 + +/* offsets into the MIBs we use to configure the device */ +#define TX_AUTORATE_FALLBACK_OFFSET offsetof(struct mib_local,txautorate_fallback) +#define FRAGMENTATION_OFFSET offsetof(struct mib_mac,frag_threshold) +#define PREAMBLE_TYPE_OFFSET offsetof(struct mib_local,preamble_type) +#define RTS_OFFSET offsetof(struct mib_mac, rts_threshold) + +/* valid only for rfmd and 505 !*/ +#define IBSS_CHANGE_OK_OFFSET offsetof(struct mib_mac_mgmt, ibss_change) +#define IROAMING_OFFSET \ + offsetof(struct mib_mac_mgmt, multi_domain_capability_enabled) + +struct hwcfg_r505 { + u8 cr39_values[14]; + u8 reserved1[14]; + u8 bb_cr[14]; + u8 pidvid[4]; + u8 mac_addr[ETH_ALEN]; + u8 regulatory_domain; + u8 reserved2[14]; + u8 cr15_values[14]; + u8 reserved3[3]; +} __attribute__ ((packed)); + +struct hwcfg_rfmd { + u8 cr20_values[14]; + u8 cr21_values[14]; + u8 bb_cr[14]; + u8 pidvid[4]; + u8 mac_addr[ETH_ALEN]; + u8 regulatory_domain; + u8 low_power_values[14]; + u8 normal_power_values[14]; + u8 reserved1[3]; +} __attribute__ ((packed)); + +struct hwcfg_other { + u8 mac_addr[ETH_ALEN]; + u8 cr31[14]; + u8 cr58[14]; + u8 vidpid[4]; + u8 reg_domain; + u8 reserved[1]; +} __attribute__ ((packed)); + +#define WEP_KEY_SIZE 13 +#define NR_WEP_KEYS 4 +#define WEP_SMALL_KEY_LEN (40/8) +#define WEP_LARGE_KEY_LEN (104/8) + +struct at76c503_card_config{ + u8 exclude_unencrypted; + u8 promiscuous_mode; + u8 short_retry_limit; + u8 encryption_type; + u16 rts_threshold; + u16 fragmentation_threshold; // 256..2346 + u8 basic_rate_set[4]; + u8 auto_rate_fallback; //0,1 + u8 channel; + u8 privacy_invoked; + u8 wep_default_key_id; // 0..3 + u8 current_ssid[32]; + u8 wep_default_key_value[4][WEP_KEY_SIZE]; + u8 ssid_len; + u8 short_preamble; + u16 beacon_period; +} __attribute__ ((packed)); + +struct at76c503_command{ + u8 cmd; + u8 reserved; + u16 size; +} __attribute__ ((packed)); + +#define MAX_PACKET 1536 + +struct at76c503_rx_buffer { + u16 wlength; + u8 rx_rate; + u8 newbss; + u8 fragmentation; + u8 rssi; + u8 link_quality; + u8 noise_level; + u8 rx_time[4]; + u8 packet[MAX_PACKET]; +} __attribute__ ((packed)); + +struct at76c503_tx_buffer { + u16 wlength; + u8 tx_rate; + u8 padding; + u8 reserved[4]; + u8 packet[MAX_PACKET]; +} __attribute__ ((packed)); + +/* defines for scan_type below */ +#define SCAN_TYPE_ACTIVE 0 +#define SCAN_TYPE_PASSIVE 1 + +struct at76c503_start_scan { + u8 bssid[ETH_ALEN]; + u8 essid[32]; + u8 scan_type; + u8 channel; + u16 probe_delay; + u16 min_channel_time; + u16 max_channel_time; + u8 essid_size; + u8 international_scan; +} __attribute__ ((packed)); + +struct at76c503_start_bss { + u8 bssid[ETH_ALEN]; + u8 essid[32]; + u8 bss_type; + u8 channel; + u8 essid_size; + u8 reserved[3]; +} __attribute__ ((packed)); + +struct at76c503_join { + u8 bssid[ETH_ALEN]; + u8 essid[32]; + u8 bss_type; + u8 channel; + u16 timeout; + u8 essid_size; + u8 reserved; +} __attribute__ ((packed)); + +struct set_mib_buffer { + u8 type; + u8 size; + u8 index; + u8 reserved; + u8 data[72]; +} __attribute__ ((packed)); + +struct mib_local { + u16 reserved0; + u8 beacon_enable; + u8 txautorate_fallback; + u8 reserved1; + u8 ssid_size; + u8 promiscuous_mode; + u16 reserved2; + u8 preamble_type; + u16 reserved3; +} __attribute__ ((packed)); + +struct mib_mac_addr { + u8 mac_addr[ETH_ALEN]; + u8 res[2]; /* ??? */ + u8 group_addr[4][ETH_ALEN]; + u8 group_addr_status[4]; +} __attribute__ ((packed)); + +struct mib_mac { + u32 max_tx_msdu_lifetime; + u32 max_rx_lifetime; + u16 frag_threshold; + u16 rts_threshold; + u16 cwmin; + u16 cwmax; + u8 short_retry_time; + u8 long_retry_time; + u8 scan_type; /* active or passive */ + u8 scan_channel; + u16 probe_delay; /* delay before sending a ProbeReq in active scan, RO */ + u16 min_channel_time; + u16 max_channel_time; + u16 listen_interval; + u8 desired_ssid[32]; + u8 desired_bssid[ETH_ALEN]; + u8 desired_bsstype; /* ad-hoc or infrastructure */ + u8 reserved2; +} __attribute__ ((packed)); + +struct mib_mac_mgmt { + u16 beacon_period; + u16 CFP_max_duration; + u16 medium_occupancy_limit; + u16 station_id; + u16 ATIM_window; + u8 CFP_mode; + u8 privacy_option_implemented; + u8 DTIM_period; + u8 CFP_period; + u8 current_bssid[ETH_ALEN]; + u8 current_essid[32]; + u8 current_bss_type; + u8 power_mgmt_mode; + /* rfmd and 505 */ + u8 ibss_change; + u8 res; + u8 multi_domain_capability_implemented; + u8 multi_domain_capability_enabled; + u8 country_string[3]; + u8 reserved[3]; +} __attribute__ ((packed)); + +struct mib_mac_wep { + u8 privacy_invoked; /* 0 disable encr., 1 enable encr */ + u8 wep_default_key_id; + u8 wep_key_mapping_len; + u8 exclude_unencrypted; + u32 wep_icv_error_count; + u32 wep_excluded_count; + u8 wep_default_keyvalue[NR_WEP_KEYS][WEP_KEY_SIZE]; + u8 encryption_level; /* 1 for 40bit, 2 for 104bit encryption */ +} __attribute__ ((packed)); + +struct mib_phy { + u32 ed_threshold; + + u16 slot_time; + u16 sifs_time; + u16 preamble_length; + u16 plcp_header_length; + u16 mpdu_max_length; + u16 cca_mode_supported; + + u8 operation_rate_set[4]; + u8 channel_id; + u8 current_cca_mode; + u8 phy_type; + u8 current_reg_domain; +} __attribute__ ((packed)); + +struct mib_fw_version { + u8 major; + u8 minor; + u8 patch; + u8 build; +} __attribute__ ((packed)); + +struct mib_mdomain { + u8 tx_powerlevel[14]; + u8 channel_list[14]; /* 0 for invalid channels */ +} __attribute__ ((packed)); + + diff --git a/at76c503fw.c b/at76c503fw.c new file mode 100644 index 0000000..e784dff --- /dev/null +++ b/at76c503fw.c @@ -0,0 +1,362 @@ +/* + * USB at76c503 firmware loader + * + * Copyright (c) 2002 - 2003 Oliver Kurth <oku@masqmail.cx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * + */ + +/* This code is _very_ hackish, I know that. It was written with trial + and error, and will be made obsolete, when the download will be + done in the module (oku) */ + +/* + * See here for the DFU specifications: + * http://www.usb.org/developers/devclass_docs/usbdfu10.pdf + */ + +#include <stdio.h> +#include <string.h> +#include <errno.h> + +#include <usb.h> + +typedef unsigned char UCHAR; +#include "internalr.h" +#include "externalr.h" + +#define DEVICE_VENDOR_REQUEST_OUT 0x40 +#define DEVICE_VENDOR_REQUEST_IN 0xc0 +#define INTERFACE_VENDOR_REQUEST_OUT 0x41 +#define INTERFACE_VENDOR_REQUEST_IN 0xc1 +#define CLASS_REQUEST_OUT 0x21 +#define CLASS_REQUEST_IN 0xa1 + +/* Define these values to match your device */ +#define USB_BELKIN_VENDOR_ID 0x0d5c +#define USB_BELKIN_PRODUCT_ID 0xa002 + +#define TIMEOUT 1000 /* ms */ + +struct hwcfg_rfmd { + unsigned char CR20Values[14]; + unsigned char CR21Values[14]; + unsigned char BB_CR[14]; + unsigned char PIDVID[4]; + unsigned char mac_addr[6]; + unsigned char mRegulatoryDomain; + unsigned char LowPowerValues[14]; + unsigned char NormalPowerVlues[14]; + unsigned char Reserved1[3]; +}; + +static inline +int set_remap(struct usb_dev_handle *devh) +{ + return usb_control_msg(devh, + INTERFACE_VENDOR_REQUEST_OUT, 0x0a, + 0, 0, + NULL, 0, TIMEOUT); +} + +static inline +int get_op_mode(struct usb_dev_handle *devh, unsigned char *mode) +{ + return usb_control_msg(devh, + INTERFACE_VENDOR_REQUEST_IN, 0x33, + 0x01, 0, + mode, 1, TIMEOUT); +} + +static inline +int get_dfu_state(struct usb_dev_handle *devh, unsigned char *state) +{ + return usb_control_msg(devh, + CLASS_REQUEST_IN, 0x05, + 0, 0, + state, 1, TIMEOUT); +} + +static inline +int get_dfu_status(struct usb_dev_handle *devh, unsigned char *state) +{ + return usb_control_msg(devh, + CLASS_REQUEST_IN, 0x03, + 0, 0, + state, 6, TIMEOUT); +} + +static inline +int set_dfu_block_int(struct usb_dev_handle *devh, + int i, unsigned char *buf, int bsize) +{ + return usb_control_msg(devh, + CLASS_REQUEST_OUT, 0x01, + i, 0, + buf, bsize, TIMEOUT); +} + +static inline +int set_dfu_block_ext(struct usb_dev_handle *devh, + int i, unsigned char *buf, int bsize) +{ + return usb_control_msg(devh, + DEVICE_VENDOR_REQUEST_OUT, 0x0e, + 0x0802, i, + buf, bsize, TIMEOUT); +} + +static inline +int get_hw_cfg(struct usb_dev_handle *devh, + unsigned char *buf, int buf_size) +{ + return usb_control_msg(devh, + INTERFACE_VENDOR_REQUEST_IN, 0x33, + ((0x0a << 8) | 0x02), 0, + buf, buf_size, TIMEOUT); +} + + +static int fw_download_int(struct usb_dev_handle *devh, + unsigned char *realbuf, int size) +{ + int i = 0; + unsigned char *dfu_status = malloc (6); + unsigned char *dfu_state = malloc(1); + unsigned char *buf = malloc (size); + + if(!buf) + return -ENOMEM; + + memcpy(buf, realbuf, size); + + // while(size > 0){ + while(1){ + int bsize = size > 1024 ? 1024 : size; + int ret; + + do{ + if((ret = get_dfu_state(devh, dfu_state)) < 0){ + err("get_dfu 1 failed: %d", ret); + return ret; + } + + if((*dfu_state != 5) && (*dfu_state != 6) && (*dfu_state != 3) && (*dfu_state != 2)){ + /* TODO: fix this */ + err("cannot handle dfu_state = %d", *dfu_state); + return -EIO; + } + printf("dfu_state 1 = %d", *dfu_state); + + /* + if(*dfu_state == 6){ + } + */ + + if((*dfu_state == 3 || *dfu_state == 6)){ + if((ret = get_dfu_status(devh, dfu_status)) < 0){ + err("get_dfu 2 failed: %d", ret); + return ret; + } + *dfu_state = dfu_status[4]; /* what an ugly hardware... */ + + if(*dfu_state == 7){ + return 0; + } + + if((*dfu_state != 5) && (*dfu_state != 6) && (*dfu_state != 3) && + (*dfu_state != 2) && (*dfu_state != 7)){ + /* TODO: fix this */ + err("cannot handle dfu_state(2) = %d", *dfu_state); + return -EIO; + } + } + // }while((dfu_state != 2) && (dfu_state != 5) && (dfu_state != 6)); + }while((*dfu_state != 2) && (*dfu_state != 5)); + + printf("fw_int, size = %d, bsize = %d, i = %d, buf = %p\n", size, bsize, i, buf); + if((ret = set_dfu_block_int(devh, i, buf, bsize)) < 0){ + err("fw_int failed: %d, i = %d", ret, i); + return ret; + } + buf += bsize; + size -= bsize; + i++; + } + free(dfu_status); + free(dfu_state); + free(buf); + return 0; +} + +static int fw_download_ext(struct usb_dev_handle *devh, unsigned char *buf, int size) +{ + int i = 0, ret; + unsigned char dev_mode; + unsigned char *tmpbuf = malloc(1024); + + if((ret = get_op_mode(devh, &dev_mode)) < 0){ + fprintf(stderr, "get_op_mode failed, ret = %d", ret); + } + + if(dev_mode != 4){ + err("dev_mode = %d != 4, that's bad", dev_mode); + } + + while(size > 0){ + int bsize = size > 1024 ? 1024 : size; + int ret; + + memcpy(tmpbuf, buf, bsize); + printf("fw_ext, size = %d, bsize = %d, i = %d, buf = %p\n", size, bsize, i, buf); + if((ret = set_dfu_block_ext(devh, i, tmpbuf, bsize)) < 0){ + err("fw_ext failed: %d, i = %d", ret, i); + return ret; + } + buf += bsize; + size -= bsize; + i++; + } + if((ret = set_dfu_block_ext(devh, i, tmpbuf, 0)) < 0){ + err("fw_ext failed: %d, i = %d", ret, i); + return ret; + } + free(tmpbuf); + return 0; +} + +int main(int argc, char *argv[]) +{ + struct usb_bus *bus; + struct usb_device *dev; + int do_int = 0, do_ext = 0, c; + + usb_init(); + usb_set_debug(0); + + while(1){ + c = getopt(argc, argv, "ie"); + + if(c == -1) + break; + + switch(c){ + case 'i': + do_int = 1; + break; + case 'e': + do_ext = 1; + break; + case '?': + break; + } + } + + usb_find_busses(); + usb_find_devices(); + + printf("bus/device idVendor/idProduct\n"); + for (bus = usb_busses; bus; bus = bus->next) { + for (dev = bus->devices; dev; dev = dev->next) { + + if ((dev->descriptor.idVendor == USB_BELKIN_VENDOR_ID) && + (dev->descriptor.idProduct == USB_BELKIN_PRODUCT_ID)) { + printf("Belkin USB Adapter found\n"); + goto endloop; + } + + printf("%s/%s %04X/%04X\n", bus->dirname, dev->filename, + dev->descriptor.idVendor, dev->descriptor.idProduct); + + if (!dev->config) { + fprintf(stderr, "Couldn't retrieve descriptors\n"); + continue; + } + } + } + + endloop: + if(bus && dev){ + struct usb_dev_handle *devh = usb_open(dev); + int ret; + unsigned char *dummy = malloc(1); + + if(!devh){ + fprintf(stderr, " could not open dev: %s\n", strerror(errno)); + exit(1); + } + + ret = usb_claim_interface(devh, 0); + if(ret < 0){ + fprintf(stderr, "usb_claim_interface failed, ret = %d\n", ret); + } + + if(do_int){ + ret = get_op_mode(devh, dummy); + if(ret < 0){ + fprintf(stderr, "get_op_mode failed, ret = %d (no problem)", ret); + } + + printf("download int\n"); + ret = fw_download_int(devh, InternalRFMD, sizeof(InternalRFMD)); + if(ret < 0){ + fprintf(stderr, "download int failed: %s\n", strerror(errno)); + goto close; + } + + sleep(1); + + printf("remap\n"); + ret = set_remap(devh); + if(ret < 0){ + fprintf(stderr, "remap failed: %s\n", strerror(errno)); + goto close; + } + + sleep(2); + + /* + usb_close(devh); + usb_init(); + devh = usb_open(dev); + */ + + printf("reset\n"); + ret = usb_reset(devh); + if(ret < 0){ + fprintf(stderr, "reset failed: %s\n", strerror(errno)); + goto close; + } + + } + + if(do_ext){ + usb_set_configuration(devh, 1); + if(ret < 0){ + fprintf(stderr, "usb_set_configuration failed: %s\n", strerror(errno)); + // goto close; + } + + printf("download ext\n"); + ret = fw_download_ext(devh, ExternalRFMD, sizeof(ExternalRFMD)); + if(ret < 0){ + fprintf(stderr, "download ext failed: %s\n", strerror(errno)); + goto close; + } + } +close: + usb_release_interface(devh, 0); + usb_close(devh); + + }else{ + printf("Belkin USB Adapter NOT found\n"); + exit(1); + } + + return 0; +} diff --git a/externalr.h b/externalr.h new file mode 100644 index 0000000..8aec953 --- /dev/null +++ b/externalr.h @@ -0,0 +1,1500 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) 1999-2000 by Atmel Corporation */ +/* */ +/* This software is copyrighted by and is the sole property of Atmel */ +/* Corporation. All rights, title, ownership, or other interests */ +/* in the software remain the property of Atmel Corporation. This */ +/* software may only be used in accordance with the corresponding */ +/* license agreement. Any un-authorized use, duplication, transmission, */ +/* distribution, or disclosure of this software is expressly forbidden. */ +/* */ +/* This Copyright notice may not be removed or modified without prior */ +/* written consent of Atmel Corporation. */ +/* */ +/* Atmel Corporation, Inc. reserves the right to modify this software */ +/* without notice. */ +/* */ +/* Atmel Corporation. */ +/* 2325 Orchard Parkway literature@atmel.com */ +/* San Jose, CA 95131 http://www.atmel.com */ +/* */ +/**************************************************************************/ +/**************************************************************************/ +/* */ +/* Automatically generated FW file for AT76C502A */ +/* */ +/**************************************************************************/ + + +UCHAR ExternalRFMD[] = {0x80,0xB5,0x10,0x49,0x00,0x20,0x08,0x70,0x0F,0x48 + ,0x81,0x79,0xC0,0x79,0x00,0x02,0x08,0x43,0x68,0x28 + ,0x04,0xD0,0x03,0x21,0x0B,0x20,0x00,0xF0,0xEB,0xFC + ,0x80,0xBD,0x08,0x21,0x0B,0x20,0x00,0xF0,0xE6,0xFC + ,0xC0,0x20,0xFE,0xF7,0xFD,0xF8,0x07,0x1C,0x00,0xF0 + ,0xA6,0xFA,0x38,0x1C,0xFE,0xF7,0xF7,0xF8,0x01,0x21 + ,0x0B,0x20,0x00,0xF0,0xD9,0xFC,0x80,0xBD,0x94,0x01 + ,0x00,0x02,0xC4,0x09,0x00,0x02,0xB0,0xB5,0x27,0x4C + ,0x20,0x78,0x0A,0x28,0x40,0xD2,0x02,0xA3,0x1B,0x5C + ,0x5B,0x00,0x9F,0x44,0x00,0x1C,0x3C,0x05,0x09,0x0D + ,0x3C,0x11,0x15,0x19,0x3C,0x1D,0xA0,0x78,0x20,0x49 + ,0x45,0x18,0x16,0xE0,0xA0,0x78,0x1F,0x49,0x45,0x18 + ,0x12,0xE0,0xA0,0x78,0x1E,0x49,0x45,0x18,0x0E,0xE0 + ,0xA0,0x78,0x1D,0x49,0x45,0x18,0x0A,0xE0,0xA0,0x78 + ,0x1C,0x49,0x45,0x18,0x06,0xE0,0xA0,0x78,0x1B,0x49 + ,0x45,0x18,0x02,0xE0,0xA0,0x78,0x1A,0x49,0x45,0x18 + ,0x00,0x2D,0x1E,0xD0,0xC0,0x20,0xFE,0xF7,0xBF,0xF8 + ,0x61,0x78,0x07,0x1C,0x00,0x20,0x00,0x29,0x07,0xD9 + ,0x21,0x18,0x09,0x79,0x01,0x30,0x29,0x70,0x61,0x78 + ,0x01,0x35,0x81,0x42,0xF7,0xD8,0x02,0xF0,0x32,0xFE + ,0x38,0x1C,0xFE,0xF7,0xAD,0xF8,0x01,0x21,0x01,0x20 + ,0x00,0xF0,0x8F,0xFC,0xB0,0xBD,0x04,0x21,0x01,0x20 + ,0x00,0xF0,0x8A,0xFC,0xB0,0xBD,0x03,0x21,0x01,0x20 + ,0x00,0xF0,0x85,0xFC,0xB0,0xBD,0xCC,0x09,0x00,0x02 + ,0x04,0x01,0x00,0x02,0x5C,0x00,0x00,0x02,0xC0,0x00 + ,0x00,0x02,0x80,0x00,0x00,0x02,0x18,0x00,0x00,0x02 + ,0x00,0x00,0x00,0x02,0x14,0x01,0x00,0x02,0xF0,0xB5 + ,0x82,0xB0,0x5A,0x49,0x0E,0x20,0x08,0x83,0x5A,0x4A + ,0x60,0x39,0x57,0x4C,0x01,0x92,0x50,0x7A,0xCD,0x1D + ,0xCF,0x1D,0xE6,0x1D,0x19,0x36,0x69,0x37,0x49,0x35 + ,0x00,0x28,0x2F,0xD0,0xF0,0x7B,0x54,0x49,0x00,0x28 + ,0x18,0xD0,0xF0,0x79,0x01,0x28,0x01,0xDB,0x0E,0x28 + ,0x05,0xDD,0x03,0x21,0x03,0x20,0x00,0xF0,0x55,0xFC + ,0x02,0xB0,0xF0,0xBD,0x00,0x20,0x00,0x22,0x0B,0x18 + ,0x9A,0x73,0x0A,0x54,0x01,0x30,0x00,0x04,0x00,0x0C + ,0x0E,0x28,0xF7,0xDB,0xFA,0x71,0x01,0x21,0xE9,0x71 + ,0x29,0xE0,0xF0,0x79,0x41,0x18,0x49,0x7B,0x00,0x29 + ,0x0A,0xD1,0x02,0xF0,0x96,0xF9,0x00,0x06,0x00,0x0E + ,0xF0,0x71,0x04,0xD1,0x03,0x21,0x03,0x20,0x00,0xF0 + ,0x36,0xFC,0xDF,0xE7,0x00,0x22,0xEA,0x71,0x16,0xE0 + ,0xF8,0x7A,0x3D,0x49,0x40,0x00,0x08,0x5A,0xF1,0x79 + ,0x00,0x91,0x4A,0x1E,0x01,0x21,0x91,0x40,0x08,0x40 + ,0x0B,0xD1,0x00,0x98,0x02,0xF0,0x7C,0xF9,0xF0,0x71 + ,0xF0,0x79,0x00,0x28,0x04,0xD1,0x03,0x21,0x03,0x20 + ,0x00,0xF0,0x1C,0xFC,0xC5,0xE7,0xC0,0x20,0xFE,0xF7 + ,0x32,0xF8,0x06,0x1C,0x04,0x20,0xFB,0xF7,0x40,0xFE + ,0x2F,0x49,0x00,0x20,0x2F,0x4A,0x0B,0x18,0x12,0x5C + ,0x01,0x30,0x00,0x04,0x00,0x0C,0x04,0x28,0x1A,0x74 + ,0xF6,0xDB,0x2C,0x48,0x2C,0x4A,0x00,0x88,0x00,0x23 + ,0x10,0x80,0xC8,0x1D,0x09,0x30,0x0E,0x22,0x04,0x21 + ,0x01,0xF0,0x8C,0xFE,0x01,0x21,0xA9,0x71,0x27,0x48 + ,0x04,0x21,0x01,0x75,0x00,0x21,0xB9,0x72,0x06,0x22 + ,0x21,0x1C,0x25,0x48,0xFE,0xF7,0xF0,0xFB,0xA1,0x1D + ,0x20,0x22,0x23,0x48,0xFE,0xF7,0xEB,0xFB,0xE0,0x1D + ,0x19,0x30,0x81,0x7B,0x21,0x4A,0x51,0x71,0x00,0x21 + ,0x69,0x70,0x01,0x9A,0x20,0x23,0x91,0x71,0x81,0x79 + ,0x1E,0x4A,0x91,0x74,0xC0,0x79,0xD0,0x74,0x20,0x8D + ,0x90,0x82,0x60,0x8D,0xD0,0x82,0xA0,0x8D,0x10,0x83 + ,0x1A,0x48,0x01,0x78,0x19,0x43,0x01,0x70,0x01,0x21 + ,0xF9,0x70,0x01,0x9A,0x51,0x71,0xB8,0x78,0x01,0x28 + ,0x02,0xD1,0x00,0x20,0x03,0xF0,0xC0,0xF9,0x00,0x20 + ,0xB8,0x70,0x30,0x1C,0xFD,0xF7,0xDF,0xFF,0x01,0x20 + ,0x28,0x70,0x08,0x21,0x03,0x20,0x00,0xF0,0xBF,0xFB + ,0x68,0xE7,0xCC,0x09,0x00,0x02,0xA4,0x09,0x00,0x02 + ,0xB0,0x00,0x00,0x02,0x14,0x01,0x00,0x02,0x6C,0x02 + ,0x00,0x02,0x00,0x00,0x00,0x02,0x84,0x02,0x00,0x02 + ,0x38,0x01,0x00,0x02,0x80,0x00,0x00,0x02,0x44,0x09 + ,0x00,0x02,0xFC,0x00,0x00,0x02,0xDC,0x00,0x00,0x02 + ,0x04,0x01,0x00,0x02,0xC0,0x00,0x00,0x02,0x94,0x01 + ,0x00,0x02,0xF0,0xB5,0x82,0xB0,0x41,0x49,0x40,0x4E + ,0x01,0x91,0x48,0x7A,0xF4,0x1D,0x19,0x34,0x00,0x28 + ,0x3F,0x4F,0x13,0xD0,0xF8,0x79,0x00,0x28,0x05,0xD1 + ,0x03,0x21,0x04,0x20,0x00,0xF0,0x8E,0xFB,0x02,0xB0 + ,0xF0,0xBD,0xE0,0x79,0x3A,0x49,0x40,0x18,0x40,0x7B + ,0x00,0x28,0x13,0xD1,0x03,0x21,0x04,0x20,0x00,0xF0 + ,0x82,0xFB,0xF2,0xE7,0xF8,0x7A,0x35,0x49,0x40,0x00 + ,0x08,0x5A,0xE1,0x79,0x01,0x22,0x01,0x39,0x8A,0x40 + ,0x10,0x40,0x04,0xD1,0x03,0x21,0x04,0x20,0x00,0xF0 + ,0x73,0xFB,0xE3,0xE7,0xC0,0x20,0xFD,0xF7,0x89,0xFF + ,0x00,0x90,0xA0,0x79,0x2D,0x4D,0x02,0x28,0x02,0xD1 + ,0x03,0x20,0xA8,0x71,0x03,0xE0,0x01,0x28,0x40,0xD1 + ,0x04,0x20,0xA8,0x71,0x04,0x20,0xFB,0xF7,0x8C,0xFD + ,0x27,0x49,0x00,0x20,0x88,0x70,0xA0,0x79,0x26,0x49 + ,0x06,0x22,0x88,0x70,0x08,0x1F,0x31,0x1C,0xFE,0xF7 + ,0x53,0xFB,0xB1,0x1D,0x20,0x22,0x23,0x48,0xFE,0xF7 + ,0x4E,0xFB,0xA0,0x7A,0x1F,0x49,0x48,0x71,0x00,0x20 + ,0x68,0x70,0x01,0x99,0x88,0x71,0x08,0x21,0x04,0x20 + ,0x00,0xF0,0x45,0xFB,0x01,0x20,0xF8,0x70,0x01,0x99 + ,0x48,0x71,0xB8,0x78,0x01,0x28,0x02,0xD1,0x00,0x20 + ,0x03,0xF0,0x31,0xF9,0x00,0x20,0xB8,0x70,0x17,0x48 + ,0x20,0x23,0x01,0x78,0x19,0x43,0x01,0x70,0x01,0x78 + ,0x10,0x23,0x99,0x43,0x01,0x70,0x00,0x98,0xFD,0xF7 + ,0x47,0xFF,0x30,0x8D,0x81,0x02,0x04,0x20,0xFB,0xF7 + ,0x3A,0xFD,0xE0,0x79,0x03,0xF0,0x93,0xF8,0x95,0xE7 + ,0x03,0x21,0x04,0x20,0x00,0xF0,0x20,0xFB,0x00,0x98 + ,0xFD,0xF7,0x37,0xFF,0x8D,0xE7,0xCC,0x09,0x00,0x02 + ,0xB0,0x00,0x00,0x02,0xB4,0x09,0x00,0x02,0x14,0x01 + ,0x00,0x02,0x6C,0x02,0x00,0x02,0x94,0x09,0x00,0x02 + ,0x04,0x01,0x00,0x02,0x00,0x01,0x00,0x02,0xDC,0x00 + ,0x00,0x02,0x94,0x01,0x00,0x02,0xF0,0xB5,0x25,0x48 + ,0x10,0x23,0x01,0x78,0x22,0x4C,0x99,0x43,0x01,0x70 + ,0x01,0x78,0x20,0x23,0x99,0x43,0x01,0x70,0x21,0x48 + ,0x21,0x49,0xC0,0x7A,0x40,0x00,0x09,0x5A,0xE7,0x18 + ,0xF8,0x79,0x01,0x25,0x42,0x1E,0x2B,0x1C,0x93,0x40 + ,0x19,0x40,0x04,0xD1,0x03,0x21,0x05,0x20,0x00,0xF0 + ,0xEC,0xFA,0xF0,0xBD,0xB9,0x79,0x01,0x29,0x04,0xD0 + ,0x03,0x21,0x05,0x20,0x00,0xF0,0xE4,0xFA,0xF0,0xBD + ,0x03,0xF0,0x4F,0xF8,0xC0,0x20,0xFD,0xF7,0xF8,0xFE + ,0x06,0x1C,0x38,0x7A,0x12,0x4F,0x78,0x71,0x12,0x48 + ,0xC1,0x1D,0x39,0x31,0x8D,0x70,0xA1,0x1D,0x1C,0x30 + ,0x0C,0x1C,0x7A,0x79,0xFE,0xF7,0xCE,0xFA,0x7A,0x79 + ,0x0E,0x4F,0x21,0x1C,0xF8,0x1D,0x0D,0x30,0xFE,0xF7 + ,0xC7,0xFA,0x00,0x20,0xF9,0x1D,0x29,0x31,0x88,0x71 + ,0x00,0xF0,0x13,0xF8,0x30,0x1C,0xFD,0xF7,0xDA,0xFE + ,0xF0,0xBD,0x00,0x00,0xCC,0x09,0x00,0x02,0x94,0x01 + ,0x00,0x02,0xB4,0x09,0x00,0x02,0x6C,0x02,0x00,0x02 + ,0x04,0x01,0x00,0x02,0xC0,0x00,0x00,0x02,0x80,0x00 + ,0x00,0x02,0xF0,0xB5,0xF9,0xF7,0x25,0xFF,0xFE,0xF7 + ,0x47,0xFB,0xF9,0xF7,0x21,0xFF,0x2C,0x4F,0x02,0x21 + ,0xB9,0x73,0x00,0x21,0xF9,0x73,0x38,0x74,0x01,0x0A + ,0x79,0x74,0x01,0x0C,0x00,0x0E,0xB9,0x74,0x27,0x4E + ,0xF8,0x74,0xF9,0x1D,0x07,0x31,0xF0,0x1D,0x06,0x22 + ,0x35,0x30,0xFE,0xF7,0x93,0xFA,0x24,0x4C,0x01,0x25 + ,0xF8,0x1D,0x29,0x30,0x25,0x75,0x05,0x71,0x22,0x48 + ,0xF1,0x1D,0x42,0x79,0xF8,0x1D,0x0D,0x30,0x15,0x31 + ,0xFE,0xF7,0x85,0xFA,0x1F,0x48,0x1F,0x4A,0x00,0x21 + ,0x53,0x5C,0x46,0x18,0x01,0x31,0x04,0x29,0x33,0x74 + ,0xF9,0xD3,0x1C,0x49,0x00,0x23,0x09,0x88,0x39,0x80 + ,0x02,0x7D,0x04,0x21,0x10,0x30,0x01,0xF0,0x03,0xFD + ,0x19,0x48,0x20,0x23,0x01,0x78,0x19,0x43,0x01,0x70 + ,0x01,0x78,0x10,0x23,0x19,0x43,0x01,0x70,0x10,0x48 + ,0x85,0x70,0xFB,0xF7,0x56,0xFC,0x39,0x88,0x89,0x02 + ,0x09,0x1A,0x06,0x20,0xFB,0xF7,0x74,0xFC,0xE0,0x1D + ,0x49,0x30,0x45,0x70,0x05,0x21,0x81,0x71,0x0E,0x48 + ,0x01,0x68,0x0E,0x48,0xC2,0x69,0x11,0x43,0xC1,0x61 + ,0x0D,0x48,0x01,0x21,0x05,0x70,0x05,0x20,0x00,0xF0 + ,0x51,0xFA,0xF0,0xBD,0x80,0x00,0x00,0x02,0xC0,0x00 + ,0x00,0x02,0x44,0x09,0x00,0x02,0x04,0x01,0x00,0x02 + ,0x00,0x00,0x00,0x02,0x84,0x02,0x00,0x02,0x38,0x01 + ,0x00,0x02,0x94,0x01,0x00,0x02,0xA4,0x02,0x00,0x02 + ,0x40,0x00,0x00,0x04,0x3A,0x01,0x00,0x02,0xF0,0xB5 + ,0x54,0x4F,0x54,0x4E,0xFC,0x1D,0xF9,0x1D,0x09,0x31 + ,0x59,0x34,0x0D,0x1C,0xF0,0x1D,0x0D,0x30,0x22,0x79 + ,0xFE,0xF7,0x2B,0xFA,0x22,0x79,0x29,0x1C,0x4F,0x48 + ,0xFE,0xF7,0x26,0xFA,0x20,0x79,0x4E,0x49,0x4E,0x4A + ,0x48,0x71,0xB8,0x7B,0x00,0x28,0x03,0xD1,0x10,0x70 + ,0xF0,0x72,0x50,0x70,0x08,0xE0,0x01,0x20,0x10,0x70 + ,0xF0,0x72,0xF8,0x7B,0xD1,0x1D,0x39,0x31,0x50,0x70 + ,0xF8,0x78,0x08,0x70,0x00,0x25,0x0D,0x20,0x68,0x43 + ,0xC1,0x19,0x43,0x4A,0x30,0x31,0x80,0x18,0x0D,0x22 + ,0x0C,0x30,0xFE,0xF7,0x07,0xFA,0x01,0x35,0x04,0x2D + ,0xF2,0xD3,0x60,0x79,0x00,0x28,0x03,0xD0,0x3C,0x49 + ,0x01,0x20,0x48,0x72,0x02,0xE0,0x3A,0x49,0x00,0x20 + ,0x48,0x72,0x78,0x7B,0x3A,0x49,0x0E,0x28,0x02,0xDC + ,0x01,0x28,0x00,0xDB,0x08,0x75,0xB8,0x78,0x37,0x4A + ,0x10,0x74,0x38,0x7B,0x01,0x28,0x02,0xD1,0x32,0x4B + ,0xD8,0x70,0x02,0xE0,0x30,0x4B,0x00,0x20,0xD8,0x70 + ,0xF8,0x88,0x10,0x81,0xB8,0x88,0x50,0x81,0x38,0x78 + ,0x2D,0x4A,0xD0,0x70,0xE0,0x88,0x2F,0x4A,0x30,0x80 + ,0x00,0x20,0x3B,0x18,0x1C,0x7A,0x0D,0x18,0x2C,0x74 + ,0x1B,0x7A,0x13,0x54,0x01,0x30,0x04,0x28,0xF6,0xD3 + ,0x30,0x88,0x29,0x4A,0x00,0x23,0x10,0x80,0xC8,0x1D + ,0x09,0x30,0x0F,0x1C,0x0E,0x22,0x04,0x21,0x01,0xF0 + ,0x58,0xFC,0x00,0xF0,0xFA,0xF8,0x24,0x4C,0x25,0x49 + ,0xE0,0x1D,0x69,0x30,0xC0,0x7A,0x08,0x5C,0x38,0x75 + ,0x23,0x4F,0x38,0x78,0x02,0x28,0x28,0xD1,0x02,0xF0 + ,0xA5,0xFB,0x03,0xF0,0xC6,0xF8,0x17,0x49,0x88,0x78 + ,0x00,0x28,0x07,0xD0,0xFB,0xF7,0xA1,0xFB,0x31,0x88 + ,0x89,0x02,0x09,0x1A,0x06,0x20,0xFB,0xF7,0xBF,0xFB + ,0x01,0x20,0x00,0xF0,0xC6,0xF9,0x02,0xF0,0x44,0xFB + ,0x01,0x20,0xF9,0xF7,0x21,0xFE,0x01,0x20,0x80,0x06 + ,0x80,0x69,0xFE,0xF7,0x3C,0xFA,0xFB,0xF7,0x82,0xFB + ,0xFB,0xF7,0x08,0xF8,0xFE,0xF7,0x18,0xFA,0x80,0x06 + ,0x80,0x0E,0xA0,0x62,0x01,0x20,0x38,0x70,0xF0,0xBD + ,0x02,0xF0,0x2E,0xFB,0xF0,0xBD,0x00,0x00,0xCC,0x09 + ,0x00,0x02,0x80,0x00,0x00,0x02,0xDC,0x00,0x00,0x02 + ,0x04,0x01,0x00,0x02,0x18,0x00,0x00,0x02,0x00,0x00 + ,0x00,0x02,0xC0,0x00,0x00,0x02,0x84,0x02,0x00,0x02 + ,0x38,0x01,0x00,0x02,0x44,0x09,0x00,0x02,0x7C,0x02 + ,0x00,0x02,0x3B,0x01,0x00,0x02,0x80,0xB5,0x1D,0x49 + ,0x1B,0x4A,0x0F,0x68,0x0B,0x2F,0x23,0xD2,0x01,0xA3 + ,0xDB,0x5D,0x5B,0x00,0x9F,0x44,0x1F,0x05,0x0A,0x0D + ,0x10,0x12,0x15,0x18,0x1F,0x1B,0x1E,0x00,0x06,0x23 + ,0xFF,0x20,0x01,0x30,0x8B,0x60,0x14,0xE0,0xFF,0x20 + ,0x41,0x30,0x11,0xE0,0xFF,0x20,0x51,0x30,0x0E,0xE0 + ,0x0B,0x20,0x0C,0xE0,0xFF,0x20,0x31,0x30,0x09,0xE0 + ,0xFF,0x20,0x11,0x30,0x06,0xE0,0xFF,0x20,0x61,0x30 + ,0x03,0xE0,0xFF,0x20,0x71,0x30,0x00,0xE0,0x00,0x20 + ,0x01,0x23,0x4B,0x60,0x89,0x68,0x00,0xF0,0xD4,0xF9 + ,0x04,0x21,0x0C,0x20,0x00,0xF0,0x45,0xF9,0x0F,0x20 + ,0x00,0x06,0x81,0x88,0x03,0x4B,0x19,0x43,0x81,0x80 + ,0x80,0xBD,0x58,0x0A,0x00,0x02,0x98,0x02,0x00,0x02 + ,0x08,0x08,0x00,0x00,0xB0,0xB5,0x0D,0x4D,0x00,0x24 + ,0xE8,0x1D,0x49,0x30,0x0C,0x4F,0x04,0x70,0xF8,0x7C + ,0x02,0xF0,0x9C,0xFE,0xE8,0x1D,0x69,0x30,0x84,0x72 + ,0x38,0x8B,0x81,0x02,0x04,0x20,0xFB,0xF7,0x38,0xFB + ,0xB8,0x7C,0x00,0x28,0x03,0xD1,0x01,0x20,0xA8,0x77 + ,0x00,0x05,0xB0,0xBD,0x20,0x1C,0xB0,0xBD,0x00,0x00 + ,0x44,0x09,0x00,0x02,0xC0,0x00,0x00,0x02,0x04,0x48 + ,0x00,0x21,0xC2,0x1D,0x49,0x32,0x91,0x70,0x01,0x21 + ,0x81,0x77,0x10,0x20,0xF7,0x46,0x00,0x00,0x44,0x09 + ,0x00,0x02,0x03,0x48,0x00,0x21,0xC1,0x73,0x01,0x21 + ,0x81,0x73,0x08,0x07,0xF7,0x46,0x00,0x00,0x54,0x09 + ,0x00,0x02,0x04,0x48,0x00,0x21,0xC2,0x1D,0x49,0x32 + ,0x51,0x71,0x01,0x21,0x81,0x77,0x08,0x05,0xF7,0x46 + ,0x00,0x00,0x44,0x09,0x00,0x02,0xB0,0xB5,0x04,0x20 + ,0xFB,0xF7,0x1E,0xFB,0x0F,0x48,0xC7,0x1D,0x49,0x37 + ,0xB9,0x79,0x01,0x29,0x16,0xD1,0x03,0x21,0x70,0x30 + ,0x81,0x72,0x00,0x25,0x0B,0x4C,0x7D,0x71,0xE0,0x7C + ,0x01,0xF0,0x3B,0xFE,0x00,0x28,0x07,0xD1,0x3D,0x70 + ,0x02,0x20,0xB8,0x71,0x01,0x21,0x03,0x20,0x00,0xF0 + ,0xDA,0xF8,0xB0,0xBD,0x01,0x21,0x39,0x70,0xE0,0x74 + ,0xB0,0xBD,0x02,0xF0,0xFB,0xF9,0xB0,0xBD,0x44,0x09 + ,0x00,0x02,0xC0,0x00,0x00,0x02,0x12,0x49,0xC9,0x7D + ,0x32,0x29,0x1A,0xD0,0x09,0xDC,0x10,0x29,0x11,0xD0 + ,0x20,0x29,0x11,0xD0,0x30,0x29,0x11,0xD0,0x31,0x29 + ,0x08,0xD1,0x03,0x20,0x06,0xE0,0x40,0x29,0x0F,0xD0 + ,0x41,0x29,0x0F,0xD0,0x50,0x29,0x00,0xD1,0x07,0x20 + ,0x08,0x49,0xC8,0x72,0xF7,0x46,0x00,0x20,0xFA,0xE7 + ,0x01,0x20,0xF8,0xE7,0x02,0x20,0xF6,0xE7,0x04,0x20 + ,0xF4,0xE7,0x05,0x20,0xF2,0xE7,0x06,0x20,0xF0,0xE7 + ,0x00,0x00,0x00,0x00,0x00,0x02,0xB4,0x09,0x00,0x02 + ,0xF0,0xB5,0x1E,0x4D,0x01,0x24,0x28,0x78,0x01,0x28 + ,0x30,0xD1,0x1C,0x4C,0x1D,0x49,0xE0,0x7A,0x1D,0x4E + ,0x08,0x5C,0x30,0x75,0xC0,0x20,0xFD,0xF7,0xAF,0xFC + ,0x07,0x1C,0x1A,0x48,0x01,0x78,0x02,0x29,0x06,0xD1 + ,0x01,0x21,0x01,0x70,0x30,0x7D,0x02,0xF0,0x03,0xFD + ,0x20,0x73,0x0D,0xE0,0x07,0x20,0x40,0x06,0xC1,0x69 + ,0x10,0x23,0x99,0x43,0xC1,0x61,0x13,0x48,0x01,0x21 + ,0x41,0x71,0x00,0x20,0x02,0xF0,0x73,0xFE,0x00,0x20 + ,0xA0,0x70,0x20,0x7B,0x01,0x28,0x01,0xD1,0x00,0x20 + ,0x28,0x70,0x20,0x7B,0x01,0x21,0x00,0x28,0x00,0xD1 + ,0x05,0x21,0x38,0x1C,0x0C,0x1C,0xFD,0xF7,0x87,0xFC + ,0x21,0x06,0x09,0x0E,0x06,0x20,0x00,0xF0,0x68,0xF8 + ,0xF0,0xBD,0x00,0x00,0xB3,0x02,0x00,0x02,0xB4,0x09 + ,0x00,0x02,0x7C,0x02,0x00,0x02,0x00,0x00,0x00,0x02 + ,0xB2,0x02,0x00,0x02,0xB0,0x00,0x00,0x02,0x00,0xB5 + ,0x12,0x48,0x01,0x78,0x0D,0x29,0x1A,0xD2,0x02,0xA3 + ,0x5B,0x5C,0x5B,0x00,0x9F,0x44,0x00,0x1C,0x16,0x07 + ,0x16,0x07,0x07,0x07,0x0B,0x0E,0x16,0x16,0x07,0x07 + ,0x07,0x00,0x0B,0x49,0x01,0x20,0x08,0x70,0x00,0xBD + ,0xFF,0xF7,0x9F,0xFF,0x00,0xBD,0x08,0x49,0x02,0x20 + ,0x08,0x70,0x08,0x21,0x07,0x20,0x00,0xF0,0x3B,0xF8 + ,0x00,0xBD,0x00,0x78,0x02,0x21,0x00,0xF0,0x36,0xF8 + ,0x00,0xBD,0x00,0x00,0xC4,0x09,0x00,0x02,0xD5,0x01 + ,0x00,0x02,0x3C,0x01,0x00,0x02,0x00,0xB5,0x15,0x48 + ,0x01,0x78,0x0D,0x29,0x20,0xD2,0x02,0xA3,0x5B,0x5C + ,0x5B,0x00,0x9F,0x44,0x00,0x1C,0x1C,0x07,0x1C,0x0A + ,0x0D,0x13,0x1C,0x1C,0x1C,0x1C,0x10,0x16,0x19,0x00 + ,0xFF,0xF7,0x47,0xFB,0x00,0xBD,0xFF,0xF7,0xA4,0xFB + ,0x00,0xBD,0xFF,0xF7,0x75,0xFC,0x00,0xBD,0x00,0xF0 + ,0xA2,0xFD,0x00,0xBD,0xFF,0xF7,0x07,0xFD,0x00,0xBD + ,0xFF,0xF7,0x12,0xFB,0x00,0xBD,0xFF,0xF7,0x91,0xFE + ,0x00,0xBD,0x00,0x78,0x02,0x21,0x00,0xF0,0x04,0xF8 + ,0x00,0xBD,0x00,0x00,0xC4,0x09,0x00,0x02,0x04,0x4A + ,0x10,0x70,0x04,0x48,0x01,0x70,0x04,0x48,0x00,0x21 + ,0x01,0x70,0x41,0x70,0xF7,0x46,0x00,0x00,0x5C,0x02 + ,0x00,0x02,0x5D,0x02,0x00,0x02,0xC4,0x09,0x00,0x02 + ,0x04,0x48,0x00,0x21,0xC2,0x1D,0x69,0x32,0x51,0x70 + ,0x01,0x21,0x81,0x77,0x08,0x02,0xF7,0x46,0x00,0x00 + ,0x44,0x09,0x00,0x02,0x80,0xB5,0x0F,0x4F,0x01,0x28 + ,0x03,0xD1,0xF9,0xF7,0x56,0xFC,0xF8,0x62,0x38,0x63 + ,0x0C,0x48,0x01,0x21,0x80,0x89,0x0C,0x4A,0xB8,0x87 + ,0x39,0x72,0x79,0x72,0x39,0x73,0x00,0x20,0x38,0x74 + ,0x38,0x60,0xB8,0x72,0xF8,0x72,0x10,0x70,0xB9,0x73 + ,0x79,0x60,0x06,0x49,0xCA,0x7A,0x06,0x49,0xCA,0x70 + ,0x88,0x70,0x08,0x70,0x80,0xBD,0x00,0x00,0x44,0x09 + ,0x00,0x02,0xC0,0x00,0x00,0x02,0xE0,0x01,0x00,0x02 + ,0x04,0x01,0x00,0x02,0xC8,0x01,0x00,0x02,0xB0,0xB5 + ,0xF3,0x25,0x2D,0x05,0x07,0x1C,0xA8,0x68,0x06,0x20 + ,0xE8,0x60,0x0C,0x1C,0x28,0x69,0x80,0x08,0xFC,0xD3 + ,0x0A,0x20,0xF9,0xF7,0x10,0xFC,0xA8,0x68,0x78,0x09 + ,0x08,0x23,0x18,0x40,0x02,0x23,0x18,0x43,0xE8,0x60 + ,0x28,0x69,0x80,0x08,0xFC,0xD3,0x38,0x06,0x00,0x0E + ,0xE8,0x60,0x28,0x69,0x80,0x08,0xFC,0xD3,0xA8,0x68 + ,0x20,0x06,0x00,0x0E,0xE8,0x60,0x28,0x69,0x80,0x08 + ,0xFC,0xD3,0xA8,0x68,0xB0,0xBD,0xF0,0xB5,0x14,0x1C + ,0x0D,0x1C,0x07,0x1C,0xFC,0xF7,0x69,0xFE,0x00,0x26 + ,0x00,0x2F,0x10,0xD9,0xFC,0xF7,0xB6,0xFE,0x40,0x08 + ,0xFB,0xD2,0x28,0x20,0xF9,0xF7,0xE7,0xFB,0xA9,0x5D + ,0xA0,0x19,0xFF,0xF7,0xC5,0xFF,0x28,0x20,0xF9,0xF7 + ,0xE0,0xFB,0x01,0x36,0xBE,0x42,0xEE,0xD3,0xFC,0xF7 + ,0x71,0xFE,0x00,0x20,0xF0,0xBD,0xF0,0xB5,0x84,0xB0 + ,0x02,0x1C,0x48,0x4B,0x08,0x1C,0x19,0x68,0x46,0x4F + ,0x00,0x29,0x74,0xD0,0x59,0x68,0x01,0x29,0x72,0xD1 + ,0x00,0x24,0x0F,0x21,0x09,0x06,0x8C,0x80,0x8C,0x81 + ,0x0C,0x88,0xFE,0x1D,0x3C,0x36,0xF5,0x1F,0x09,0x89 + ,0x07,0x3D,0xEC,0x1F,0x12,0x3C,0x19,0x68,0xE3,0x1F + ,0x07,0x3B,0x03,0x93,0x20,0x33,0x02,0x93,0x04,0x3B + ,0x01,0x93,0x0A,0x33,0x00,0x93,0x0A,0x29,0x2F,0xD1 + ,0x0B,0x22,0x04,0x20,0x01,0x99,0xFF,0xF7,0xB8,0xFF + ,0xFF,0x22,0x06,0x20,0x01,0x32,0x02,0x99,0xFF,0xF7 + ,0xB2,0xFF,0xFF,0x22,0x0E,0x20,0x39,0x1C,0x41,0x32 + ,0xFF,0xF7,0xAC,0xFF,0xFF,0x22,0x0E,0x20,0x51,0x32 + ,0x03,0x99,0xFF,0xF7,0xA6,0xFF,0xFF,0x22,0x0E,0x20 + ,0x21,0x1C,0x11,0x32,0xFF,0xF7,0xA0,0xFF,0xFF,0x22 + ,0x0E,0x20,0x29,0x1C,0x61,0x32,0xFF,0xF7,0x9A,0xFF + ,0xFF,0x22,0x0E,0x20,0x31,0x1C,0x71,0x32,0xFF,0xF7 + ,0x94,0xFF,0xFF,0x22,0x01,0x20,0x31,0x32,0x00,0x99 + ,0xFF,0xF7,0x8E,0xFF,0x02,0xE0,0x39,0x1C,0xFF,0xF7 + ,0x8A,0xFF,0xFC,0xF7,0xF7,0xFD,0x06,0x22,0xFF,0x21 + ,0x01,0x31,0x02,0x98,0xFC,0xF7,0x58,0xFE,0x04,0x22 + ,0x0B,0x21,0x01,0x98,0xFC,0xF7,0x53,0xFE,0x0E,0x22 + ,0xFF,0x21,0x38,0x1C,0x41,0x31,0xFC,0xF7,0x4D,0xFE + ,0x0E,0x22,0xFF,0x21,0x51,0x31,0x03,0x98,0xFC,0xF7 + ,0x47,0xFE,0x0E,0x22,0xFF,0x21,0x28,0x1C,0x61,0x31 + ,0xFC,0xF7,0x41,0xFE,0x0E,0x22,0xFF,0x21,0x30,0x1C + ,0x71,0x31,0xFC,0xF7,0x3B,0xFE,0x01,0xE0,0x11,0xE0 + ,0x10,0xE0,0x0E,0x22,0xFF,0x21,0x20,0x1C,0x11,0x31 + ,0xFC,0xF7,0x32,0xFE,0x01,0x22,0xFF,0x21,0x31,0x31 + ,0x00,0x98,0xFC,0xF7,0x2C,0xFE,0xFC,0xF7,0xE1,0xFD + ,0x03,0x4B,0x00,0x24,0x1C,0x60,0x04,0xB0,0xF0,0xBD + ,0x58,0x0A,0x00,0x02,0x98,0x02,0x00,0x02,0x80,0xB4 + ,0x0C,0x4F,0x00,0x28,0x05,0xD1,0x00,0x29,0x03,0xD1 + ,0x01,0x2A,0x01,0xD1,0x01,0x2B,0x03,0xD1,0x20,0x20 + ,0x38,0x73,0x80,0xBC,0xF7,0x46,0x80,0x20,0x38,0x73 + ,0x05,0x48,0x06,0x49,0x00,0x68,0x10,0x23,0x08,0x73 + ,0x38,0x7B,0x18,0x43,0x38,0x73,0xF2,0xE7,0x00,0x00 + ,0x70,0x03,0x00,0x0D,0x2C,0x02,0x00,0x02,0x30,0x03 + ,0x00,0x0D,0x80,0xB4,0x0B,0x4F,0x00,0x28,0x05,0xD1 + ,0x00,0x29,0x03,0xD1,0x01,0x2A,0x01,0xD1,0x03,0x2B + ,0x03,0xD0,0x20,0x20,0x38,0x73,0x80,0xBC,0xF7,0x46 + ,0x80,0x20,0x38,0x73,0x04,0x49,0x00,0x20,0x08,0x73 + ,0x38,0x7B,0x10,0x23,0x18,0x43,0x38,0x73,0xF3,0xE7 + ,0x70,0x03,0x00,0x0D,0x30,0x03,0x00,0x0D,0x80,0xB4 + ,0x0C,0x4F,0x00,0x28,0x05,0xD1,0x00,0x29,0x03,0xD1 + ,0x02,0x2A,0x01,0xD1,0x01,0x2B,0x03,0xD1,0x20,0x20 + ,0x38,0x73,0x80,0xBC,0xF7,0x46,0x80,0x20,0x38,0x73 + ,0x05,0x48,0x00,0x21,0x01,0x73,0x01,0x73,0x38,0x7B + ,0x10,0x23,0x18,0x43,0x38,0x73,0xF2,0xE7,0x00,0x00 + ,0x70,0x03,0x00,0x0D,0x30,0x03,0x00,0x0D,0x00,0xB5 + ,0x00,0x28,0x05,0xD1,0x00,0x29,0x03,0xD1,0x00,0x2A + ,0x01,0xD1,0x03,0x2B,0x03,0xD0,0x06,0x49,0x20,0x20 + ,0x08,0x73,0x00,0xBD,0xFC,0xF7,0x4F,0xFB,0x04,0x49 + ,0x00,0x20,0x08,0x80,0x03,0x49,0x08,0x80,0x00,0xBD + ,0x00,0x00,0x70,0x03,0x00,0x0D,0x40,0x02,0x00,0x02 + ,0x42,0x02,0x00,0x02,0xB0,0xB4,0x20,0x25,0x00,0x28 + ,0x18,0x4C,0x03,0xD1,0x02,0x2A,0x01,0xD1,0x01,0x2B + ,0x02,0xD1,0x25,0x73,0xB0,0xBC,0xF7,0x46,0x08,0x06 + ,0x00,0x0E,0x02,0x2B,0x05,0xD1,0x00,0x28,0x01,0xD0 + ,0x25,0x73,0xF5,0xE7,0x00,0x27,0x10,0xE0,0x03,0x2B + ,0x0E,0xD1,0x00,0x28,0x08,0xD0,0x02,0x28,0x08,0xD0 + ,0x80,0x28,0x04,0xD0,0x85,0x28,0x11,0xD1,0x0A,0x48 + ,0x07,0x88,0x03,0xE0,0x00,0x27,0x01,0xE0,0x09,0x48 + ,0x07,0x88,0x80,0x20,0x20,0x73,0x08,0x48,0x00,0x21 + ,0x07,0x73,0x01,0x73,0x20,0x7B,0x10,0x23,0x18,0x43 + ,0x20,0x73,0xD7,0xE7,0x25,0x73,0xD5,0xE7,0x70,0x03 + ,0x00,0x0D,0x42,0x02,0x00,0x02,0x40,0x02,0x00,0x02 + ,0x30,0x03,0x00,0x0D,0x90,0xB5,0x20,0x27,0x00,0x28 + ,0x0C,0x4C,0x03,0xD1,0x00,0x2A,0x01,0xD1,0x03,0x2B + ,0x01,0xD0,0x27,0x73,0x90,0xBD,0x09,0x06,0x09,0x0E + ,0x01,0x20,0x02,0x29,0x04,0xD0,0x85,0x29,0x07,0xD1 + ,0x05,0x49,0x08,0x80,0x01,0xE0,0x05,0x49,0x08,0x80 + ,0xFC,0xF7,0xED,0xFA,0x90,0xBD,0x27,0x73,0x90,0xBD + ,0x70,0x03,0x00,0x0D,0x42,0x02,0x00,0x02,0x40,0x02 + ,0x00,0x02,0x80,0xB4,0x0C,0x4F,0x00,0x28,0x05,0xD1 + ,0x00,0x29,0x03,0xD1,0x02,0x2A,0x01,0xD1,0x01,0x2B + ,0x03,0xD1,0x20,0x20,0x38,0x73,0x80,0xBC,0xF7,0x46 + ,0x80,0x20,0x38,0x73,0x05,0x48,0x00,0x21,0x01,0x73 + ,0x01,0x73,0x38,0x7B,0x10,0x23,0x18,0x43,0x38,0x73 + ,0xF2,0xE7,0x00,0x00,0x70,0x03,0x00,0x0D,0x30,0x03 + ,0x00,0x0D,0x00,0xB5,0x02,0x28,0x03,0xD1,0x0A,0x29 + ,0x26,0xD1,0x16,0x4B,0x24,0xE0,0x04,0x28,0x01,0xD1 + ,0x15,0x4B,0x20,0xE0,0x05,0x28,0x01,0xD1,0x14,0x4B + ,0x1C,0xE0,0x00,0x28,0x1A,0xD1,0x0A,0x29,0x17,0xD2 + ,0x02,0xA3,0x5B,0x5C,0x5B,0x00,0x9F,0x44,0x00,0x1C + ,0x13,0x05,0x07,0x09,0x13,0x0B,0x0D,0x0F,0x13,0x11 + ,0x0D,0x4B,0x0C,0xE0,0x0D,0x4B,0x0A,0xE0,0x0D,0x4B + ,0x08,0xE0,0x0D,0x4B,0x06,0xE0,0x0D,0x4B,0x04,0xE0 + ,0x0D,0x4B,0x02,0xE0,0x0D,0x4B,0x00,0xE0,0x0D,0x4B + ,0x0D,0x49,0x98,0x18,0x08,0x60,0x00,0xF0,0x5B,0xF8 + ,0x00,0xBD,0x58,0x0A,0x00,0x02,0xC4,0x02,0x00,0x02 + ,0xC8,0x0A,0x00,0x02,0x04,0x01,0x00,0x02,0x5C,0x00 + ,0x00,0x02,0xC0,0x00,0x00,0x02,0x80,0x00,0x00,0x02 + ,0x18,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0x14,0x01 + ,0x00,0x02,0x10,0x01,0x00,0x02,0x58,0x02,0x00,0x02 + ,0x80,0xB4,0x17,0x1C,0x00,0x22,0x01,0x2F,0x17,0x4B + ,0x23,0xD1,0x02,0x28,0x10,0xD1,0x16,0x48,0x87,0x79 + ,0xC0,0x79,0x00,0x02,0x07,0x43,0x08,0x29,0x07,0xD0 + ,0x14,0x48,0x87,0x60,0x0C,0x27,0x1F,0x70,0x5A,0x70 + ,0x9A,0x70,0x01,0x60,0x42,0x60,0x80,0xBC,0xF7,0x46 + ,0x06,0x28,0xFB,0xD1,0x0F,0x48,0x00,0x78,0x01,0x28 + ,0xF7,0xD1,0xFF,0x20,0x0D,0x21,0x09,0x06,0x43,0x30 + ,0x88,0x80,0x0B,0x49,0x01,0x20,0x08,0x71,0x0B,0x49 + ,0x08,0x70,0xEC,0xE7,0x18,0x79,0x18,0x70,0x5A,0x70 + ,0x9A,0x70,0x18,0x78,0x0A,0x28,0xE5,0xD1,0x07,0x48 + ,0x02,0x70,0xE2,0xE7,0xC4,0x09,0x00,0x02,0x30,0x02 + ,0x00,0x02,0x98,0x02,0x00,0x02,0x36,0x01,0x00,0x02 + ,0xE0,0x03,0x00,0x0D,0x37,0x01,0x00,0x02,0x94,0x01 + ,0x00,0x02,0x90,0xB4,0x1A,0x4A,0x80,0x20,0x10,0x73 + ,0x19,0x49,0x1A,0x48,0x0B,0x88,0x07,0x88,0xBB,0x42 + ,0x11,0xD1,0x11,0x7B,0xC9,0x09,0x09,0xD2,0x00,0x88 + ,0x40,0x07,0x03,0xD0,0xE0,0x20,0x10,0x73,0x90,0xBC + ,0xF7,0x46,0xD0,0x20,0x10,0x73,0xFA,0xE7,0x10,0x7B + ,0x20,0x23,0x18,0x43,0x10,0x73,0xF5,0xE7,0x00,0x88 + ,0x0B,0x88,0xC0,0x1A,0x08,0x28,0x00,0xD9,0x08,0x20 + ,0x0B,0x88,0x1B,0x18,0x0B,0x80,0x00,0x28,0x08,0xD0 + ,0x0A,0x4B,0x0A,0x49,0x0F,0x68,0x3C,0x78,0x01,0x37 + ,0x0F,0x60,0x1C,0x73,0x01,0x38,0xF8,0xD1,0x10,0x7B + ,0x10,0x23,0x18,0x43,0x10,0x73,0xDC,0xE7,0x00,0x00 + ,0x70,0x03,0x00,0x0D,0x56,0x02,0x00,0x02,0x54,0x02 + ,0x00,0x02,0x30,0x03,0x00,0x0D,0x58,0x02,0x00,0x02 + ,0x90,0xB5,0x20,0x24,0x00,0x28,0x0B,0x4F,0x03,0xD1 + ,0x00,0x2A,0x01,0xD1,0x03,0x2B,0x01,0xD0,0x3C,0x73 + ,0x90,0xBD,0x08,0x06,0x00,0x0E,0x01,0xD0,0x80,0x28 + ,0x01,0xD1,0x3C,0x73,0x90,0xBD,0x04,0x48,0x00,0x79 + ,0x00,0xF0,0x3A,0xF8,0x60,0x20,0x38,0x73,0x90,0xBD + ,0x00,0x00,0x70,0x03,0x00,0x0D,0x30,0x02,0x00,0x02 + ,0xB0,0xB4,0x13,0x48,0x01,0x2B,0x03,0xD1,0x20,0x21 + ,0x01,0x73,0xB0,0xBC,0xF7,0x46,0x10,0x49,0x00,0x23 + ,0x0D,0x78,0x02,0x22,0x0F,0x4C,0x10,0x4F,0x01,0x2D + ,0x02,0xD0,0x0D,0x78,0x02,0x2D,0x02,0xD1,0x0A,0x70 + ,0x3B,0x70,0x23,0x70,0x80,0x21,0x01,0x73,0x0B,0x49 + ,0x01,0x25,0x0D,0x73,0x0B,0x73,0x0A,0x73,0x0B,0x73 + ,0x3A,0x78,0x10,0x23,0x0A,0x73,0x22,0x78,0x0A,0x73 + ,0x01,0x7B,0x19,0x43,0x01,0x73,0xDE,0xE7,0x00,0x00 + ,0x70,0x03,0x00,0x0D,0x60,0x02,0x00,0x02,0x5D,0x02 + ,0x00,0x02,0x5C,0x02,0x00,0x02,0x30,0x03,0x00,0x0D + ,0x80,0xB4,0x01,0x22,0x00,0x23,0x02,0x28,0x10,0x49 + ,0x12,0xD1,0x18,0x1C,0x10,0x4B,0x04,0x27,0x18,0x71 + ,0x0F,0x4B,0x1F,0x70,0x18,0x70,0x0F,0x4F,0x82,0x23 + ,0x3B,0x71,0x0E,0x4B,0x18,0x80,0x0E,0x4B,0x18,0x80 + ,0x0E,0x4B,0x18,0x80,0x0A,0x70,0x80,0xBC,0xF7,0x46 + ,0x85,0x28,0xFB,0xD1,0x0C,0x48,0x03,0x80,0x0C,0x48 + ,0x02,0x70,0x08,0x78,0x01,0x28,0xF4,0xD1,0x02,0x20 + ,0x08,0x70,0xF1,0xE7,0x00,0x00,0x61,0x02,0x00,0x02 + ,0x70,0x03,0x00,0x0D,0xC0,0x03,0x00,0x0D,0xB0,0x03 + ,0x00,0x0D,0x4E,0x02,0x00,0x02,0x4C,0x02,0x00,0x02 + ,0x40,0x02,0x00,0x02,0x42,0x02,0x00,0x02,0x4B,0x02 + ,0x00,0x02,0x90,0xB5,0x0F,0x1C,0x19,0x1C,0x29,0x4B + ,0x14,0x1C,0x27,0x4A,0x98,0x42,0x06,0xD1,0x13,0x68 + ,0x0A,0x1C,0x38,0x1C,0x21,0x1C,0xFF,0xF7,0xAC,0xFD + ,0x90,0xBD,0x24,0x4B,0x98,0x42,0x06,0xD1,0x13,0x68 + ,0x0A,0x1C,0x38,0x1C,0x21,0x1C,0xFF,0xF7,0xC2,0xFD + ,0x90,0xBD,0x81,0x23,0x1B,0x02,0x98,0x42,0x06,0xD1 + ,0x13,0x68,0x0A,0x1C,0x38,0x1C,0x21,0x1C,0xFF,0xF7 + ,0xD3,0xFD,0x90,0xBD,0xFF,0x23,0x0C,0x33,0x98,0x42 + ,0x06,0xD1,0x13,0x68,0x0A,0x1C,0x38,0x1C,0x21,0x1C + ,0xFF,0xF7,0xE6,0xFD,0x90,0xBD,0x41,0x23,0x5B,0x02 + ,0x98,0x42,0x06,0xD1,0x13,0x68,0x0A,0x1C,0x38,0x1C + ,0x21,0x1C,0xFF,0xF7,0xF7,0xFD,0x90,0xBD,0x0F,0x4B + ,0x98,0x42,0x06,0xD1,0x13,0x68,0x0A,0x1C,0x38,0x1C + ,0x21,0x1C,0xFF,0xF7,0x29,0xFE,0x90,0xBD,0x01,0x23 + ,0xDB,0x03,0x98,0x42,0x06,0xD1,0x13,0x68,0x0A,0x1C + ,0x38,0x1C,0x21,0x1C,0xFF,0xF7,0x40,0xFE,0x90,0xBD + ,0x06,0x49,0x20,0x20,0x08,0x73,0x90,0xBD,0x00,0x00 + ,0x28,0x02,0x00,0x02,0x08,0x80,0x00,0x00,0x0A,0x81 + ,0x00,0x00,0x03,0x02,0x00,0x00,0x70,0x03,0x00,0x0D + ,0x10,0x49,0x09,0x78,0x01,0x29,0x1B,0xD1,0x40,0x08 + ,0x19,0xD3,0x0D,0x20,0x00,0x06,0x01,0x78,0x20,0x23 + ,0x19,0x43,0x01,0x70,0x0B,0x48,0x00,0x68,0xC1,0x43 + ,0x0B,0x48,0xC2,0x69,0x11,0x40,0xC1,0x61,0x00,0x20 + ,0x07,0x21,0x49,0x06,0x7D,0x22,0x12,0x01,0x88,0x61 + ,0x01,0x30,0x90,0x42,0xFC,0xD3,0xFF,0x20,0x48,0x61 + ,0xFF,0xE7,0xFE,0xE7,0xF7,0x46,0x00,0x00,0x36,0x01 + ,0x00,0x02,0xA4,0x02,0x00,0x02,0x40,0x00,0x00,0x04 + ,0xF0,0xB5,0xC0,0x20,0xFD,0xF7,0x28,0xF8,0x22,0x4C + ,0x23,0x4F,0x21,0x7A,0x23,0x4A,0x39,0x70,0x11,0x79 + ,0x79,0x70,0x21,0x7B,0xF9,0x70,0x11,0x7B,0xB9,0x70 + ,0x0D,0x21,0x09,0x06,0x8B,0x88,0x07,0x25,0x6D,0x06 + ,0xBB,0x80,0xEE,0x69,0x01,0x23,0x5B,0x02,0x33,0x43 + ,0xEB,0x61,0x00,0x23,0x01,0x33,0x32,0x2B,0xFC,0xD3 + ,0xEE,0x69,0x18,0x4B,0x33,0x40,0xEB,0x61,0x00,0x23 + ,0x01,0x33,0x64,0x2B,0xFC,0xD3,0x15,0x4D,0x00,0x23 + ,0x2B,0x70,0x15,0x4B,0x80,0x25,0x1D,0x73,0x01,0x25 + ,0x1D,0x72,0x82,0x25,0x1D,0x71,0x07,0x25,0x1D,0x70 + ,0x11,0x4B,0x05,0x26,0x1E,0x73,0x86,0x26,0x1E,0x72 + ,0x1D,0x71,0x24,0x23,0x23,0x71,0x3B,0x78,0x23,0x72 + ,0xFB,0x78,0x23,0x73,0x7B,0x78,0x13,0x71,0xBB,0x78 + ,0x13,0x73,0x0A,0x4A,0x0A,0x81,0xBA,0x88,0x8A,0x80 + ,0xFC,0xF7,0xE4,0xFF,0xF0,0xBD,0x00,0x00,0xC0,0x03 + ,0x00,0x0D,0xBC,0x02,0x00,0x02,0xE0,0x03,0x00,0x0D + ,0xFF,0xFD,0x00,0x00,0x10,0x00,0x00,0x0D,0xB0,0x03 + ,0x00,0x0D,0xA0,0x03,0x00,0x0D,0xFF,0x0F,0x00,0x00 + ,0x80,0xB5,0x0C,0x49,0x00,0x20,0x08,0x60,0x0B,0x49 + ,0x0E,0x4F,0x08,0x80,0x0B,0x49,0x08,0x70,0x0B,0x49 + ,0x08,0x70,0x38,0x68,0x01,0x7A,0x10,0x29,0x02,0xD1 + ,0xFB,0xF7,0x4A,0xFB,0x38,0x60,0x38,0x68,0x01,0x7A + ,0x40,0x29,0x02,0xD1,0xFB,0xF7,0x43,0xFB,0x38,0x60 + ,0x80,0xBD,0x44,0x02,0x00,0x02,0x48,0x02,0x00,0x02 + ,0x50,0x02,0x00,0x02,0x4A,0x02,0x00,0x02,0x64,0x02 + ,0x00,0x02,0xF0,0xB5,0x23,0x4E,0x04,0x1C,0x0F,0x1C + ,0x13,0x1C,0x20,0x22,0xB5,0x78,0xF1,0x78,0x03,0x2B + ,0x20,0x48,0x01,0xD0,0x02,0x73,0xF0,0xBD,0x02,0x2D + ,0x09,0xD1,0x01,0x29,0x01,0xD3,0x0A,0x29,0x01,0xD9 + ,0x02,0x73,0xF0,0xBD,0x08,0x29,0x01,0xD1,0x02,0x73 + ,0xF0,0xBD,0x00,0x2F,0x09,0xD1,0xFC,0xF7,0x51,0xF8 + ,0x06,0x2D,0x07,0xD1,0xF9,0xF7,0xDC,0xF8,0x15,0x48 + ,0x00,0x21,0x01,0x70,0x01,0xE0,0x00,0x21,0x01,0x73 + ,0x13,0x48,0x02,0x2D,0x07,0xD1,0x00,0x2C,0x0E,0xD1 + ,0x11,0x49,0x01,0x60,0x11,0x48,0x00,0x21,0x01,0x70 + ,0x08,0xE0,0x01,0x2D,0xD7,0xD0,0x0F,0x49,0x01,0x60 + ,0x0F,0x48,0x00,0x21,0x01,0x70,0x0F,0x48,0x01,0x70 + ,0x0F,0x48,0x31,0x1C,0x07,0x80,0x0E,0x48,0x00,0x27 + ,0x07,0x80,0x0E,0x48,0x08,0x22,0xFD,0xF7,0x4D,0xFB + ,0x03,0x48,0x07,0x70,0xF0,0xBD,0x30,0x02,0x00,0x02 + ,0x70,0x03,0x00,0x0D,0x60,0x02,0x00,0x02,0x58,0x02 + ,0x00,0x02,0x58,0x0A,0x00,0x02,0x94,0x01,0x00,0x02 + ,0xC8,0x09,0x00,0x02,0x5D,0x02,0x00,0x02,0x5C,0x02 + ,0x00,0x02,0x54,0x02,0x00,0x02,0x56,0x02,0x00,0x02 + ,0x38,0x02,0x00,0x02,0xB0,0xB5,0x11,0x4F,0x14,0x1C + ,0xBB,0x78,0xFF,0x78,0x03,0x2C,0x0F,0x4A,0x02,0xD0 + ,0x20,0x20,0x10,0x73,0xB0,0xBD,0x0E,0x4D,0x00,0x24 + ,0x2C,0x80,0x0D,0x4C,0x01,0x2B,0x21,0x80,0x0A,0xD1 + ,0x80,0x20,0x10,0x73,0x0B,0x48,0x0C,0x49,0x00,0x78 + ,0x10,0x23,0x08,0x73,0x10,0x7B,0x18,0x43,0x10,0x73 + ,0xB0,0xBD,0x02,0x1C,0x18,0x1C,0x39,0x1C,0xFF,0xF7 + ,0x26,0xFD,0xB0,0xBD,0x00,0x00,0x30,0x02,0x00,0x02 + ,0x70,0x03,0x00,0x0D,0x56,0x02,0x00,0x02,0x54,0x02 + ,0x00,0x02,0x53,0x02,0x00,0x02,0x30,0x03,0x00,0x0D + ,0xB0,0xB5,0x0F,0x1C,0x18,0x4D,0x19,0x1C,0x14,0x1C + ,0xA8,0x42,0x02,0xD0,0x17,0x4B,0x00,0x22,0x1A,0x70 + ,0x16,0x4A,0xA8,0x42,0x06,0xD1,0x13,0x68,0x0A,0x1C + ,0x38,0x1C,0x21,0x1C,0xFF,0xF7,0xD1,0xFD,0xB0,0xBD + ,0x12,0x4B,0x98,0x42,0x04,0xD1,0x12,0x68,0x20,0x1C + ,0xFF,0xF7,0x55,0xFF,0xB0,0xBD,0x0F,0x4B,0x98,0x42 + ,0x06,0xD1,0x13,0x68,0x0A,0x1C,0x38,0x1C,0x21,0x1C + ,0xFF,0xF7,0xDD,0xFD,0xB0,0xBD,0x0B,0x4B,0x98,0x42 + ,0x04,0xD1,0x12,0x68,0x20,0x1C,0xFF,0xF7,0xA3,0xFF + ,0xB0,0xBD,0x0B,0x1C,0x39,0x1C,0x22,0x1C,0xFF,0xF7 + ,0x39,0xFE,0xB0,0xBD,0x01,0x02,0x00,0x00,0x61,0x02 + ,0x00,0x02,0x28,0x02,0x00,0x02,0x0E,0x40,0x00,0x00 + ,0x22,0xC1,0x00,0x00,0x33,0xC1,0x00,0x00,0xF0,0xB5 + ,0x22,0x4B,0xE0,0x25,0x01,0x27,0x98,0x42,0x1D,0x49 + ,0x1D,0x4C,0x1E,0x4A,0x08,0xD1,0x90,0x78,0x01,0x28 + ,0x01,0xD1,0x0D,0x73,0x01,0xE0,0xFF,0xF7,0x54,0xFD + ,0x27,0x71,0xF0,0xBD,0x1A,0x4B,0x20,0x26,0x98,0x42 + ,0x21,0xD1,0x0E,0x73,0x19,0x48,0x27,0x71,0x00,0x78 + ,0x00,0x28,0xF4,0xD1,0x90,0x78,0x02,0x28,0x02,0xD1 + ,0xD0,0x78,0x08,0x28,0xEE,0xD0,0x90,0x78,0x01,0x28 + ,0x0C,0xD1,0x13,0x49,0x00,0x20,0x08,0x70,0x12,0x48 + ,0x00,0x78,0x02,0x28,0x02,0xD1,0x11,0x48,0x07,0x70 + ,0xF0,0xBD,0x11,0x48,0x07,0x70,0xF0,0xBD,0xD1,0x78 + ,0x90,0x78,0x01,0x22,0xFF,0xF7,0xEB,0xFC,0xF0,0xBD + ,0x10,0x78,0x00,0x0A,0x01,0xD2,0x0E,0x73,0x00,0xE0 + ,0x0D,0x73,0x27,0x71,0xF0,0xBD,0x70,0x03,0x00,0x0D + ,0xD0,0x03,0x00,0x0D,0x30,0x02,0x00,0x02,0x33,0xC1 + ,0x00,0x00,0x0E,0x40,0x00,0x00,0x60,0x02,0x00,0x02 + ,0x94,0x01,0x00,0x02,0x53,0x02,0x00,0x02,0x5F,0x02 + ,0x00,0x02,0xDD,0x01,0x00,0x02,0x80,0xB5,0x00,0x20 + ,0x1C,0x49,0x0F,0x27,0x3F,0x06,0x08,0x70,0xB8,0x80 + ,0x39,0x88,0xB8,0x81,0x1A,0x4A,0x39,0x89,0xD1,0x69 + ,0xD1,0x04,0xCB,0x68,0xC9,0x6B,0x18,0x49,0x09,0x68 + ,0x90,0x61,0x17,0x49,0x02,0x20,0xC8,0x74,0x17,0x48 + ,0x01,0x7A,0x0C,0x30,0x08,0x29,0x19,0xD2,0x01,0xA3 + ,0x5B,0x5C,0x5B,0x00,0x9F,0x44,0x15,0x03,0x06,0x15 + ,0x09,0x0C,0x0F,0x12,0x00,0xF0,0xFA,0xFB,0x80,0xBD + ,0x00,0xF0,0x7B,0xF9,0x80,0xBD,0x00,0xF0,0x10,0xFA + ,0x80,0xBD,0x00,0xF0,0x1B,0xF8,0x80,0xBD,0x00,0xF0 + ,0xC4,0xF8,0x80,0xBD,0x00,0xF0,0x73,0xFA,0x80,0xBD + ,0x02,0x21,0x0A,0x20,0xFF,0xF7,0x38,0xFA,0x06,0x48 + ,0xB8,0x80,0x80,0xBD,0x00,0x00,0x94,0x01,0x00,0x02 + ,0x80,0x00,0x00,0x04,0x40,0x00,0x00,0x04,0x44,0x09 + ,0x00,0x02,0xC4,0x09,0x00,0x02,0x08,0x08,0x00,0x00 + ,0xF0,0xB5,0x4B,0x4F,0x60,0xC8,0x39,0x1C,0x60,0xC1 + ,0x38,0x78,0x0F,0x25,0x2D,0x06,0x0E,0x28,0x48,0x4C + ,0x01,0xDC,0x00,0x28,0x05,0xD1,0x03,0x21,0x0A,0x20 + ,0xFF,0xF7,0x17,0xFA,0xAC,0x80,0xF0,0xBD,0x44,0x48 + ,0x90,0x21,0x41,0x70,0xB9,0x78,0x00,0x26,0x01,0x29 + ,0x01,0xD1,0xC6,0x70,0x01,0xE0,0x40,0x21,0xC1,0x70 + ,0x41,0x7C,0x89,0x07,0x89,0x0F,0x41,0x74,0xFA,0x78 + ,0x41,0x7C,0x92,0x00,0x02,0x23,0x1A,0x43,0x11,0x43 + ,0x41,0x74,0x39,0x79,0x01,0x75,0x79,0x79,0x41,0x75 + ,0x38,0x49,0x09,0x78,0x01,0x29,0x01,0xD1,0xF9,0x79 + ,0x41,0x77,0xFF,0x20,0xF5,0x30,0x35,0x49,0x49,0x68 + ,0xC9,0x0B,0x03,0xD3,0x01,0x1C,0x01,0x38,0x00,0x29 + ,0xF7,0xD1,0x07,0x21,0x49,0x06,0xC8,0x69,0x80,0x23 + ,0x18,0x43,0xC8,0x61,0xFF,0x20,0x2D,0x30,0xF8,0xF7 + ,0x45,0xFE,0x07,0x21,0x49,0x06,0xC8,0x69,0x80,0x23 + ,0x98,0x43,0xC8,0x61,0x02,0xF0,0xE6,0xF8,0x38,0x78 + ,0x00,0x21,0x01,0xF0,0x4D,0xFE,0x00,0x21,0x08,0x20 + ,0xF8,0xF7,0xD7,0xFE,0x00,0x21,0x09,0x20,0xF8,0xF7 + ,0xD3,0xFE,0x00,0x21,0x0A,0x20,0xF8,0xF7,0xCF,0xFE + ,0x20,0x4F,0xF8,0x69,0xBB,0x01,0x18,0x43,0xF8,0x61 + ,0x00,0x20,0xF8,0xF7,0x3D,0xFE,0x0A,0x20,0xF8,0xF7 + ,0x22,0xFE,0x01,0x20,0x80,0x06,0x46,0x61,0xC0,0x68 + ,0x19,0x48,0x78,0x61,0x78,0x68,0xC0,0x0B,0x05,0xD3 + ,0x06,0x21,0x0A,0x20,0xFF,0xF7,0xB1,0xF9,0xAC,0x80 + ,0xF0,0xBD,0x00,0x22,0xFF,0x21,0x7D,0x20,0xC0,0x00 + ,0xAC,0x80,0x00,0xF0,0xA6,0xFA,0x11,0x48,0x01,0x21 + ,0x89,0x06,0x88,0x63,0x10,0x48,0x11,0x4A,0x48,0x63 + ,0xAE,0x80,0x04,0x20,0xD0,0x74,0xB8,0x60,0x00,0x03 + ,0x78,0x60,0x48,0x6A,0x0A,0x30,0x08,0x62,0x0C,0x48 + ,0x01,0x21,0xA8,0x80,0x0A,0x20,0xFF,0xF7,0x92,0xF9 + ,0xF0,0xBD,0x00,0x00,0xCC,0x02,0x00,0x02,0x08,0x08 + ,0x00,0x00,0xCC,0x07,0x00,0x02,0xB0,0x02,0x00,0x02 + ,0x40,0x00,0x00,0x04,0x04,0x24,0x00,0x00,0x00,0x72 + ,0x01,0x02,0x64,0x10,0x00,0x00,0x44,0x09,0x00,0x02 + ,0x88,0x88,0x00,0x00,0xF0,0xB5,0x4C,0x4F,0x60,0xC8 + ,0x39,0x1C,0x60,0xC1,0x38,0x78,0x0F,0x25,0x2D,0x06 + ,0x0E,0x28,0x49,0x4C,0x01,0xDC,0x00,0x28,0x05,0xD1 + ,0x03,0x21,0x0A,0x20,0xFF,0xF7,0x6B,0xF9,0xAC,0x80 + ,0xF0,0xBD,0x45,0x48,0x90,0x21,0x41,0x70,0xB9,0x78 + ,0x00,0x26,0x01,0x29,0x01,0xD1,0xC6,0x70,0x01,0xE0 + ,0x40,0x21,0xC1,0x70,0x41,0x7C,0x89,0x07,0x89,0x0F + ,0x41,0x74,0xFA,0x78,0x41,0x7C,0x92,0x00,0x02,0x23 + ,0x1A,0x43,0x11,0x43,0x41,0x74,0x39,0x79,0x01,0x75 + ,0x79,0x79,0x41,0x75,0x39,0x49,0x09,0x78,0x01,0x29 + ,0x01,0xD1,0xF9,0x79,0x41,0x77,0xFF,0x20,0xF5,0x30 + ,0x36,0x49,0x49,0x68,0xC9,0x0B,0x03,0xD3,0x01,0x1C + ,0x01,0x38,0x00,0x29,0xF7,0xD1,0x07,0x21,0x49,0x06 + ,0xC8,0x69,0x80,0x23,0x18,0x43,0xC8,0x61,0xFF,0x20 + ,0x2D,0x30,0xF8,0xF7,0x99,0xFD,0x07,0x21,0x49,0x06 + ,0xC8,0x69,0x80,0x23,0x98,0x43,0xC8,0x61,0x02,0xF0 + ,0x3A,0xF8,0x38,0x78,0x00,0x21,0x01,0xF0,0xA1,0xFD + ,0x0B,0x21,0x08,0x20,0xF8,0xF7,0x2B,0xFE,0xB7,0x21 + ,0x09,0x20,0xF8,0xF7,0x27,0xFE,0x00,0x21,0x0A,0x20 + ,0xF8,0xF7,0x23,0xFE,0x14,0x20,0xF8,0xF7,0x7E,0xFD + ,0x1F,0x4F,0xF8,0x69,0xBB,0x01,0x18,0x43,0xF8,0x61 + ,0x00,0x20,0xF8,0xF7,0x8E,0xFD,0x0A,0x20,0xF8,0xF7 + ,0x73,0xFD,0x01,0x20,0x80,0x06,0x46,0x61,0xC0,0x68 + ,0x19,0x48,0x78,0x61,0x78,0x68,0xC0,0x0B,0x05,0xD3 + ,0x06,0x21,0x0A,0x20,0xFF,0xF7,0x02,0xF9,0xAC,0x80 + ,0xF0,0xBD,0x00,0x22,0x55,0x21,0x7D,0x20,0xC0,0x00 + ,0xAC,0x80,0x00,0xF0,0xF7,0xF9,0x11,0x48,0x01,0x21 + ,0x89,0x06,0x88,0x63,0x10,0x48,0x10,0x4A,0x48,0x63 + ,0xAE,0x80,0x04,0x20,0xD0,0x74,0xB8,0x60,0x00,0x03 + ,0x78,0x60,0x48,0x6A,0x0A,0x30,0x08,0x62,0x0C,0x48 + ,0x01,0x21,0xA8,0x80,0x0A,0x20,0xFF,0xF7,0xE3,0xF8 + ,0xF0,0xBD,0xCC,0x02,0x00,0x02,0x08,0x08,0x00,0x00 + ,0xCC,0x07,0x00,0x02,0xB0,0x02,0x00,0x02,0x40,0x00 + ,0x00,0x04,0x04,0x24,0x00,0x00,0x00,0x72,0x01,0x02 + ,0x64,0x10,0x00,0x00,0x44,0x09,0x00,0x02,0x88,0x88 + ,0x00,0x00,0xF0,0xB5,0x42,0x4C,0xC0,0xC8,0x21,0x1C + ,0xC0,0xC1,0xA0,0x78,0x40,0x4D,0x80,0x08,0x80,0x00 + ,0x0F,0x27,0x3F,0x06,0x00,0x28,0x05,0xD0,0x03,0x21 + ,0x0A,0x20,0xFF,0xF7,0xBD,0xF8,0xBD,0x80,0xF0,0xBD + ,0x20,0x78,0x0E,0x28,0x01,0xDC,0x00,0x28,0x05,0xD1 + ,0x03,0x21,0x0A,0x20,0xFF,0xF7,0xB2,0xF8,0xBD,0x80 + ,0xF0,0xBD,0x08,0x21,0x0A,0x20,0xFF,0xF7,0xAC,0xF8 + ,0x33,0x48,0x00,0x26,0x06,0x70,0x33,0x48,0x06,0x60 + ,0x46,0x60,0x00,0x20,0xF8,0xF7,0x1F,0xFD,0xA1,0x78 + ,0x30,0x48,0x01,0x29,0x01,0xD1,0xC6,0x70,0x01,0xE0 + ,0x40,0x21,0xC1,0x70,0x21,0x79,0x01,0x75,0x61,0x79 + ,0x41,0x75,0x2C,0x49,0x09,0x78,0x01,0x29,0x01,0xD1 + ,0xE1,0x79,0x41,0x77,0xFF,0x20,0xF5,0x30,0x29,0x49 + ,0x49,0x68,0xC9,0x0B,0x03,0xD3,0x01,0x1C,0x01,0x38 + ,0x00,0x29,0xF7,0xD1,0x07,0x21,0x49,0x06,0xC8,0x69 + ,0x80,0x23,0x18,0x43,0xC8,0x61,0xFF,0x20,0x2D,0x30 + ,0xF8,0xF7,0xE1,0xFC,0x07,0x21,0x49,0x06,0xC8,0x69 + ,0x80,0x23,0x98,0x43,0xC8,0x61,0x01,0xF0,0x82,0xFF + ,0x20,0x78,0x00,0x21,0x01,0xF0,0xE9,0xFC,0x00,0x28 + ,0x05,0xD1,0x05,0x21,0x0A,0x20,0xFF,0xF7,0x6B,0xF8 + ,0xBD,0x80,0xF0,0xBD,0x14,0x20,0xF8,0xF7,0xCA,0xFC + ,0x00,0x20,0xF8,0xF7,0xDF,0xFC,0x13,0x48,0x41,0x68 + ,0xC9,0x0B,0x05,0xD3,0x06,0x21,0x0A,0x20,0xFF,0xF7 + ,0x5B,0xF8,0xBD,0x80,0xF0,0xBD,0x86,0x60,0x20,0x20 + ,0x41,0x05,0x48,0x61,0x0D,0x48,0x01,0x21,0x01,0x73 + ,0xC1,0x74,0xB8,0x88,0x0B,0x4B,0x18,0x43,0xB8,0x80 + ,0x0A,0x20,0xFF,0xF7,0x4A,0xF8,0xF0,0xBD,0x00,0x00 + ,0xCC,0x02,0x00,0x02,0x08,0x08,0x00,0x00,0x94,0x01 + ,0x00,0x02,0xC4,0x02,0x00,0x02,0xCC,0x07,0x00,0x02 + ,0xB0,0x02,0x00,0x02,0x40,0x00,0x00,0x04,0x44,0x09 + ,0x00,0x02,0x48,0x48,0x00,0x00,0xF0,0xB5,0x2F,0x4F + ,0x60,0xC8,0x39,0x1C,0x60,0xC1,0x38,0x78,0x0F,0x25 + ,0x2D,0x06,0x0E,0x28,0x2C,0x4C,0x01,0xDC,0x00,0x28 + ,0x05,0xD1,0x03,0x21,0x0A,0x20,0xFF,0xF7,0x25,0xF8 + ,0xAC,0x80,0xF0,0xBD,0x28,0x48,0x00,0x26,0x46,0x70 + ,0x41,0x7C,0xFD,0x23,0x19,0x40,0x41,0x74,0x25,0x49 + ,0x09,0x78,0x01,0x29,0x01,0xD1,0xF9,0x79,0x41,0x77 + ,0xFF,0x20,0xF5,0x30,0x22,0x49,0x49,0x68,0xC9,0x0B + ,0x03,0xD3,0x01,0x1C,0x01,0x38,0x00,0x29,0xF7,0xD1 + ,0x07,0x21,0x49,0x06,0xC8,0x69,0x80,0x23,0x18,0x43 + ,0xC8,0x61,0xFF,0x20,0x2D,0x30,0xF8,0xF7,0x66,0xFC + ,0x07,0x21,0x49,0x06,0xC8,0x69,0x80,0x23,0x98,0x43 + ,0xC8,0x61,0x01,0xF0,0x07,0xFF,0xAE,0x80,0x38,0x78 + ,0x00,0x21,0x01,0xF0,0x6D,0xFC,0x00,0x28,0x02,0xD1 + ,0x13,0x49,0x05,0x20,0x48,0x70,0x14,0x20,0xF8,0xF7 + ,0x51,0xFC,0x00,0x20,0xF8,0xF7,0x66,0xFC,0x0D,0x48 + ,0x41,0x68,0xC9,0x0B,0x05,0xD3,0x06,0x21,0x0A,0x20 + ,0xFE,0xF7,0xE2,0xFF,0xAC,0x80,0xF0,0xBD,0x86,0x60 + ,0x01,0x20,0x80,0x06,0x46,0x61,0x01,0x21,0x0A,0x20 + ,0xAC,0x80,0xFE,0xF7,0xD7,0xFF,0xF0,0xBD,0xCC,0x02 + ,0x00,0x02,0x08,0x08,0x00,0x00,0xCC,0x07,0x00,0x02 + ,0xB0,0x02,0x00,0x02,0x40,0x00,0x00,0x04,0xC4,0x09 + ,0x00,0x02,0xF0,0xB5,0x01,0x1C,0xB8,0xC9,0x58,0x4E + ,0x30,0x1C,0xB8,0xC0,0x30,0x7A,0x0F,0x24,0x24,0x06 + ,0x0E,0x28,0x55,0x4F,0x01,0xDC,0x00,0x28,0x05,0xD1 + ,0x03,0x21,0x0A,0x20,0xFE,0xF7,0xB8,0xFF,0xA7,0x80 + ,0xF0,0xBD,0x51,0x4D,0xA8,0x70,0x70,0x78,0x68,0x70 + ,0x30,0x78,0x28,0x70,0x70,0x88,0xA8,0x60,0x70,0x68 + ,0xE8,0x60,0x00,0x20,0xE8,0x70,0x68,0x60,0x28,0x61 + ,0xF0,0x68,0x68,0x61,0x00,0x20,0xF8,0xF7,0x1F,0xFC + ,0x6A,0x78,0x40,0x21,0x48,0x48,0x00,0x2A,0x16,0xD0 + ,0x01,0x2A,0x17,0xD0,0x02,0x2A,0x18,0xD0,0x03,0x2A + ,0x01,0xD1,0x60,0x22,0x42,0x70,0x42,0x7C,0x92,0x07 + ,0x92,0x0F,0x42,0x74,0xB3,0x7A,0x42,0x7C,0x9B,0x00 + ,0x1A,0x43,0x42,0x74,0x72,0x7A,0x01,0x2A,0x0A,0xD1 + ,0x00,0x22,0xC2,0x70,0x08,0xE0,0x00,0x22,0x42,0x70 + ,0xED,0xE7,0x20,0x22,0x42,0x70,0xEA,0xE7,0x41,0x70 + ,0xE8,0xE7,0xC1,0x70,0x37,0x49,0x09,0x78,0x01,0x29 + ,0x01,0xD1,0xF1,0x7A,0x41,0x77,0xFF,0x20,0x35,0x4E + ,0xF5,0x30,0x71,0x68,0xC9,0x0B,0x03,0xD3,0x01,0x1C + ,0x01,0x38,0x00,0x29,0xF8,0xD1,0x07,0x21,0x49,0x06 + ,0xC8,0x69,0x80,0x23,0x18,0x43,0xC8,0x61,0xFF,0x20 + ,0x2D,0x30,0xF8,0xF7,0xC8,0xFB,0x07,0x21,0x49,0x06 + ,0xC8,0x69,0x80,0x23,0x98,0x43,0xC8,0x61,0x01,0xF0 + ,0x69,0xFE,0xA8,0x78,0x00,0x21,0x01,0xF0,0xD0,0xFB + ,0x25,0x49,0xC8,0x69,0x8B,0x01,0x18,0x43,0xC8,0x61 + ,0x14,0x20,0xF8,0xF7,0xB4,0xFB,0x00,0x20,0xF8,0xF7 + ,0xC9,0xFB,0x0A,0x20,0xF8,0xF7,0xAE,0xFB,0x00,0x26 + ,0x01,0x20,0x80,0x06,0x46,0x61,0xC0,0x68,0x1C,0x49 + ,0x1C,0x48,0x48,0x61,0x48,0x68,0xC0,0x0B,0x05,0xD3 + ,0x06,0x21,0x0A,0x20,0xFE,0xF7,0x3B,0xFF,0xA7,0x80 + ,0xF0,0xBD,0xE8,0x68,0x00,0xF0,0xAC,0xF8,0x68,0x60 + ,0xE8,0x78,0xF8,0xF7,0xF0,0xFB,0x68,0x68,0xF9,0xF7 + ,0xDF,0xFD,0xA7,0x80,0x29,0x78,0xE8,0x68,0x00,0x22 + ,0x00,0xF0,0x27,0xF8,0x10,0x49,0xA6,0x80,0x03,0x20 + ,0xC8,0x74,0x0C,0x49,0x22,0x20,0x88,0x60,0x08,0x05 + ,0x41,0x6A,0x0C,0x4B,0xC9,0x18,0x01,0x62,0x0C,0x48 + ,0x01,0x21,0xA0,0x80,0x0A,0x20,0xFE,0xF7,0x17,0xFF + ,0xF0,0xBD,0xD0,0x0A,0x00,0x02,0x08,0x08,0x00,0x00 + ,0xB8,0x0A,0x00,0x02,0xCC,0x07,0x00,0x02,0xB0,0x02 + ,0x00,0x02,0x40,0x00,0x00,0x04,0x04,0x24,0x00,0x00 + ,0x44,0x09,0x00,0x02,0x10,0x27,0x00,0x00,0x88,0x88 + ,0x00,0x00,0xF0,0xB5,0x07,0x1C,0x00,0x2A,0x0B,0xD1 + ,0x00,0x20,0x00,0x2F,0x14,0x4A,0x06,0xD9,0x09,0x06 + ,0x09,0x0E,0x11,0x70,0x01,0x32,0x01,0x30,0xB8,0x42 + ,0xFA,0xD3,0xF0,0xBD,0xF8,0xF7,0x68,0xFB,0xFC,0xF7 + ,0x8A,0xFF,0xFC,0xF7,0x6A,0xFF,0xBC,0x08,0x26,0x1C + ,0x0B,0x4D,0x04,0xD0,0xFC,0xF7,0x64,0xFF,0x01,0xC5 + ,0x01,0x3C,0xFA,0xD1,0xB0,0x00,0x3F,0x1A,0xFC,0xF7 + ,0x5D,0xFF,0x69,0x1C,0x03,0x2F,0x28,0x70,0x02,0xD1 + ,0x00,0x0C,0x08,0x70,0xF0,0xBD,0x02,0x2F,0xE2,0xD1 + ,0x00,0x0A,0x08,0x70,0xF0,0xBD,0x00,0x00,0x00,0x72 + ,0x01,0x02,0x88,0xB4,0x01,0x20,0x80,0x06,0xC1,0x6B + ,0x00,0xAB,0x19,0x80,0x1A,0x49,0x1B,0x4A,0xC9,0x7C + ,0x1B,0x4F,0x03,0x29,0x21,0xD1,0x00,0xA9,0x09,0x88 + ,0x20,0x23,0x0B,0x40,0x18,0x49,0x0C,0xD0,0x87,0x63 + ,0xCF,0x68,0x03,0x23,0x1B,0x03,0x3B,0x43,0x43,0x63 + ,0x4B,0x78,0x15,0x4F,0xFF,0x5C,0x11,0x23,0x9B,0x02 + ,0x3B,0x43,0x53,0x60,0x00,0xAA,0x12,0x88,0x92,0x08 + ,0x16,0xD3,0x0A,0x69,0x01,0x32,0x0A,0x61,0x4B,0x69 + ,0x9A,0x42,0x10,0xD2,0x89,0x68,0x42,0x6A,0x89,0x18 + ,0x01,0x62,0x0B,0xE0,0x04,0x29,0x09,0xD1,0x00,0xA9 + ,0x09,0x88,0xC9,0x08,0x05,0xD3,0x87,0x63,0x64,0x21 + ,0x41,0x63,0x01,0x20,0x80,0x03,0x50,0x60,0x88,0xBC + ,0xF7,0x46,0x44,0x09,0x00,0x02,0x40,0x00,0x00,0x04 + ,0x00,0x72,0x01,0x02,0xB8,0x0A,0x00,0x02,0xC0,0x01 + ,0x00,0x02,0xF0,0xB5,0x04,0x30,0xC7,0x00,0x19,0x4C + ,0x00,0x26,0xE6,0x70,0x60,0x78,0x01,0x28,0x15,0xD0 + ,0x02,0x28,0x15,0xD0,0x03,0x28,0x25,0xD1,0x0B,0x20 + ,0x39,0x1C,0xFC,0xF7,0xBB,0xFE,0x0D,0x1C,0x79,0x1A + ,0x0B,0x20,0xFC,0xF7,0xB6,0xFE,0x07,0x1C,0x00,0x2D + ,0x18,0xD9,0x01,0x37,0x04,0x2D,0x13,0xD2,0x01,0x20 + ,0xE0,0x70,0x13,0xE0,0x7F,0x08,0x11,0xE0,0x79,0x00 + ,0x0B,0x20,0x0F,0x1C,0xFC,0xF7,0xA6,0xFE,0x0C,0x1C + ,0x79,0x1A,0x0B,0x20,0xFC,0xF7,0xA1,0xFE,0x07,0x1C + ,0x00,0x2C,0x04,0xD9,0x01,0x37,0x02,0xE0,0xE6,0x70 + ,0x00,0xE0,0xE6,0x70,0x38,0x04,0x00,0x0C,0xF0,0xBD + ,0xB8,0x0A,0x00,0x02,0xF0,0xB5,0x4B,0x4F,0x60,0xC8 + ,0x39,0x1C,0x60,0xC1,0x38,0x78,0x0F,0x26,0x36,0x06 + ,0x0E,0x28,0x48,0x4D,0x01,0xDC,0x00,0x28,0x05,0xD1 + ,0x03,0x21,0x0A,0x20,0xFE,0xF7,0x41,0xFE,0xB5,0x80 + ,0xF0,0xBD,0x44,0x48,0x90,0x21,0x41,0x70,0xB9,0x78 + ,0x00,0x24,0x01,0x29,0x01,0xD1,0xC4,0x70,0x01,0xE0 + ,0x40,0x21,0xC1,0x70,0x41,0x7C,0x89,0x07,0x89,0x0F + ,0x41,0x74,0xFA,0x78,0x41,0x7C,0x92,0x00,0x11,0x43 + ,0x41,0x74,0x39,0x79,0x01,0x75,0x79,0x79,0x41,0x75 + ,0x39,0x49,0x09,0x78,0x01,0x29,0x01,0xD1,0xF9,0x79 + ,0x41,0x77,0xFF,0x20,0xF5,0x30,0x36,0x49,0x49,0x68 + ,0xC9,0x0B,0x03,0xD3,0x01,0x1C,0x01,0x38,0x00,0x29 + ,0xF7,0xD1,0x07,0x21,0x49,0x06,0xC8,0x69,0x80,0x23 + ,0x18,0x43,0xC8,0x61,0xFF,0x20,0x2D,0x30,0xF8,0xF7 + ,0x71,0xFA,0x07,0x21,0x49,0x06,0xC8,0x69,0x80,0x23 + ,0x98,0x43,0xC8,0x61,0x01,0xF0,0x12,0xFD,0x38,0x78 + ,0x00,0x21,0x01,0xF0,0x79,0xFA,0x0B,0x21,0x08,0x20 + ,0xF8,0xF7,0x03,0xFB,0xB7,0x21,0x09,0x20,0xF8,0xF7 + ,0xFF,0xFA,0x00,0x21,0x0A,0x20,0xF8,0xF7,0xFB,0xFA + ,0x14,0x20,0xF8,0xF7,0x56,0xFA,0x1F,0x4F,0xF8,0x69 + ,0xBB,0x01,0x18,0x43,0xF8,0x61,0x00,0x20,0xF8,0xF7 + ,0x66,0xFA,0x0A,0x20,0xF8,0xF7,0x4B,0xFA,0x01,0x20 + ,0x80,0x06,0x44,0x61,0xC0,0x68,0x19,0x48,0x78,0x61 + ,0x78,0x68,0xC0,0x0B,0x05,0xD3,0x06,0x21,0x0A,0x20 + ,0xFE,0xF7,0xDA,0xFD,0xB5,0x80,0xF0,0xBD,0x01,0x22 + ,0x55,0x21,0x7D,0x20,0xC0,0x00,0xB5,0x80,0xFF,0xF7 + ,0xCF,0xFE,0x11,0x48,0x01,0x21,0x89,0x06,0x88,0x63 + ,0x10,0x48,0x10,0x4A,0x48,0x63,0xB4,0x80,0x04,0x20 + ,0xB8,0x60,0xD0,0x74,0x00,0x03,0x78,0x60,0x48,0x6A + ,0x0A,0x30,0x08,0x62,0x0C,0x48,0x01,0x21,0xB0,0x80 + ,0x0A,0x20,0xFE,0xF7,0xBB,0xFD,0xF0,0xBD,0xCC,0x02 + ,0x00,0x02,0x08,0x08,0x00,0x00,0xCC,0x07,0x00,0x02 + ,0xB0,0x02,0x00,0x02,0x40,0x00,0x00,0x04,0x04,0x24 + ,0x00,0x00,0x00,0x72,0x01,0x02,0x64,0x10,0x00,0x00 + ,0x44,0x09,0x00,0x02,0x88,0x88,0x00,0x00,0x80,0xB5 + ,0x15,0x49,0x01,0x27,0xC9,0x7C,0x01,0x29,0x13,0xD1 + ,0x13,0x4B,0x18,0x40,0x0E,0xD0,0x88,0x06,0xC0,0x68 + ,0x81,0x09,0x0A,0xD3,0x04,0x21,0x01,0x40,0x10,0x48 + ,0x03,0xD0,0x41,0x68,0x01,0x31,0x41,0x60,0x02,0xE0 + ,0x01,0x68,0x01,0x31,0x01,0x60,0x38,0x1C,0x80,0xBD + ,0x02,0x29,0x01,0xD1,0x38,0x1C,0x80,0xBD,0x03,0x29 + ,0x01,0xD0,0x04,0x29,0x06,0xD1,0x07,0x4B,0x18,0x40 + ,0x01,0xD0,0xFF,0xF7,0xAF,0xFE,0x38,0x1C,0x80,0xBD + ,0x00,0x20,0x80,0xBD,0x00,0x00,0x44,0x09,0x00,0x02 + ,0x40,0x40,0x00,0x00,0xC4,0x02,0x00,0x02,0x80,0x80 + ,0x00,0x00,0xFF,0xB5,0x84,0xB0,0x00,0x20,0x00,0x24 + ,0x00,0x26,0x00,0x27,0x00,0x25,0x03,0x90,0x02,0x90 + ,0x01,0x90,0x68,0x46,0x04,0x22,0x5A,0x49,0xFC,0xF7 + ,0x61,0xFD,0x05,0x99,0x00,0x20,0x00,0x29,0x1B,0xDD + ,0x04,0x99,0x80,0x23,0x09,0x5C,0x0A,0x1C,0x9A,0x43 + ,0x16,0x2A,0x02,0xD1,0x00,0xAB,0xD9,0x70,0x0D,0xE0 + ,0x0B,0x2A,0x02,0xD1,0x00,0xAB,0x99,0x70,0x08,0xE0 + ,0x04,0x2A,0x02,0xD1,0x00,0xAB,0x59,0x70,0x03,0xE0 + ,0x02,0x2A,0x01,0xD1,0x00,0xAB,0x19,0x70,0x05,0x99 + ,0x01,0x30,0x88,0x42,0xE3,0xDB,0x00,0x20,0x69,0x46 + ,0x09,0x5C,0x00,0x29,0x0D,0xD0,0x09,0x0A,0x04,0xD3 + ,0x00,0x2E,0x00,0xD1,0x07,0x1C,0x01,0x26,0x04,0x1C + ,0x01,0x99,0x02,0x90,0x00,0x29,0x02,0xD1,0x01,0x21 + ,0x01,0x91,0x05,0x1C,0x01,0x30,0x04,0x28,0xEA,0xDB + ,0x01,0x99,0x00,0x20,0x00,0x29,0x01,0xD1,0x08,0xB0 + ,0xF0,0xBD,0x00,0x2E,0x01,0xD1,0x2C,0x1C,0x2F,0x1C + ,0x3A,0x49,0x00,0x22,0x8B,0x18,0x1B,0x7C,0x00,0x2B + ,0x00,0xD0,0x03,0x92,0x01,0x32,0x04,0x2A,0xF7,0xDB + ,0x06,0x9B,0x01,0x26,0x0E,0x2B,0x34,0x4A,0x03,0xD1 + ,0x34,0x4B,0x1B,0x78,0x01,0x2B,0x0A,0xD1,0x03,0x98 + ,0x84,0x42,0x02,0xDD,0x03,0x98,0x90,0x72,0x00,0xE0 + ,0x94,0x72,0x02,0x98,0xD0,0x72,0xD7,0x71,0x42,0xE0 + ,0x2D,0x4B,0x1B,0x78,0x00,0x2B,0x3E,0xD1,0x01,0x2D + ,0x10,0xD9,0xD0,0x71,0x96,0x72,0xD6,0x72,0x07,0x9B + ,0x00,0x27,0x01,0x2B,0x35,0xD1,0x82,0x20,0x00,0xAB + ,0x18,0x70,0x84,0x20,0x58,0x70,0x0B,0x20,0x98,0x70 + ,0x16,0x20,0xD8,0x70,0x2B,0xE0,0x01,0x2C,0x0D,0xDD + ,0x00,0xAC,0x64,0x78,0x23,0x0A,0x01,0xD3,0x96,0x72 + ,0x08,0xE0,0x00,0xAC,0x24,0x78,0x23,0x0A,0x01,0xD3 + ,0x90,0x72,0x02,0xE0,0x95,0x72,0x00,0xE0,0x94,0x72 + ,0x01,0x2F,0x0D,0xD9,0x00,0xAC,0x24,0x78,0x23,0x0A + ,0x01,0xD3,0xD0,0x71,0x08,0xE0,0x00,0xAC,0x64,0x78 + ,0x23,0x0A,0x01,0xD3,0xD6,0x71,0x02,0xE0,0xD5,0x71 + ,0x00,0xE0,0xD7,0x71,0x02,0x9B,0x00,0x2B,0x05,0xDD + ,0x00,0xAB,0x5B,0x78,0x00,0x2B,0x01,0xD0,0xD6,0x72 + ,0x00,0xE0,0xD0,0x72,0x00,0x20,0x6B,0x46,0x1B,0x5C + ,0x0C,0x18,0x01,0x30,0x04,0x28,0x23,0x74,0xF8,0xDB + ,0xC8,0x19,0x01,0x7C,0x80,0x23,0x19,0x43,0x01,0x74 + ,0xD0,0x7A,0x05,0x49,0xC8,0x70,0x30,0x1C,0x86,0xE7 + ,0x60,0x99,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x01 + ,0x00,0x02,0xB1,0x02,0x00,0x02,0xC8,0x01,0x00,0x02 + ,0xF0,0xB4,0x44,0x78,0x00,0x26,0x05,0x2C,0x01,0xD8 + ,0x00,0x2C,0x02,0xD1,0x30,0x1C,0xF0,0xBC,0xF7,0x46 + ,0x00,0x22,0x00,0x27,0x00,0x2C,0x17,0xD9,0xC3,0x19 + ,0x9D,0x78,0x6B,0x06,0x5B,0x0E,0x02,0x2B,0x08,0xD0 + ,0x04,0x2B,0x06,0xD0,0x0B,0x2B,0x04,0xD0,0x16,0x2B + ,0x02,0xD0,0x2C,0x2B,0x0B,0xD1,0x04,0xE0,0x2C,0x2B + ,0x02,0xD0,0x13,0x1C,0xCD,0x54,0x01,0x32,0x01,0x37 + ,0xA7,0x42,0xE8,0xD3,0x03,0xE0,0x00,0x2B,0x01,0xD1 + ,0x30,0x1C,0xDD,0xE7,0x10,0x1C,0xDB,0xE7,0xF1,0xB5 + ,0x85,0xB0,0x00,0x20,0x01,0x90,0x68,0x46,0x04,0x22 + ,0x70,0x49,0xFC,0xF7,0x6F,0xFC,0x70,0x4E,0x04,0x24 + ,0x30,0x68,0x45,0x68,0x80,0x89,0x2F,0x28,0x02,0xDA + ,0x00,0x20,0x06,0xB0,0xF0,0xBD,0x05,0x98,0x6B,0x49 + ,0x01,0x28,0x04,0x91,0x09,0xD1,0x06,0x22,0xE8,0x1D + ,0x09,0x30,0x04,0x99,0xFC,0xF7,0x3C,0xFC,0x00,0x28 + ,0x01,0xD0,0x00,0x20,0xEE,0xE7,0x20,0x20,0xE9,0x1D + ,0x19,0x31,0x28,0x5C,0x49,0x78,0x09,0x02,0x08,0x43 + ,0x00,0x04,0x00,0x0C,0x02,0x90,0x14,0x28,0x04,0xDB + ,0x7D,0x23,0x02,0x98,0xDB,0x00,0x98,0x42,0x01,0xDD + ,0x00,0x20,0xDB,0xE7,0x22,0x20,0x28,0x5C,0x80,0x08 + ,0x01,0xD2,0x00,0x20,0xD5,0xE7,0x30,0x68,0x24,0x27 + ,0x80,0x89,0x04,0x38,0x24,0x28,0x45,0xDD,0x56,0x49 + ,0x03,0x91,0xE8,0x5D,0x00,0x28,0x09,0xD0,0x01,0x28 + ,0x20,0xD0,0x03,0x28,0x39,0xD1,0xE8,0x19,0x41,0x78 + ,0x01,0x29,0x27,0xD0,0x00,0x20,0xC0,0xE7,0xEE,0x19 + ,0x70,0x78,0x00,0x28,0x00,0xD1,0xBB,0xE7,0x4D,0x49 + ,0x4A,0x79,0x82,0x42,0x01,0xD0,0x00,0x20,0xB5,0xE7 + ,0x03,0x99,0xB0,0x1C,0xFC,0xF7,0xFB,0xFB,0x00,0x28 + ,0x01,0xD0,0x00,0x20,0xAD,0xE7,0x70,0x78,0xC0,0x19 + ,0x87,0x1C,0x01,0x20,0x01,0x90,0x14,0xE0,0xE8,0x19 + ,0x69,0x46,0x06,0x1C,0xFF,0xF7,0x66,0xFF,0x04,0x1C + ,0x01,0xD1,0x00,0x20,0x9E,0xE7,0x70,0x78,0xC0,0x19 + ,0x87,0x1C,0x07,0xE0,0x3D,0x49,0x80,0x78,0x09,0x7D + ,0x88,0x42,0x01,0xD0,0x00,0x20,0x93,0xE7,0x03,0x37 + ,0x35,0x4E,0x30,0x68,0x80,0x89,0x04,0x38,0xB8,0x42 + ,0xBE,0xDC,0x01,0x98,0x00,0x28,0x01,0xD1,0x00,0x20 + ,0x87,0xE7,0x34,0x49,0x68,0x46,0x01,0x23,0x0A,0x7D + ,0x21,0x1C,0xFF,0xF7,0x78,0xFE,0x00,0x28,0x00,0xD1 + ,0x7D,0xE7,0x04,0x20,0xF9,0xF7,0x10,0xFE,0x2E,0x48 + ,0x20,0x23,0x01,0x78,0x2E,0x4F,0x19,0x43,0x01,0x70 + ,0x01,0x78,0x10,0x23,0x19,0x43,0x01,0x70,0xE9,0x18 + ,0x0C,0x1C,0xF8,0x1D,0x06,0x22,0x07,0x30,0xFC,0xF7 + ,0xD1,0xFB,0x06,0x22,0x21,0x1C,0x04,0x98,0xFC,0xF7 + ,0xCC,0xFB,0x21,0x4C,0xF8,0x1D,0x62,0x79,0x03,0x99 + ,0x0D,0x30,0xFC,0xF7,0xC5,0xFB,0x22,0x48,0x01,0x25 + ,0xFE,0x1D,0x29,0x36,0x05,0x75,0x35,0x71,0x02,0x98 + ,0x38,0x80,0xA5,0x70,0x05,0x98,0x01,0x28,0x08,0xD1 + ,0x00,0x21,0x00,0x20,0x01,0xF0,0xE5,0xFA,0x13,0x49 + ,0x00,0x20,0x09,0x68,0x48,0x61,0x07,0xE0,0xF9,0xF7 + ,0x9E,0xFD,0x39,0x88,0x89,0x02,0x09,0x1A,0x06,0x20 + ,0xF9,0xF7,0xBC,0xFD,0x14,0x49,0x00,0x20,0x48,0x70 + ,0x05,0x20,0x88,0x71,0x05,0x98,0x01,0x28,0x04,0xD1 + ,0x01,0x21,0x04,0x20,0xFE,0xF7,0x9E,0xFB,0x00,0xE0 + ,0xB5,0x71,0x0E,0x48,0x01,0x68,0x0E,0x48,0xC2,0x69 + ,0x11,0x43,0xC1,0x61,0x0D,0x48,0x05,0x70,0x28,0x1C + ,0x28,0xE7,0x64,0x99,0x00,0x00,0x48,0x01,0x00,0x02 + ,0xFC,0x00,0x00,0x02,0xDC,0x00,0x00,0x02,0x04,0x01 + ,0x00,0x02,0x00,0x00,0x00,0x02,0x94,0x01,0x00,0x02 + ,0x80,0x00,0x00,0x02,0x44,0x09,0x00,0x02,0x94,0x09 + ,0x00,0x02,0xA4,0x02,0x00,0x02,0x40,0x00,0x00,0x04 + ,0x3A,0x01,0x00,0x02,0xF0,0xB5,0x84,0xB0,0x5A,0x49 + ,0x04,0x22,0x01,0xA8,0xFC,0xF7,0x6F,0xFB,0x59,0x4F + ,0x59,0x49,0x38,0x68,0x00,0x25,0x46,0x68,0x06,0x22 + ,0xF0,0x1D,0x09,0x30,0x03,0x91,0xFC,0xF7,0x46,0xFB + ,0x00,0x28,0x02,0xD0,0x00,0x20,0x04,0xB0,0xF0,0xBD + ,0x39,0x68,0x38,0x1C,0x89,0x89,0x2F,0x29,0x01,0xDA + ,0x00,0x20,0xF6,0xE7,0x20,0x22,0xF3,0x1D,0x19,0x33 + ,0xB2,0x5C,0x5B,0x78,0x1B,0x02,0x1A,0x43,0x12,0x04 + ,0x12,0x0C,0x00,0x92,0x14,0x2A,0x04,0xDB,0x7D,0x23 + ,0x00,0x9A,0xDB,0x00,0x9A,0x42,0x01,0xDD,0x00,0x20 + ,0xE3,0xE7,0x22,0x22,0xB2,0x5C,0x52,0x08,0x01,0xD2 + ,0x00,0x20,0xDD,0xE7,0x24,0x27,0x04,0x39,0x24,0x29 + ,0x34,0xDD,0xF0,0x5D,0x00,0x28,0x09,0xD0,0x01,0x28 + ,0x11,0xD0,0x03,0x28,0x2B,0xD1,0xF0,0x19,0x41,0x78 + ,0x01,0x29,0x19,0xD0,0x00,0x20,0xCC,0xE7,0xF0,0x19 + ,0x40,0x78,0x20,0x28,0x01,0xD9,0x00,0x25,0x00,0xE0 + ,0x01,0x25,0xC0,0x19,0x87,0x1C,0x15,0xE0,0xF0,0x19 + ,0x02,0x90,0x01,0xA9,0xFF,0xF7,0x7B,0xFE,0x04,0x1C + ,0x01,0xD1,0x00,0x20,0xB9,0xE7,0x02,0x98,0x40,0x78 + ,0xC0,0x19,0x87,0x1C,0x07,0xE0,0x2E,0x49,0x80,0x78 + ,0x09,0x7D,0x88,0x42,0x01,0xD0,0x00,0x20,0xAD,0xE7 + ,0x03,0x37,0x28,0x48,0x00,0x68,0x80,0x89,0x04,0x38 + ,0xB8,0x42,0xCC,0xDC,0x00,0x2D,0x01,0xD1,0x00,0x20 + ,0xA2,0xE7,0x25,0x49,0x01,0x23,0x0A,0x7D,0x21,0x1C + ,0x01,0xA8,0xFF,0xF7,0x8D,0xFD,0x00,0x28,0x00,0xD1 + ,0x98,0xE7,0x22,0x4C,0x06,0x22,0xE0,0x1D,0x07,0x30 + ,0x1F,0x4F,0x03,0x99,0xFC,0xF7,0xF2,0xFA,0xE0,0x1D + ,0x0D,0x30,0x20,0x22,0xF9,0x1D,0x15,0x31,0xFC,0xF7 + ,0xEB,0xFA,0xF8,0x1D,0x39,0x30,0x81,0x78,0xE0,0x1D + ,0x29,0x30,0x01,0x71,0x01,0x79,0x18,0x48,0x20,0x23 + ,0x01,0x75,0x00,0x9A,0x17,0x49,0x22,0x80,0x0A,0x78 + ,0x1A,0x43,0x0A,0x70,0x0A,0x78,0x10,0x23,0x1A,0x43 + ,0x0A,0x70,0x00,0x21,0x13,0x4A,0x50,0x30,0x41,0x70 + ,0x91,0x70,0x05,0x21,0x81,0x71,0x04,0x20,0xF9,0xF7 + ,0xFB,0xFC,0x01,0x21,0x04,0x20,0xFE,0xF7,0xCB,0xFA + ,0x0E,0x48,0x01,0x68,0x0E,0x48,0xC2,0x69,0x11,0x43 + ,0xC1,0x61,0x0D,0x49,0x01,0x20,0x08,0x70,0x5D,0xE7 + ,0x00,0x00,0x68,0x99,0x00,0x00,0x48,0x01,0x00,0x02 + ,0xFC,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0xC0,0x00 + ,0x00,0x02,0x80,0x00,0x00,0x02,0x44,0x09,0x00,0x02 + ,0x94,0x01,0x00,0x02,0x04,0x01,0x00,0x02,0xA4,0x02 + ,0x00,0x02,0x40,0x00,0x00,0x04,0x3A,0x01,0x00,0x02 + ,0xF0,0xB4,0x1D,0x4A,0x1D,0x4B,0xD1,0x1D,0x69,0x31 + ,0xC9,0x7A,0x49,0x00,0x5F,0x5A,0xD1,0x1D,0x59,0x31 + ,0x0B,0x8B,0x01,0x3B,0x1B,0x04,0x1B,0x14,0x0B,0x83 + ,0x00,0x2B,0x26,0xDD,0x17,0x4B,0x01,0x25,0x5C,0x7A + ,0x50,0x32,0xD3,0x79,0x00,0x2B,0x04,0xD1,0x05,0x30 + ,0x0E,0x28,0x05,0xD9,0x0E,0x38,0x03,0xE0,0x01,0x30 + ,0x0E,0x28,0x00,0xD9,0x01,0x20,0x00,0x2C,0x05,0xD1 + ,0x2B,0x1C,0x46,0x1E,0xB3,0x40,0x3B,0x40,0x10,0xD1 + ,0x07,0xE0,0xD3,0x79,0x00,0x2B,0x0C,0xD1,0x0A,0x4B + ,0x1B,0x18,0x5B,0x7B,0x00,0x2B,0x07,0xD1,0x0B,0x8B + ,0x01,0x3B,0x1B,0x04,0x1B,0x14,0x0B,0x83,0x00,0x2B + ,0xDC,0xDC,0x00,0x20,0xF0,0xBC,0xF7,0x46,0x00,0x00 + ,0x44,0x09,0x00,0x02,0x6C,0x02,0x00,0x02,0xB0,0x00 + ,0x00,0x02,0x14,0x01,0x00,0x02,0xF0,0xB5,0x29,0x4C + ,0x07,0x1C,0x00,0x26,0x27,0x70,0xE0,0x1D,0x03,0x30 + ,0x66,0x70,0x66,0x80,0x06,0x22,0x25,0x49,0xFC,0xF7 + ,0x55,0xFA,0x25,0x4D,0xE0,0x1D,0x09,0x30,0x06,0x22 + ,0xE9,0x1D,0x35,0x31,0xFC,0xF7,0x4D,0xFA,0xFF,0x20 + ,0x20,0x71,0x60,0x71,0xA0,0x71,0xE0,0x71,0x20,0x72 + ,0x60,0x72,0x38,0x1C,0x40,0x28,0x1D,0x4F,0x1D,0xD0 + ,0x00,0xF0,0xE8,0xF8,0x00,0xF0,0xF0,0xF8,0xE5,0x1D + ,0x1D,0x35,0x28,0x1C,0x00,0xF0,0x0B,0xF9,0x2D,0x18 + ,0x28,0x1C,0x00,0xF0,0x23,0xF9,0x2D,0x18,0x16,0x48 + ,0x80,0x7D,0x02,0x28,0x03,0xD1,0x28,0x1C,0x00,0xF0 + ,0x33,0xF9,0x2D,0x18,0x28,0x1C,0x00,0xF0,0x3D,0xF9 + ,0x28,0x18,0x00,0x1B,0xF8,0x64,0xB8,0x64,0xF0,0xBD + ,0x26,0x76,0x0F,0x4E,0xE0,0x1D,0x72,0x79,0x13,0x30 + ,0xE9,0x1D,0x15,0x31,0x62,0x76,0xFC,0xF7,0x1A,0xFA + ,0x70,0x79,0x00,0x19,0x1A,0x30,0x00,0xF0,0x03,0xF9 + ,0x70,0x79,0x20,0x30,0x00,0x06,0x00,0x0E,0xB8,0x64 + ,0xF0,0xBD,0x00,0x00,0x04,0x08,0x00,0x02,0x5C,0x00 + ,0x00,0x02,0xC0,0x00,0x00,0x02,0x44,0x09,0x00,0x02 + ,0x00,0x00,0x00,0x02,0x04,0x01,0x00,0x02,0xF8,0xB5 + ,0x07,0x1C,0xFF,0xF7,0x9C,0xFF,0x00,0x26,0x80,0x2F + ,0x47,0x4D,0x0E,0xD1,0xC0,0x20,0xFB,0xF7,0x13,0xFE + ,0x04,0x1C,0x45,0x48,0x41,0x7B,0x03,0x29,0x03,0xD0 + ,0x20,0x1C,0xFB,0xF7,0x0B,0xFE,0xF8,0xBD,0x01,0x21 + ,0x41,0x73,0x10,0xE0,0x40,0x2F,0x05,0xD1,0x40,0x48 + ,0x01,0x21,0x81,0x74,0x3F,0x48,0x46,0x80,0x08,0xE0 + ,0x50,0x2F,0x06,0xD1,0x3E,0x48,0x3E,0x49,0x06,0x22 + ,0xFC,0xF7,0xDC,0xF9,0x01,0x21,0x29,0x71,0x3C,0x48 + ,0xF7,0xF7,0xAF,0xFF,0x50,0x2F,0x02,0xD1,0x36,0x48 + ,0xC0,0x6C,0x01,0xE0,0x34,0x48,0x80,0x6C,0x33,0x49 + ,0x88,0x66,0x37,0x48,0x89,0x6E,0xC0,0x79,0xF9,0xF7 + ,0xEF,0xFA,0x30,0x49,0x50,0x2F,0xC8,0x66,0x0C,0xD1 + ,0x2E,0x48,0x2E,0x49,0xC0,0x6E,0x48,0x80,0x31,0x48 + ,0xC0,0x79,0xF9,0xF7,0x83,0xFF,0x2B,0x49,0x49,0x88 + ,0x40,0x18,0x29,0x49,0x48,0x80,0x28,0x48,0x27,0x49 + ,0x80,0x2F,0x48,0x66,0x16,0xD1,0xFC,0xF7,0x31,0xFA + ,0x2A,0x49,0x89,0x89,0x49,0x00,0x01,0x31,0x08,0x40 + ,0x21,0x49,0x88,0x62,0x27,0x48,0x00,0x88,0x08,0x62 + ,0x89,0x6A,0x8B,0x00,0x59,0x18,0x89,0x00,0x09,0x18 + ,0x08,0x20,0xF9,0xF7,0xB3,0xFB,0x20,0x1C,0xFB,0xF7 + ,0xB8,0xFD,0xF8,0xF7,0xEC,0xFF,0xF9,0xF7,0x56,0xF8 + ,0x00,0x90,0x80,0x2F,0x05,0xD1,0x00,0x98,0x00,0x28 + ,0x23,0xD1,0x01,0x21,0x69,0x70,0x20,0xE0,0x40,0x2F + ,0x1E,0xD1,0x12,0x4C,0xC0,0x20,0xA6,0x74,0xFB,0xF7 + ,0xA4,0xFD,0x07,0x1C,0xA8,0x79,0x01,0x28,0x12,0xD1 + ,0x00,0x98,0x00,0x28,0x0D,0xD1,0xE0,0x1D,0x69,0x30 + ,0x81,0x7A,0x00,0x29,0x0A,0xD1,0x01,0x21,0x81,0x72 + ,0x0E,0x49,0xC8,0x8A,0x81,0x02,0x04,0x20,0xF9,0xF7 + ,0x88,0xFB,0x01,0xE0,0x01,0x21,0x69,0x71,0x38,0x1C + ,0xFB,0xF7,0x8A,0xFD,0x7D,0xE7,0x00,0x00,0x94,0x09 + ,0x00,0x02,0x54,0x09,0x00,0x02,0x44,0x09,0x00,0x02 + ,0x04,0x08,0x00,0x02,0x08,0x08,0x00,0x02,0x30,0x01 + ,0x00,0x02,0x1A,0x08,0x00,0x02,0x04,0x01,0x00,0x02 + ,0xC0,0x00,0x00,0x02,0xA8,0x01,0x00,0x02,0x03,0x49 + ,0x02,0x48,0x09,0x88,0x01,0x80,0xF7,0x46,0x00,0x00 + ,0x24,0x08,0x00,0x02,0x80,0x00,0x00,0x02,0x0D,0x49 + ,0x0C,0x48,0x8A,0x7A,0x92,0x00,0x02,0x80,0xC9,0x7A + ,0x00,0x29,0x03,0xD0,0x01,0x88,0x10,0x23,0x19,0x43 + ,0x01,0x80,0x08,0x49,0x49,0x7A,0x01,0x29,0x04,0xD1 + ,0x01,0x88,0x22,0x23,0x19,0x43,0x01,0x80,0xF7,0x46 + ,0x01,0x88,0x02,0x23,0x19,0x43,0x01,0x80,0xF7,0x46 + ,0x26,0x08,0x00,0x02,0x80,0x00,0x00,0x02,0x04,0x01 + ,0x00,0x02,0x90,0xB4,0x01,0x1C,0x00,0x20,0x0A,0x4A + ,0x08,0x70,0x53,0x79,0x00,0x2B,0x08,0xD9,0x08,0x4B + ,0x1F,0x18,0x3F,0x7D,0x0C,0x18,0x01,0x30,0xA7,0x70 + ,0x57,0x79,0x87,0x42,0xF7,0xD8,0x50,0x79,0x48,0x70 + ,0x50,0x79,0x90,0xBC,0x02,0x30,0xF7,0x46,0x00,0x00 + ,0x04,0x01,0x00,0x02,0x80,0x00,0x00,0x02,0x90,0xB4 + ,0x01,0x1C,0x01,0x20,0x08,0x70,0x00,0x20,0x08,0x4B + ,0x00,0x22,0x9F,0x18,0x3F,0x7C,0x00,0x2F,0x02,0xD0 + ,0x0C,0x18,0xA7,0x70,0x01,0x30,0x01,0x32,0x04,0x2A + ,0xF5,0xD3,0x48,0x70,0x90,0xBC,0x02,0x30,0xF7,0x46 + ,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x21,0x01,0x70 + ,0x01,0x22,0x42,0x70,0x01,0x30,0x80,0x18,0x02,0x4A + ,0x12,0x7D,0x02,0x70,0x08,0x1C,0xF7,0x46,0x00,0x00 + ,0x00,0x00,0x00,0x02,0x06,0x21,0x01,0x70,0x02,0x21 + ,0x41,0x70,0x04,0x49,0x02,0x30,0x0A,0x89,0x02,0x70 + ,0x09,0x89,0x09,0x0A,0x41,0x70,0x04,0x20,0xF7,0x46 + ,0x00,0x00,0x80,0x00,0x00,0x02,0x0A,0x21,0x01,0x70 + ,0x02,0x21,0x41,0x70,0x00,0x21,0x81,0x70,0x02,0x30 + ,0x41,0x1C,0x07,0x20,0x08,0x70,0x04,0x20,0xF7,0x46 + ,0xF0,0xB5,0x83,0xB0,0x51,0x48,0x52,0x4D,0x48,0x21 + ,0x01,0x70,0x01,0x26,0xEC,0x1D,0x29,0x34,0x46,0x70 + ,0x62,0x79,0x11,0x21,0x4E,0x4F,0x02,0x2A,0x01,0xD1 + ,0x41,0x70,0x05,0xE0,0x03,0x2A,0x03,0xD1,0xBA,0x78 + ,0x08,0x2A,0x00,0xD1,0x41,0x70,0x4A,0x49,0x09,0x68 + ,0x89,0x78,0x00,0x29,0x03,0xD0,0x41,0x78,0x08,0x23 + ,0x19,0x43,0x41,0x70,0x46,0x49,0x00,0x23,0x00,0x22 + ,0x46,0x48,0xC9,0x79,0xF7,0xF7,0x8F,0xFE,0x45,0x48 + ,0x45,0x49,0x06,0x22,0xFC,0xF7,0xA4,0xF8,0xE9,0x1D + ,0x07,0x31,0x0D,0x1C,0x06,0x22,0x42,0x48,0xFC,0xF7 + ,0x9D,0xF8,0x29,0x1C,0x06,0x22,0x41,0x48,0xFC,0xF7 + ,0x98,0xF8,0x40,0x4D,0x18,0x20,0xA8,0x66,0x39,0x48 + ,0x18,0x21,0xC0,0x79,0xF9,0xF7,0xB6,0xF9,0xE8,0x66 + ,0x32,0x48,0xEE,0x1D,0x68,0x66,0x01,0x20,0x49,0x36 + ,0xF0,0x70,0xF8,0xF7,0xD9,0xFE,0xF8,0xF7,0x43,0xFF + ,0x02,0x90,0x00,0x20,0xF0,0x70,0x02,0x98,0x00,0x28 + ,0x01,0xD0,0x03,0xB0,0xF0,0xBD,0x02,0x26,0x2C,0x48 + ,0x6E,0x60,0xC0,0x79,0x32,0x49,0x40,0x00,0x08,0x5A + ,0x31,0x49,0xC9,0x88,0x40,0x18,0x31,0x49,0x09,0x88 + ,0x41,0x18,0x01,0x20,0xF9,0xF7,0x81,0xFA,0x00,0x22 + ,0xD2,0x43,0x6E,0x74,0x00,0x92,0x01,0x22,0x10,0x21 + ,0x01,0xAB,0x2B,0x48,0xFB,0xF7,0x1D,0xFC,0x00,0x20 + ,0x1E,0x49,0x68,0x74,0x0A,0x68,0x53,0x78,0x00,0x2B + ,0x22,0xD0,0x93,0x78,0x01,0x33,0x1B,0x06,0x1B,0x0E + ,0x93,0x70,0x04,0x2B,0x02,0xDA,0x09,0x68,0x48,0x70 + ,0xD2,0xE7,0x60,0x79,0x01,0x28,0x1F,0xDD,0x02,0x28 + ,0x03,0xD1,0xBA,0x78,0x08,0x23,0x9A,0x43,0xBA,0x70 + ,0x03,0x28,0x17,0xD1,0x0E,0x48,0x40,0x78,0x40,0x09 + ,0x06,0xD3,0x01,0x20,0xF8,0x70,0xB8,0x78,0x08,0x23 + ,0x98,0x43,0xB8,0x70,0x0C,0xE0,0x01,0x20,0xB8,0x71 + ,0x09,0xE0,0x60,0x79,0x03,0x28,0x06,0xD1,0x05,0x4A + ,0x01,0x20,0x52,0x78,0x52,0x09,0x00,0xD3,0x00,0x20 + ,0xF8,0x70,0x09,0x68,0x40,0x20,0x08,0x70,0xAB,0xE7 + ,0x00,0x00,0x04,0x08,0x00,0x02,0x80,0x00,0x00,0x02 + ,0xB4,0x09,0x00,0x02,0xD0,0x01,0x00,0x02,0x04,0x01 + ,0x00,0x02,0x06,0x08,0x00,0x02,0x0E,0x08,0x00,0x02 + ,0x5C,0x00,0x00,0x02,0x14,0x08,0x00,0x02,0x08,0x08 + ,0x00,0x02,0x44,0x09,0x00,0x02,0xB0,0x01,0x00,0x02 + ,0x00,0x00,0x00,0x02,0xAE,0x01,0x00,0x02,0xF8,0x06 + ,0x00,0x02,0xF8,0xB4,0x00,0x26,0x82,0x1C,0x06,0x29 + ,0x01,0xD3,0x48,0x08,0x02,0xD3,0x00,0x20,0xF8,0xBC + ,0xF7,0x46,0x00,0x24,0x03,0x23,0x00,0x25,0xCF,0x1E + ,0x17,0xD0,0x01,0x39,0xD0,0x5C,0x99,0x42,0x02,0xD1 + ,0x00,0x28,0x0F,0xD1,0x0C,0xE0,0x0E,0x28,0x0C,0xD8 + ,0x01,0x28,0x0A,0xD3,0xA8,0x42,0x08,0xD3,0xD5,0x18 + ,0x6D,0x78,0x03,0x33,0x03,0x34,0x2D,0x18,0xA7,0x42 + ,0xEC,0xD8,0x01,0x2E,0x01,0xD1,0x00,0x20,0xE0,0xE7 + ,0x1B,0x48,0xC0,0x79,0x01,0x28,0x00,0xD1,0xDB,0xE7 + ,0x19,0x48,0xC1,0x1D,0x29,0x31,0x49,0x7A,0x00,0x29 + ,0x01,0xD1,0x01,0x20,0xD3,0xE7,0x91,0x78,0x3A,0x30 + ,0x00,0x23,0x81,0x70,0x51,0x78,0x41,0x70,0x11,0x78 + ,0x01,0x70,0x03,0x21,0x00,0x2F,0x1B,0xD9,0x50,0x5C + ,0x00,0x28,0x18,0xD0,0x0F,0x4D,0x01,0x26,0x2C,0x18 + ,0x66,0x73,0x54,0x18,0x00,0x94,0x64,0x78,0x24,0x18 + ,0xA0,0x42,0x0A,0xD2,0x0A,0x4D,0x01,0x26,0x2D,0x18 + ,0x6E,0x73,0x00,0x9E,0x10,0x3D,0xB6,0x78,0x01,0x30 + ,0xA0,0x42,0xEE,0x73,0xF4,0xD3,0x03,0x31,0x03,0x33 + ,0x9F,0x42,0xE3,0xD8,0x01,0x20,0xAA,0xE7,0x00,0x00 + ,0xB4,0x09,0x00,0x02,0x80,0x00,0x00,0x02,0x14,0x01 + ,0x00,0x02,0xF1,0xB5,0x81,0xB0,0x22,0x4F,0x01,0x9E + ,0x3F,0x68,0x00,0x24,0xBF,0x89,0x00,0x21,0x24,0x20 + ,0x3D,0x1F,0x00,0x95,0x24,0x2D,0x39,0xD9,0x1E,0x4F + ,0x7F,0x7A,0x35,0x5C,0x03,0x2D,0x08,0xD0,0x07,0x2D + ,0x0D,0xD1,0x35,0x18,0x6D,0x78,0x01,0x24,0x03,0x1C + ,0x02,0x35,0x28,0x18,0x0A,0xE0,0x35,0x18,0x6D,0x78 + ,0x01,0x21,0x02,0x1C,0x02,0x35,0x28,0x18,0x05,0xE0 + ,0x35,0x18,0x6D,0x78,0x02,0x35,0x28,0x18,0x00,0x29 + ,0x01,0xD0,0x00,0x2F,0x02,0xD0,0x00,0x9D,0x85,0x42 + ,0xE1,0xD8,0x00,0x29,0x17,0xD0,0xB0,0x18,0x40,0x78 + ,0x01,0x28,0x01,0xD0,0x02,0xB0,0xF0,0xBD,0x01,0x2F + ,0x0F,0xD1,0x00,0x2C,0x0D,0xD0,0x01,0x98,0xC0,0x18 + ,0x41,0x78,0xFF,0xF7,0x5E,0xFF,0x00,0x28,0x00,0xD1 + ,0xF1,0xE7,0x05,0x48,0xC1,0x79,0x00,0x29,0x01,0xD1 + ,0x01,0x21,0xC1,0x71,0xEA,0xE7,0x48,0x01,0x00,0x02 + ,0xB0,0x00,0x00,0x02,0xB4,0x09,0x00,0x02,0x00,0xB5 + ,0x05,0x49,0x89,0x7C,0x01,0x29,0x04,0xD1,0x01,0x78 + ,0x80,0x29,0x01,0xD1,0xFF,0xF7,0xA8,0xFF,0x00,0xBD + ,0x00,0x00,0xC0,0x00,0x00,0x02,0x90,0xB5,0x10,0x4C + ,0x60,0x78,0x00,0x28,0x1A,0xD0,0x0F,0x4F,0x38,0x68 + ,0x40,0x68,0x42,0x7E,0x18,0x30,0x00,0x2A,0x09,0xD0 + ,0x0C,0x49,0x49,0x79,0x91,0x42,0x0F,0xD1,0x0B,0x49 + ,0x02,0x30,0xFB,0xF7,0x1A,0xFF,0x00,0x28,0x09,0xD1 + ,0x38,0x68,0x40,0x68,0xC1,0x1D,0x03,0x31,0x06,0x22 + ,0x07,0x48,0xFB,0xF7,0x2E,0xFF,0x01,0x20,0xA0,0x70 + ,0x90,0xBD,0x00,0x00,0x94,0x09,0x00,0x02,0x48,0x01 + ,0x00,0x02,0x04,0x01,0x00,0x02,0x94,0x00,0x00,0x02 + ,0x30,0x01,0x00,0x02,0xB0,0xB4,0x03,0x78,0x00,0x27 + ,0x20,0x49,0x20,0x4A,0x08,0x2B,0x37,0xD1,0xD3,0x78 + ,0x00,0x2B,0x04,0xD0,0xD0,0x7A,0x09,0x68,0x88,0x75 + ,0xB0,0xBC,0xF7,0x46,0x00,0x79,0x40,0x08,0x03,0xD3 + ,0x90,0x7A,0x09,0x68,0x88,0x75,0xF6,0xE7,0x0B,0x68 + ,0x99,0x7D,0xD2,0x7A,0x91,0x42,0x01,0xDD,0x9A,0x75 + ,0xEF,0xE7,0x15,0x4C,0x08,0x19,0x00,0x7C,0x00,0x28 + ,0xEA,0xD1,0x08,0x1C,0x01,0x29,0x0A,0xD3,0x01,0x38 + ,0x25,0x18,0x2D,0x7C,0x00,0x2D,0x03,0xD1,0x01,0x28 + ,0xF8,0xD2,0x00,0x2F,0x01,0xD0,0x98,0x75,0xDC,0xE7 + ,0x8A,0x42,0x06,0xD9,0x01,0x31,0x60,0x18,0x00,0x7C + ,0x00,0x28,0x03,0xD1,0x8A,0x42,0xF8,0xD8,0x00,0x2F + ,0x01,0xD0,0x99,0x75,0xCF,0xE7,0x9A,0x75,0xCD,0xE7 + ,0xD0,0x79,0x09,0x68,0x88,0x75,0xC9,0xE7,0x00,0x00 + ,0xC4,0x01,0x00,0x02,0x04,0x01,0x00,0x02,0x00,0x00 + ,0x00,0x02,0x00,0xB5,0x07,0x48,0x81,0x79,0x03,0x29 + ,0x02,0xD0,0x81,0x79,0x04,0x29,0x05,0xD1,0x00,0x21 + ,0x81,0x71,0x07,0x21,0x04,0x20,0xFD,0xF7,0xCA,0xFE + ,0x00,0xBD,0x00,0x00,0x94,0x09,0x00,0x02,0x90,0xB5 + ,0x27,0x48,0x27,0x49,0x00,0x68,0x47,0x68,0x22,0x20 + ,0x38,0x5C,0x10,0x23,0x18,0x40,0x03,0xD0,0x08,0x78 + ,0x00,0x28,0x41,0xD0,0x02,0xE0,0x08,0x78,0x00,0x28 + ,0x3D,0xD1,0x24,0x20,0x38,0x5C,0x00,0x28,0x39,0xD1 + ,0xF8,0x1D,0x1D,0x30,0x44,0x78,0x1D,0x49,0x00,0x2C + ,0x02,0xD0,0x4A,0x79,0xA2,0x42,0x30,0xD1,0x4A,0x79 + ,0x1B,0x49,0x02,0x30,0xFB,0xF7,0x83,0xFE,0x00,0x28 + ,0x29,0xD1,0x38,0x19,0x20,0x30,0xC0,0x79,0x00,0x19 + ,0x28,0x30,0x39,0x5C,0x03,0x29,0x21,0xD1,0x38,0x18 + ,0x14,0x49,0x80,0x78,0x09,0x7D,0x88,0x42,0x1B,0xD1 + ,0x13,0x48,0x40,0x7A,0x00,0x28,0x05,0xD0,0x12,0x48 + ,0x08,0x18,0x40,0x7B,0x00,0x28,0x12,0xD0,0x09,0xE0 + ,0x10,0x48,0x10,0x4A,0xC0,0x7A,0x40,0x00,0x10,0x5A + ,0x01,0x22,0x01,0x39,0x8A,0x40,0x10,0x40,0x07,0xD0 + ,0x01,0x20,0xF8,0xF7,0x7A,0xF9,0x00,0x28,0x02,0xD0 + ,0x02,0x20,0xFF,0xF7,0xFD,0xF9,0x90,0xBD,0x48,0x01 + ,0x00,0x02,0x18,0x00,0x00,0x02,0x04,0x01,0x00,0x02 + ,0xDC,0x00,0x00,0x02,0x00,0x00,0x00,0x02,0xB0,0x00 + ,0x00,0x02,0x14,0x01,0x00,0x02,0xB4,0x09,0x00,0x02 + ,0x6C,0x02,0x00,0x02,0x80,0xB5,0xFD,0xF7,0x93,0xFD + ,0x1A,0x48,0x00,0xF0,0x58,0xFD,0x19,0x4B,0x1A,0x48 + ,0x59,0x7A,0x01,0x29,0x04,0xD1,0x48,0x21,0x41,0x81 + ,0x18,0x21,0x01,0x81,0x03,0xE0,0x90,0x21,0x41,0x81 + ,0x30,0x21,0x01,0x81,0x41,0x89,0x02,0x89,0x14,0x4F + ,0x89,0x18,0x12,0x4A,0x11,0x80,0xC2,0x88,0x80,0x88 + ,0x11,0x18,0x09,0x18,0x39,0x80,0x51,0x18,0xFF,0x31 + ,0x10,0x4A,0x31,0x31,0x11,0x80,0x19,0x88,0x10,0x4F + ,0x48,0x43,0x0E,0x49,0x08,0x80,0xD8,0x79,0x0E,0x49 + ,0x38,0x70,0x38,0x78,0x08,0x70,0xF7,0xF7,0xC0,0xFA + ,0xF8,0xF7,0x8C,0xFF,0x39,0x78,0x0B,0x48,0x40,0x5C + ,0x0B,0x49,0x08,0x70,0x80,0xBD,0x5C,0x00,0x00,0x02 + ,0x04,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0xAC,0x01 + ,0x00,0x02,0xA8,0x01,0x00,0x02,0xAA,0x01,0x00,0x02 + ,0xAE,0x01,0x00,0x02,0x92,0x01,0x00,0x02,0x93,0x01 + ,0x00,0x02,0xC0,0x01,0x00,0x02,0x91,0x01,0x00,0x02 + ,0x80,0xB4,0x21,0x48,0x00,0x21,0x01,0x70,0x00,0x20 + ,0x19,0x27,0x1F,0x4A,0xFF,0x02,0x11,0x54,0x01,0x30 + ,0xB8,0x42,0xFB,0xDB,0x00,0x20,0x43,0x27,0x1C,0x4A + ,0x7F,0x02,0x11,0x54,0x01,0x30,0xB8,0x42,0xFB,0xDB + ,0x1A,0x48,0x18,0x4A,0x01,0x80,0x1A,0x48,0x1A,0x4B + ,0x02,0x60,0x13,0x60,0x02,0x68,0xD7,0x1D,0x15,0x37 + ,0x57,0x60,0x02,0x68,0x08,0x3F,0x97,0x60,0x02,0x68 + ,0x11,0x73,0x02,0x68,0x91,0x73,0x07,0x68,0x03,0x22 + ,0xBA,0x75,0x02,0x68,0x91,0x82,0x00,0x68,0x11,0x4A + ,0x10,0x60,0x11,0x48,0x0C,0x4A,0x01,0x80,0x11,0x48 + ,0x02,0x60,0x13,0x60,0x02,0x68,0xD3,0x1D,0x11,0x33 + ,0x53,0x60,0x02,0x68,0x91,0x81,0x02,0x68,0x11,0x72 + ,0x00,0x68,0x0C,0x49,0x08,0x60,0x0C,0x49,0x01,0x20 + ,0x08,0x70,0x80,0xBC,0xF7,0x46,0x94,0x01,0x00,0x02 + ,0x00,0x11,0x00,0x02,0x00,0xDA,0x00,0x02,0xF0,0x01 + ,0x00,0x02,0xC4,0x01,0x00,0x02,0x00,0x00,0x00,0x80 + ,0x68,0x02,0x00,0x02,0xF2,0x01,0x00,0x02,0x48,0x01 + ,0x00,0x02,0x64,0x02,0x00,0x02,0xDF,0x01,0x00,0x02 + ,0xF0,0xB5,0x82,0xB0,0x39,0x4E,0xF7,0x1D,0x69,0x37 + ,0xB8,0x78,0x04,0x23,0x18,0x40,0x40,0x24,0x00,0x25 + ,0x00,0x28,0x03,0xD1,0x7D,0x71,0x3C,0x71,0x02,0xB0 + ,0xF0,0xBD,0x33,0x49,0xA4,0x20,0x08,0x70,0x10,0x20 + ,0x48,0x70,0x32,0x48,0x03,0x23,0xC0,0x88,0x9B,0x03 + ,0x18,0x43,0x48,0x80,0xC8,0x1D,0x03,0x30,0x06,0x22 + ,0x2E,0x49,0xFB,0xF7,0x99,0xFD,0x2E,0x49,0x2E,0x48 + ,0x06,0x22,0xFB,0xF7,0x94,0xFD,0x10,0x20,0x2D,0x49 + ,0xB0,0x66,0xC8,0x79,0x10,0x21,0xF8,0xF7,0xB3,0xFE + ,0xF0,0x66,0x24,0x48,0x70,0x66,0x01,0x20,0x38,0x70 + ,0xF8,0xF7,0xD8,0xFB,0xF8,0xF7,0x42,0xFC,0x3D,0x70 + ,0x82,0x25,0x00,0x28,0x2E,0xD1,0x23,0x49,0x24,0x48 + ,0xC9,0x79,0x24,0x4A,0xC0,0x88,0x49,0x00,0x51,0x5A + ,0x40,0x18,0x22,0x49,0x09,0x88,0x41,0x18,0x01,0x20 + ,0x38,0x71,0x04,0x20,0x70,0x60,0x01,0x20,0xF8,0xF7 + ,0x82,0xFF,0x00,0x22,0xD2,0x43,0x00,0x92,0x01,0x22 + ,0x11,0x21,0x01,0xAB,0x1B,0x48,0xFB,0xF7,0x1F,0xF9 + ,0x01,0x98,0x41,0x08,0x01,0xD3,0x3C,0x71,0x1A,0xE0 + ,0x40,0x09,0x18,0xD3,0x78,0x79,0x17,0x49,0x01,0x30 + ,0x00,0x06,0x00,0x0E,0x78,0x71,0x09,0x7C,0x88,0x42 + ,0x01,0xDA,0x3D,0x71,0x0D,0xE0,0x3C,0x71,0x0B,0xE0 + ,0x78,0x79,0x10,0x49,0x01,0x30,0x00,0x06,0x00,0x0E + ,0x78,0x71,0x09,0x7C,0x88,0x42,0x01,0xDA,0x3D,0x71 + ,0x00,0xE0,0x3C,0x71,0x97,0xE7,0x44,0x09,0x00,0x02 + ,0x04,0x08,0x00,0x02,0x80,0x00,0x00,0x02,0x5C,0x00 + ,0x00,0x02,0x8E,0x00,0x00,0x02,0x08,0x08,0x00,0x02 + ,0x04,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0xB0,0x01 + ,0x00,0x02,0xAE,0x01,0x00,0x02,0x38,0x07,0x00,0x02 + ,0xC0,0x00,0x00,0x02,0x80,0xB5,0xC0,0x20,0xFB,0xF7 + ,0x44,0xF9,0x07,0x1C,0x12,0x48,0x01,0x68,0x01,0x31 + ,0x01,0x60,0x11,0x48,0xFB,0xF7,0x64,0xFD,0x00,0x29 + ,0x17,0xD1,0x0F,0x48,0x10,0x4A,0x03,0x78,0x10,0x49 + ,0x00,0x2B,0x06,0xD1,0x09,0x68,0xD3,0x69,0x19,0x43 + ,0xD1,0x61,0x01,0x21,0x01,0x70,0x0A,0xE0,0x0C,0x4B + ,0x9B,0x79,0x05,0x2B,0x06,0xD0,0x09,0x68,0xD3,0x69 + ,0xC9,0x43,0x19,0x40,0xD1,0x61,0x00,0x21,0x01,0x70 + ,0x38,0x1C,0xFB,0xF7,0x1F,0xF9,0x80,0xBD,0xD4,0x02 + ,0x00,0x02,0x20,0x4E,0x00,0x00,0x3A,0x01,0x00,0x02 + ,0x40,0x00,0x00,0x04,0xA4,0x02,0x00,0x02,0x94,0x09 + ,0x00,0x02,0x90,0xB5,0xC0,0x20,0xFB,0xF7,0x0E,0xF9 + ,0x07,0x1C,0x0F,0x48,0x81,0x7A,0x00,0x29,0x15,0xD1 + ,0x01,0x7B,0x01,0x29,0x12,0xD1,0xC1,0x7A,0x00,0x29 + ,0x0F,0xD1,0x00,0x24,0x0A,0x49,0x50,0x30,0x0C,0x70 + ,0x44,0x70,0x00,0xF0,0x1E,0xFB,0x08,0x48,0x01,0x21 + ,0x84,0x61,0x07,0x20,0xFD,0xF7,0xDC,0xFC,0x06,0x49 + ,0x01,0x20,0x08,0x70,0x38,0x1C,0xFB,0xF7,0xF0,0xF8 + ,0x90,0xBD,0x00,0x00,0x44,0x09,0x00,0x02,0x3C,0x01 + ,0x00,0x02,0x80,0x00,0x00,0x04,0xB3,0x02,0x00,0x02 + ,0x90,0xB5,0x14,0x4C,0x14,0x4F,0x61,0x79,0x03,0x29 + ,0x0C,0xD1,0x01,0x23,0x1B,0x03,0x98,0x42,0x08,0xD1 + ,0x19,0x21,0xC9,0x02,0x02,0x20,0xF8,0xF7,0xCF,0xFE + ,0xB8,0x78,0x08,0x23,0x98,0x43,0xB8,0x70,0xB8,0x78 + ,0x01,0x28,0x0C,0xD1,0x00,0xF0,0xAA,0xFA,0x60,0x79 + ,0x02,0x28,0x08,0xD1,0xB8,0x78,0x08,0x23,0x18,0x43 + ,0xB8,0x70,0xB8,0x78,0x40,0x08,0x40,0x00,0xB8,0x70 + ,0x90,0xBD,0xB8,0x78,0x40,0x08,0x40,0x00,0xB8,0x70 + ,0x90,0xBD,0x00,0x00,0xB0,0x00,0x00,0x02,0xB4,0x09 + ,0x00,0x02,0x80,0xB5,0x18,0x48,0x81,0x7A,0x00,0x29 + ,0x1C,0xD1,0x01,0x7B,0x01,0x29,0x19,0xD1,0xC0,0x7A + ,0x00,0x28,0x16,0xD1,0x14,0x4F,0xF8,0x1D,0x29,0x30 + ,0x40,0x79,0x03,0x28,0x14,0xD1,0xF8,0xF7,0x79,0xFE + ,0x39,0x88,0x11,0x4B,0x10,0x4F,0x89,0x02,0x08,0x1A + ,0x98,0x42,0x08,0xD9,0xC1,0x1A,0x06,0x20,0xF8,0xF7 + ,0x92,0xFE,0x00,0xF0,0xBA,0xFA,0x01,0x20,0xB8,0x70 + ,0x80,0xBD,0x00,0x20,0xB8,0x70,0x80,0xBD,0x01,0x20 + ,0x80,0x06,0x08,0x49,0x40,0x6A,0x06,0x4B,0x49,0x68 + ,0xC0,0x18,0x88,0x42,0xF2,0xD2,0x00,0xF0,0xA9,0xFA + ,0x80,0xBD,0x44,0x09,0x00,0x02,0x80,0x00,0x00,0x02 + ,0xB4,0x09,0x00,0x02,0xB8,0x0B,0x00,0x00,0x80,0x00 + ,0x00,0x04,0xF0,0xB5,0xC0,0x20,0xFB,0xF7,0x78,0xF8 + ,0x05,0x1C,0x00,0x26,0x34,0x48,0x07,0x24,0x64,0x06 + ,0x06,0x70,0xE0,0x69,0x10,0x23,0x98,0x43,0xE0,0x61 + ,0x31,0x48,0xC1,0x69,0x03,0x0C,0x19,0x43,0xC1,0x61 + ,0xC1,0x69,0x1B,0x23,0x99,0x43,0xC1,0x61,0xC1,0x69 + ,0x73,0x1F,0x19,0x40,0xC1,0x61,0xC1,0x69,0x83,0x01 + ,0x19,0x43,0xC1,0x61,0x2A,0x49,0xC2,0x69,0x09,0x68 + ,0xC9,0x43,0x11,0x40,0xC1,0x61,0xA1,0x69,0x01,0x23 + ,0x19,0x43,0xA1,0x61,0x0F,0x22,0x12,0x06,0x25,0x4B + ,0x11,0x89,0xD9,0x69,0x01,0x05,0x00,0x68,0xCF,0x68 + ,0x10,0x88,0xC9,0x6B,0x04,0x27,0x21,0x48,0x23,0x49 + ,0x06,0x70,0x21,0x48,0x9E,0x61,0x07,0x70,0x01,0x20 + ,0x08,0x70,0x20,0x48,0x06,0x70,0x20,0x48,0x06,0x70 + ,0x20,0x48,0xC6,0x74,0x20,0x48,0x06,0x70,0xFA,0xF7 + ,0xA0,0xF9,0x1B,0x48,0x00,0x78,0x00,0x28,0x03,0xD1 + ,0xA0,0x69,0xFD,0x23,0x18,0x40,0xA0,0x61,0xFA,0xF7 + ,0x0C,0xFB,0xFA,0xF7,0x76,0xFB,0x0A,0x20,0xF7,0xF7 + ,0x71,0xF8,0xFA,0xF7,0x69,0xFB,0x15,0x48,0x01,0x21 + ,0xC2,0x1D,0x49,0x32,0x07,0x75,0x91,0x71,0x56,0x70 + ,0x13,0x4B,0x02,0x22,0x1A,0x70,0x13,0x4B,0x70,0x30 + ,0x19,0x70,0x12,0x4B,0x59,0x71,0x86,0x70,0x12,0x48 + ,0x02,0x70,0xF7,0xF7,0x63,0xF8,0x28,0x1C,0xFB,0xF7 + ,0x0E,0xF8,0xF0,0xBD,0x00,0x00,0xDE,0x01,0x00,0x02 + ,0x40,0x00,0x00,0x04,0xB4,0x02,0x00,0x02,0x80,0x00 + ,0x00,0x04,0x3C,0x01,0x00,0x02,0x53,0x02,0x00,0x02 + ,0x5E,0x02,0x00,0x02,0x36,0x01,0x00,0x02,0x37,0x01 + ,0x00,0x02,0x44,0x09,0x00,0x02,0x51,0x02,0x00,0x02 + ,0xB2,0x02,0x00,0x02,0xB3,0x02,0x00,0x02,0xB0,0x00 + ,0x00,0x02,0x3B,0x01,0x00,0x02,0x90,0xB5,0x22,0x49 + ,0x00,0x27,0xC8,0x1D,0x49,0x30,0x82,0x79,0x01,0x2A + ,0x00,0xD0,0x47,0x71,0xCA,0x1D,0x69,0x32,0x93,0x79 + ,0x1D,0x49,0x00,0x2B,0x03,0xD0,0x97,0x71,0x01,0x20 + ,0x88,0x73,0x90,0xBD,0x52,0x78,0x00,0x2A,0x02,0xD0 + ,0xFD,0xF7,0xCC,0xFB,0x90,0xBD,0x02,0x78,0x00,0x2A + ,0x03,0xD0,0x47,0x71,0xFD,0xF7,0x7D,0xFA,0x90,0xBD + ,0x42,0x79,0x00,0x2A,0x02,0xD0,0xFD,0xF7,0xAD,0xFA + ,0x90,0xBD,0x82,0x78,0x00,0x2A,0x02,0xD0,0xFD,0xF7 + ,0x91,0xFA,0x90,0xBD,0xC9,0x7B,0x00,0x29,0x02,0xD0 + ,0xFD,0xF7,0x97,0xFA,0x90,0xBD,0x80,0x79,0x05,0x28 + ,0x0D,0xD1,0x0A,0x4C,0x20,0x68,0x01,0x7B,0xC9,0x09 + ,0x02,0xD3,0xF9,0xF7,0x1A,0xFA,0x90,0xBD,0x01,0x7B + ,0x10,0x29,0x02,0xD1,0xF9,0xF7,0x2C,0xFB,0x20,0x60 + ,0x38,0x1C,0x90,0xBD,0x00,0x00,0x44,0x09,0x00,0x02 + ,0x54,0x09,0x00,0x02,0xC4,0x01,0x00,0x02,0xB0,0xB5 + ,0x0C,0x1C,0x07,0x1C,0x01,0x28,0x01,0xD3,0x0E,0x2F + ,0x01,0xD9,0x00,0x20,0xB0,0xBD,0x1B,0x4D,0xE8,0x69 + ,0x2B,0x0C,0x18,0x43,0xE8,0x61,0x19,0x48,0xE9,0x69 + ,0x00,0x68,0x08,0x43,0xE8,0x61,0x18,0x48,0xE9,0x69 + ,0x00,0x68,0x08,0x43,0xE8,0x61,0xE8,0x69,0x04,0x23 + ,0x18,0x43,0xE8,0x61,0x14,0x48,0xF6,0xF7,0xCD,0xFF + ,0x00,0xF0,0xBF,0xF8,0x01,0x2C,0x01,0xD1,0x00,0xF0 + ,0xF1,0xF9,0x00,0xF0,0x81,0xF8,0x10,0x48,0x00,0x78 + ,0x01,0x28,0x0A,0xD1,0x0E,0x2F,0x04,0xD1,0xE8,0x69 + ,0x40,0x23,0x98,0x43,0xE8,0x61,0x03,0xE0,0xE8,0x69 + ,0x40,0x23,0x18,0x43,0xE8,0x61,0x38,0x1C,0x00,0xF0 + ,0x11,0xF8,0xE8,0x69,0x01,0x23,0x9B,0x02,0x98,0x43 + ,0xE8,0x61,0x01,0x20,0xB0,0xBD,0x40,0x00,0x00,0x04 + ,0xB4,0x02,0x00,0x02,0xB8,0x02,0x00,0x02,0xDC,0x05 + ,0x00,0x00,0xB1,0x02,0x00,0x02,0x90,0xB5,0x07,0x1C + ,0x07,0x20,0x40,0x06,0x81,0x69,0x04,0x23,0x19,0x43 + ,0x81,0x61,0xFA,0xF7,0x2E,0xFA,0x0A,0x20,0xF6,0xF7 + ,0x95,0xFF,0x17,0x4C,0x02,0x20,0x61,0x68,0x00,0xF0 + ,0x30,0xF8,0x00,0x20,0x21,0x68,0x00,0xF0,0x2C,0xF8 + ,0x13,0x48,0xBF,0x00,0x38,0x18,0x40,0x38,0xC1,0x6B + ,0x01,0x20,0x00,0xF0,0x24,0xF8,0x05,0x20,0x21,0x69 + ,0x00,0xF0,0x20,0xF8,0x08,0x20,0xA1,0x68,0x00,0xF0 + ,0x1C,0xF8,0x07,0x20,0xE1,0x68,0x00,0xF0,0x18,0xF8 + ,0x0A,0x48,0x38,0x18,0x40,0x38,0xC1,0x6B,0x04,0x20 + ,0x00,0xF0,0x11,0xF8,0xFF,0x20,0xF5,0x30,0xF6,0xF7 + ,0x6D,0xFF,0xFA,0xF7,0x65,0xFA,0x0A,0x20,0xF6,0xF7 + ,0x68,0xFF,0x90,0xBD,0x00,0x00,0xD8,0x02,0x00,0x02 + ,0xEC,0x02,0x00,0x02,0x24,0x03,0x00,0x02,0x90,0xB4 + ,0x0B,0x4A,0x13,0x68,0xDF,0x43,0x0A,0x4B,0xDC,0x69 + ,0x27,0x40,0xDF,0x61,0x07,0x05,0x89,0x00,0x39,0x43 + ,0x80,0x08,0x08,0x43,0x18,0x62,0x18,0x1C,0x01,0x6A + ,0xC9,0x0D,0xFC,0xD3,0x11,0x68,0xC2,0x69,0x11,0x43 + ,0xC1,0x61,0x90,0xBC,0xF7,0x46,0xB8,0x02,0x00,0x02 + ,0x40,0x00,0x00,0x04,0x80,0xB5,0x19,0x4F,0x00,0x20 + ,0x39,0x78,0xF6,0xF7,0xE0,0xFF,0x79,0x78,0x01,0x20 + ,0xF6,0xF7,0xDC,0xFF,0xB9,0x78,0x02,0x20,0xF6,0xF7 + ,0xD8,0xFF,0xF9,0x78,0x03,0x20,0xF6,0xF7,0xD4,0xFF + ,0x79,0x7C,0x11,0x20,0xF6,0xF7,0xD0,0xFF,0x39,0x7D + ,0x14,0x20,0xF6,0xF7,0xCC,0xFF,0x79,0x7D,0x15,0x20 + ,0xF6,0xF7,0xC8,0xFF,0x39,0x7F,0x1C,0x20,0xF6,0xF7 + ,0xC4,0xFF,0xB9,0x7C,0x12,0x20,0xF6,0xF7,0xC0,0xFF + ,0xF9,0x7C,0x13,0x20,0xF6,0xF7,0xBC,0xFF,0x05,0x48 + ,0x00,0x78,0x01,0x28,0x03,0xD1,0x79,0x7F,0x1D,0x20 + ,0xF6,0xF7,0xB4,0xFF,0x80,0xBD,0x00,0x00,0xCC,0x07 + ,0x00,0x02,0xB0,0x02,0x00,0x02,0x80,0xB5,0x07,0x27 + ,0x7F,0x06,0xB8,0x69,0x40,0x08,0x40,0x00,0xB8,0x61 + ,0xB8,0x69,0x01,0x23,0x18,0x43,0xB8,0x61,0x05,0x20 + ,0xF6,0xF7,0xFE,0xFE,0xB8,0x69,0x40,0x08,0x40,0x00 + ,0xB8,0x61,0x05,0x20,0xF6,0xF7,0xF7,0xFE,0x80,0xBD + ,0xF0,0xB5,0x38,0x4E,0x07,0x1C,0xF0,0x7A,0x03,0x28 + ,0xFC,0xD0,0xC0,0x20,0xFA,0xF7,0xA3,0xFE,0x35,0x4D + ,0x04,0x1C,0xE8,0x69,0xAB,0x01,0x18,0x43,0xE8,0x61 + ,0x98,0x03,0xC1,0x68,0xC0,0x6B,0x28,0x68,0x0F,0x20 + ,0x00,0x06,0x01,0x88,0x00,0x89,0x2F,0x48,0xC0,0x69 + ,0x2F,0x48,0xC1,0x19,0xC8,0x1F,0x09,0x38,0xC2,0x7B + ,0x2D,0x48,0xFF,0x2A,0x00,0xD0,0x02,0x75,0x4A,0x7B + ,0xFF,0x2A,0x00,0xD0,0x42,0x75,0x40,0x31,0x89,0x78 + ,0xFF,0x29,0x02,0xD0,0x8A,0x07,0x00,0xD1,0x41,0x74 + ,0x26,0x48,0x01,0x7D,0x14,0x20,0xF6,0xF7,0x66,0xFF + ,0x23,0x48,0x41,0x7D,0x15,0x20,0xF6,0xF7,0x61,0xFF + ,0x22,0x48,0x00,0x78,0x01,0x28,0x0A,0xD1,0x0E,0x2F + ,0x04,0xD1,0xE8,0x69,0x40,0x23,0x98,0x43,0xE8,0x61 + ,0x03,0xE0,0xE8,0x69,0x40,0x23,0x18,0x43,0xE8,0x61 + ,0x1B,0x48,0x07,0x75,0x00,0x7D,0xFF,0xF7,0x09,0xFF + ,0x01,0x20,0xFD,0xF7,0x60,0xFA,0xE8,0x69,0x18,0x4B + ,0x18,0x40,0xE8,0x61,0x06,0x20,0x70,0x72,0xFA,0x21 + ,0x07,0x20,0xF8,0xF7,0x4C,0xFC,0x14,0x49,0x08,0x20 + ,0xF8,0xF7,0x48,0xFC,0x20,0x1C,0xFA,0xF7,0x4D,0xFE + ,0x70,0x7C,0x01,0x28,0x05,0xD1,0x00,0x22,0x10,0x21 + ,0x0F,0x48,0xFA,0xF7,0xE9,0xFC,0xF0,0xBD,0x70,0x7C + ,0x02,0x28,0xFB,0xD1,0x00,0x22,0x10,0x21,0x0C,0x48 + ,0xFA,0xF7,0xE0,0xFC,0xF0,0xBD,0x00,0x00,0x44,0x09 + ,0x00,0x02,0x40,0x00,0x00,0x04,0x80,0x00,0x00,0x04 + ,0x58,0x0A,0x00,0x02,0xCC,0x07,0x00,0x02,0xB1,0x02 + ,0x00,0x02,0x00,0x00,0x00,0x02,0xFF,0xEF,0x00,0x00 + ,0x88,0x13,0x00,0x00,0xD8,0x06,0x00,0x02,0xF8,0x06 + ,0x00,0x02,0xB0,0xB5,0x07,0x21,0x49,0x06,0xCA,0x69 + ,0x52,0x09,0x03,0xD3,0xCA,0x69,0x10,0x23,0x9A,0x43 + ,0xCA,0x61,0x18,0x4C,0x01,0x28,0x0C,0xD1,0x18,0x4D + ,0x6F,0x68,0xF6,0xF7,0x71,0xFE,0x39,0x1A,0x49,0x01 + ,0x09,0x18,0x69,0x60,0x61,0x6B,0x09,0x1A,0x49,0x01 + ,0x08,0x18,0x60,0x63,0x12,0x48,0x00,0x21,0x00,0x7D + ,0xFF,0xF7,0x63,0xFE,0x11,0x4F,0x11,0x4B,0xF9,0x1D + ,0x69,0x31,0x08,0x73,0x01,0x20,0x80,0x06,0xC0,0x68 + ,0xE0,0x69,0x18,0x40,0xE0,0x61,0x01,0x20,0xFD,0xF7 + ,0xF9,0xF9,0x01,0x20,0x38,0x72,0x06,0x20,0x78,0x72 + ,0x07,0x20,0xFF,0x21,0x2D,0x31,0xF8,0xF7,0xE6,0xFB + ,0x4B,0x21,0xC9,0x00,0x08,0x20,0xF8,0xF7,0xE1,0xFB + ,0xB0,0xBD,0x40,0x00,0x00,0x04,0x80,0x00,0x00,0x04 + ,0x00,0x00,0x00,0x02,0x44,0x09,0x00,0x02,0xFF,0xEF + ,0x00,0x00,0xF0,0xB5,0x24,0x4F,0xF8,0x69,0x3B,0x0C + ,0x18,0x43,0xF8,0x61,0xF8,0x69,0x1B,0x23,0x98,0x43 + ,0xF8,0x61,0xF8,0x69,0x04,0x23,0x98,0x43,0xF8,0x61 + ,0xF8,0x69,0x9B,0x02,0x18,0x43,0xF8,0x61,0x1C,0x48 + ,0xF9,0x69,0x00,0x68,0xC0,0x43,0x08,0x40,0x07,0x24 + ,0x64,0x06,0xF8,0x61,0xA0,0x69,0x01,0x23,0x18,0x43 + ,0xA0,0x61,0x01,0x20,0xF8,0xF7,0xCF,0xFB,0x08,0x20 + ,0xF8,0xF7,0xCC,0xFB,0x07,0x20,0xF8,0xF7,0xC9,0xFB + ,0x01,0x20,0x80,0x06,0xC1,0x68,0xC0,0x6B,0x11,0x4D + ,0x38,0x68,0x0F,0x20,0x00,0x06,0x00,0x88,0x01,0x26 + ,0x6E,0x72,0xF8,0xF7,0x74,0xFB,0xE8,0x1D,0x69,0x30 + ,0x0C,0x4D,0x86,0x70,0x6E,0x68,0xF6,0xF7,0x01,0xFE + ,0x31,0x1A,0x49,0x09,0x09,0x18,0x69,0x60,0x79,0x6B + ,0x09,0x1A,0x49,0x09,0x08,0x18,0x78,0x63,0xE0,0x69 + ,0x10,0x23,0x18,0x43,0xE0,0x61,0xF0,0xBD,0x00,0x00 + ,0x40,0x00,0x00,0x04,0xB4,0x02,0x00,0x02,0x44,0x09 + ,0x00,0x02,0x80,0x00,0x00,0x04,0xF0,0xB4,0x2E,0x4D + ,0x01,0x27,0xE9,0x1D,0x19,0x31,0xCC,0x78,0x00,0x20 + ,0x2C,0x4A,0xFF,0x2C,0x13,0xD0,0x23,0x09,0x11,0xD3 + ,0x2B,0x7F,0x13,0x70,0x6E,0x7F,0x56,0x70,0xAE,0x7F + ,0x96,0x70,0xEB,0x7F,0xD3,0x70,0x0B,0x78,0x53,0x74 + ,0x4B,0x78,0x13,0x75,0x8B,0x78,0x53,0x75,0x14,0x77 + ,0x97,0x74,0xD0,0x74,0x0E,0xE0,0x10,0x70,0x60,0x23 + ,0x53,0x70,0x40,0x23,0x93,0x70,0xD3,0x70,0x50,0x74 + ,0xFF,0x23,0x13,0x75,0x57,0x23,0x53,0x75,0x48,0x23 + ,0x13,0x77,0x97,0x74,0xD0,0x74,0x1A,0x4B,0x9C,0x78 + ,0x1A,0x4B,0x04,0x2C,0x01,0xDA,0x58,0x73,0x05,0xE0 + ,0x09,0x79,0xFF,0x29,0x01,0xD0,0x59,0x73,0x00,0xE0 + ,0x58,0x73,0xD1,0x78,0x15,0x4B,0xC0,0x29,0x02,0xD1 + ,0x1F,0x76,0xD0,0x70,0x00,0xE0,0x18,0x76,0x12,0x48 + ,0x00,0x7D,0x40,0x19,0xC1,0x1F,0x09,0x39,0xC9,0x7B + ,0xFF,0x29,0x00,0xD0,0x11,0x75,0x41,0x7B,0xFF,0x29 + ,0x00,0xD0,0x51,0x75,0x40,0x30,0x80,0x78,0xFF,0x28 + ,0x02,0xD0,0x81,0x07,0x00,0xD1,0x50,0x74,0x50,0x78 + ,0x09,0x49,0x40,0x09,0x80,0x07,0x80,0x0F,0x08,0x70 + ,0xF0,0xBC,0xF7,0x46,0x58,0x0A,0x00,0x02,0xCC,0x07 + ,0x00,0x02,0x10,0x01,0x00,0x02,0xDC,0x07,0x00,0x02 + ,0x44,0x09,0x00,0x02,0x00,0x00,0x00,0x02,0x92,0x01 + ,0x00,0x02,0x02,0x79,0x41,0x79,0x12,0x02,0x11,0x43 + ,0xC2,0x78,0x12,0x04,0x11,0x43,0x82,0x78,0x12,0x06 + ,0x0A,0x43,0x01,0x21,0x89,0x06,0x8A,0x61,0x42,0x78 + ,0x00,0x78,0x00,0x02,0x10,0x43,0xC8,0x61,0xF7,0x46 + ,0x00,0xB5,0x0C,0x49,0x0D,0x48,0x41,0x61,0x23,0x21 + ,0x81,0x61,0x00,0x22,0x01,0x05,0x0A,0x61,0xC2,0x01 + ,0x42,0x60,0x05,0x22,0xC2,0x60,0x08,0x4A,0x82,0x62 + ,0xF2,0x22,0x82,0x60,0x32,0x22,0x4A,0x61,0xCA,0x68 + ,0xC9,0x6B,0x00,0x68,0x00,0x21,0x00,0x20,0x00,0xF0 + ,0x07,0xF8,0x00,0xBD,0x04,0x90,0x00,0x00,0x40,0x00 + ,0x00,0x04,0x81,0xFF,0x00,0x00,0x02,0x1C,0x01,0x20 + ,0x80,0x06,0x82,0x62,0x41,0x62,0xF7,0x46,0x80,0xB5 + ,0x1D,0x48,0x20,0x23,0x81,0x69,0x1D,0x4F,0x99,0x43 + ,0x81,0x61,0x1B,0x48,0x81,0x78,0x1C,0x48,0x00,0x29 + ,0x0F,0xD0,0x01,0x7D,0x04,0x29,0x0C,0xD0,0x01,0x21 + ,0xC1,0x77,0x03,0x21,0x41,0x77,0xF8,0xF7,0xA5,0xFA + ,0x39,0x88,0x89,0x02,0x09,0x1A,0x06,0x20,0xF8,0xF7 + ,0xC3,0xFA,0x80,0xBD,0xF9,0x1D,0x29,0x31,0x0A,0x79 + ,0x02,0x2A,0xF9,0xD1,0xC2,0x1D,0x49,0x32,0x92,0x79 + ,0x05,0x2A,0xF4,0xD1,0x49,0x79,0x01,0x29,0xF1,0xDD + ,0xC7,0x1D,0x69,0x37,0xB8,0x78,0x01,0x28,0x04,0xD1 + ,0x00,0x20,0xFF,0xF7,0x91,0xFE,0x00,0x20,0xB8,0x70 + ,0xB8,0x78,0x40,0x08,0x40,0x00,0xB8,0x70,0xB8,0x78 + ,0x08,0x23,0x98,0x43,0xB8,0x70,0x80,0xBD,0x80,0x00 + ,0x00,0x04,0x04,0x01,0x00,0x02,0x80,0x00,0x00,0x02 + ,0x44,0x09,0x00,0x02,0x80,0xB5,0xF8,0xF7,0x8F,0xFD + ,0x06,0x48,0x01,0x21,0x41,0x60,0x00,0x27,0x47,0x77 + ,0x01,0x20,0xF6,0xF7,0xF9,0xFC,0x03,0x48,0x07,0x83 + ,0x87,0x82,0x80,0xBD,0x00,0x00,0x44,0x09,0x00,0x02 + ,0x20,0x00,0x20,0x0F,0x80,0xB5,0x0F,0x48,0x40,0x23 + ,0x81,0x69,0x0E,0x4F,0x99,0x43,0x81,0x61,0xF8,0x69 + ,0x9B,0x01,0x18,0x43,0xF8,0x61,0x14,0x20,0xF6,0xF7 + ,0xCA,0xFC,0xF8,0x69,0x0A,0x4B,0x0A,0x49,0x18,0x40 + ,0xF8,0x61,0x01,0x20,0x08,0x72,0x4A,0x7A,0x06,0x2A + ,0x00,0xD0,0x48,0x72,0x08,0x73,0x00,0x20,0xC8,0x72 + ,0x05,0x49,0x08,0x70,0x80,0xBD,0x00,0x00,0x80,0x00 + ,0x00,0x04,0x40,0x00,0x00,0x04,0xFF,0xEF,0x00,0x00 + ,0x44,0x09,0x00,0x02,0xE0,0x01,0x00,0x02,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + }; diff --git a/ieee802_11.h b/ieee802_11.h new file mode 100644 index 0000000..c4121e7 --- /dev/null +++ b/ieee802_11.h @@ -0,0 +1,223 @@ +#ifndef _IEEE802_11_H +#define _IEEE802_11_H + +#define IEEE802_11_DATA_LEN 2304 +/* Actually, the standard seems to be inconsistent about what the + maximum frame size really is. Section 6.2.1.1.2 says 2304 octets, + but the figure in Section 7.1.2 says 2312 octects. */ +#define IEEE802_11_HLEN 30 +#define IEEE802_11_FRAME_LEN (IEEE802_11_DATA_LEN + IEEE802_11_HLEN) + +struct ieee802_11_hdr { + u16 frame_ctl; + u16 duration_id; + u8 addr1[ETH_ALEN]; + u8 addr2[ETH_ALEN]; + u8 addr3[ETH_ALEN]; + u16 seq_ctl; + u8 addr4[ETH_ALEN]; +} __attribute__ ((packed)); + +/* defines for information element coding: + 1 byte ID, 1 byte length of information field, n bytes information field + (see 7.3.2 in [1]) */ +#define IE_ID_SSID 0 /* length 0 - 32 */ +#define IE_ID_SUPPORTED_RATES 1 +#define IE_ID_DS_PARAM_SET 3 +#define IE_ID_CF_PARAM_SET 4 +#define IE_ID_TIM 5 +#define IE_ID_IBSS_PARAM_SET 6 +#define IE_ID_CHALLENGE_TEXT 16 + +#if defined(__LITTLE_ENDIAN) + +/* Frame control field constants */ +#define IEEE802_11_FCTL_VERS 0x0002 +#define IEEE802_11_FCTL_FTYPE 0x000c +#define IEEE802_11_FCTL_STYPE 0x00f0 +#define IEEE802_11_FCTL_TODS 0x0100 +#define IEEE802_11_FCTL_FROMDS 0x0200 +#define IEEE802_11_FCTL_MOREFRAGS 0x0400 +#define IEEE802_11_FCTL_RETRY 0x0800 +#define IEEE802_11_FCTL_PM 0x1000 +#define IEEE802_11_FCTL_MOREDATA 0x2000 +#define IEEE802_11_FCTL_WEP 0x4000 +#define IEEE802_11_FCTL_ORDER 0x8000 + +#define IEEE802_11_FTYPE_MGMT 0x0000 +#define IEEE802_11_FTYPE_CTL 0x0004 +#define IEEE802_11_FTYPE_DATA 0x0008 + +/* management */ +#define IEEE802_11_STYPE_ASSOC_REQ 0x0000 +#define IEEE802_11_STYPE_ASSOC_RESP 0x0010 +#define IEEE802_11_STYPE_REASSOC_REQ 0x0020 +#define IEEE802_11_STYPE_REASSOC_RESP 0x0030 +#define IEEE802_11_STYPE_PROBE_REQ 0x0040 +#define IEEE802_11_STYPE_PROBE_RESP 0x0050 +#define IEEE802_11_STYPE_BEACON 0x0080 +#define IEEE802_11_STYPE_ATIM 0x0090 +#define IEEE802_11_STYPE_DISASSOC 0x00A0 +#define IEEE802_11_STYPE_AUTH 0x00B0 +#define IEEE802_11_STYPE_DEAUTH 0x00C0 + +/* control */ +#define IEEE802_11_STYPE_PSPOLL 0x00A0 +#define IEEE802_11_STYPE_RTS 0x00B0 +#define IEEE802_11_STYPE_CTS 0x00C0 +#define IEEE802_11_STYPE_ACK 0x00D0 +#define IEEE802_11_STYPE_CFEND 0x00E0 +#define IEEE802_11_STYPE_CFENDACK 0x00F0 + +/* data */ +#define IEEE802_11_STYPE_DATA 0x0000 +#define IEEE802_11_STYPE_DATA_CFACK 0x0010 +#define IEEE802_11_STYPE_DATA_CFPOLL 0x0020 +#define IEEE802_11_STYPE_DATA_CFACKPOLL 0x0030 +#define IEEE802_11_STYPE_NULLFUNC 0x0040 +#define IEEE802_11_STYPE_CFACK 0x0050 +#define IEEE802_11_STYPE_CFPOLL 0x0060 +#define IEEE802_11_STYPE_CFACKPOLL 0x0070 + +#define IEEE802_11_SCTL_FRAG 0x000F +#define IEEE802_11_SCTL_SEQ 0xFFF0 + +/* capability field in beacon, (re)assocReq */ +#define IEEE802_11_CAPA_ESS 0x0001 +#define IEEE802_11_CAPA_IBSS 0x0002 +#define IEEE802_11_CAPA_CF_POLLABLE 0x0004 +#define IEEE802_11_CAPA_POLL_REQ 0x0008 +#define IEEE802_11_CAPA_PRIVACY 0x0010 +#define IEEE802_11_CAPA_SHORT_PREAMBLE 0x0020 + +/* auth frame: algorithm type */ +#define IEEE802_11_AUTH_ALG_OPEN_SYSTEM 0x0000 +#define IEEE802_11_AUTH_ALG_SHARED_SECRET 0x0001 + +/* disassoc/deauth frame: reason codes (see 802.11, ch. 7.3.1.7, table 18) */ +#define IEEE802_11_REASON_UNSPECIFIED 0x0001 +#define IEEE802_11_REASON_PREV_AUTH_INVALID 0x0002 +#define IEEE802_11_REASON_DEAUTH_LEAVING 0x0003 +#define IEEE802_11_REASON_DISASS_INACTIVITY 0x0004 +#define IEEE802_11_REASON_DISASS_TOO_MANY_STA 0x0005 +#define IEEE802_11_REASON_CL2_FROM_NONAUTH 0x0006 +#define IEEE802_11_REASON_CL3_FROM_NONASSOC 0x0007 +#define IEEE802_11_REASON_DISASS_LEAVING 0x0008 +#define IEEE802_11_REASON_NOT_AUTH 0x0009 + +/* status in some response frames (802.11, ch. 7.3.1.9, table 19) */ +#define IEEE802_11_STATUS_SUCCESS 0x0000 +#define IEEE802_11_STATUS_UNSPECIFIED 0x0001 +#define IEEE802_11_STATUS_UNSUPP_CAPABILITIES 0x000a +#define IEEE802_11_STATUS_NO_PREV_ASSOC 0x000b +#define IEEE802_11_STATUS_ASSOC_FAILED 0x000c +#define IEEE802_11_STATUS_UNSUPP_AUTH_ALG 0x000d +#define IEEE802_11_STATUS_AUTH_INV_TRANS_SEQ 0x000e +#define IEEE802_11_STATUS_AUTH_CHALLENGE_FAIL 0x000f +#define IEEE802_11_STATUS_AUTH_TIMEOUT 0x0010 +#define IEEE802_11_STATUS_ASSOC_TOO_MANY_STA 0x0011 +#define IEEE802_11_STATUS_BASIC_RATE_SET 0x0012 + +#else /* defined(__LITTLE_ENDIAN) */ + +/* Frame control field constants */ +#define IEEE802_11_FCTL_VERS 0x0200 +#define IEEE802_11_FCTL_FTYPE 0x0c00 +#define IEEE802_11_FCTL_STYPE 0xf000 +#define IEEE802_11_FCTL_TODS 0x0001 +#define IEEE802_11_FCTL_FROMDS 0x0002 +#define IEEE802_11_FCTL_MOREFRAGS 0x0004 +#define IEEE802_11_FCTL_RETRY 0x0008 +#define IEEE802_11_FCTL_PM 0x0010 +#define IEEE802_11_FCTL_MOREDATA 0x0020 +#define IEEE802_11_FCTL_WEP 0x0040 +#define IEEE802_11_FCTL_ORDER 0x0080 + +#define IEEE802_11_FTYPE_MGMT 0x0000 +#define IEEE802_11_FTYPE_CTL 0x0400 +#define IEEE802_11_FTYPE_DATA 0x0800 + +/* management */ +#define IEEE802_11_STYPE_ASSOC_REQ 0x0000 +#define IEEE802_11_STYPE_ASSOC_RESP 0x1000 +#define IEEE802_11_STYPE_REASSOC_REQ 0x2000 +#define IEEE802_11_STYPE_REASSOC_RESP 0x3000 +#define IEEE802_11_STYPE_PROBE_REQ 0x4000 +#define IEEE802_11_STYPE_PROBE_RESP 0x5000 +#define IEEE802_11_STYPE_BEACON 0x8000 +#define IEEE802_11_STYPE_ATIM 0x9000 +#define IEEE802_11_STYPE_DISASSOC 0xA000 +#define IEEE802_11_STYPE_AUTH 0xB000 +#define IEEE802_11_STYPE_DEAUTH 0xC000 + +/* control */ +#define IEEE802_11_STYPE_PSPOLL 0xA000 +#define IEEE802_11_STYPE_RTS 0xB000 +#define IEEE802_11_STYPE_CTS 0xC000 +#define IEEE802_11_STYPE_ACK 0xD000 +#define IEEE802_11_STYPE_CFEND 0xE000 +#define IEEE802_11_STYPE_CFENDACK 0xF000 + +/* data */ +#define IEEE802_11_STYPE_DATA 0x0000 +#define IEEE802_11_STYPE_DATA_CFACK 0x1000 +#define IEEE802_11_STYPE_DATA_CFPOLL 0x2000 +#define IEEE802_11_STYPE_DATA_CFACKPOLL 0x3000 +#define IEEE802_11_STYPE_NULLFUNC 0x4000 +#define IEEE802_11_STYPE_CFACK 0x5000 +#define IEEE802_11_STYPE_CFPOLL 0x6000 +#define IEEE802_11_STYPE_CFACKPOLL 0x7000 + +#define IEEE802_11_SCTL_FRAG 0x0F00 +#define IEEE802_11_SCTL_SEQ 0xF0FF + +/* capability field in beacon, (re)assocReq */ +#define IEEE802_11_CAPA_ESS 0x0100 +#define IEEE802_11_CAPA_IBSS 0x0200 +#define IEEE802_11_CAPA_CF_POLLABLE 0x0400 +#define IEEE802_11_CAPA_POLL_REQ 0x0800 +#define IEEE802_11_CAPA_PRIVACY 0x1000 +#define IEEE802_11_CAPA_SHORT_PREAMBLE 0x2000 + +/* auth frame: algorithm type */ +#define IEEE802_11_AUTH_ALG_OPEN_SYSTEM 0x0000 +#define IEEE802_11_AUTH_ALG_SHARED_SECRET 0x0100 + +/* disassoc/deauth frame: reason codes (see 802.11, ch. 7.3.1.7, table 18) */ +#define IEEE802_11_REASON_UNSPECIFIED 0x0100 +#define IEEE802_11_REASON_PREV_AUTH_INVALID 0x0200 +#define IEEE802_11_REASON_DEAUTH_LEAVING 0x0300 +#define IEEE802_11_REASON_DISASS_INACTIVITY 0x0400 +#define IEEE802_11_REASON_DISASS_TOO_MANY_STA 0x0500 +#define IEEE802_11_REASON_CL2_FROM_NONAUTH 0x0600 +#define IEEE802_11_REASON_CL3_FROM_NONASSOC 0x0700 +#define IEEE802_11_REASON_DISASS_LEAVING 0x0800 +#define IEEE802_11_REASON_NOT_AUTH 0x0900 + +/* status in some response frames (802.11, ch. 7.3.1.9, table 19) */ +#define IEEE802_11_STATUS_SUCCESS 0x0000 +#define IEEE802_11_STATUS_UNSPECIFIED 0x0100 +#define IEEE802_11_STATUS_UNSUPP_CAPABILITIES 0x0a00 +#define IEEE802_11_STATUS_NO_PREV_ASSOC 0x0b00 +#define IEEE802_11_STATUS_ASSOC_FAILED 0x0c00 +#define IEEE802_11_STATUS_UNSUPP_AUTH_ALG 0x0d00 +#define IEEE802_11_STATUS_AUTH_INV_TRANS_SEQ 0x0e00 +#define IEEE802_11_STATUS_AUTH_CHALLENGE_FAIL 0x0f00 +#define IEEE802_11_STATUS_AUTH_TIMEOUT 0x1000 +#define IEEE802_11_STATUS_ASSOC_TOO_MANY_STA 0x1100 +#define IEEE802_11_STATUS_BASIC_RATE_SET 0x1200 + +#endif + +#endif /* _IEEE802_11_H */ + + + + + + + + + + + diff --git a/internalr.h b/internalr.h new file mode 100644 index 0000000..fb305ec --- /dev/null +++ b/internalr.h @@ -0,0 +1,2170 @@ +/**************************************************************************/ +/* */ +/* Copyright (c) 1999-2000 by Atmel Corporation */ +/* */ +/* This software is copyrighted by and is the sole property of Atmel */ +/* Corporation. All rights, title, ownership, or other interests */ +/* in the software remain the property of Atmel Corporation. This */ +/* software may only be used in accordance with the corresponding */ +/* license agreement. Any un-authorized use, duplication, transmission, */ +/* distribution, or disclosure of this software is expressly forbidden. */ +/* */ +/* This Copyright notice may not be removed or modified without prior */ +/* written consent of Atmel Corporation. */ +/* */ +/* Atmel Corporation, Inc. reserves the right to modify this software */ +/* without notice. */ +/* */ +/* Atmel Corporation. */ +/* 2325 Orchard Parkway literature@atmel.com */ +/* San Jose, CA 95131 http://www.atmel.com */ +/* */ +/**************************************************************************/ +/**************************************************************************/ +/* */ +/* Automatically generated FW file for AT76C502A */ +/* */ +/**************************************************************************/ + + +UCHAR InternalRFMD[] = {0x7C,0xF1,0x9F,0xE5,0x7C,0xF1,0x9F,0xE5,0x7C,0xF1 + ,0x9F,0xE5,0x7C,0xF1,0x9F,0xE5,0x7C,0xF1,0x9F,0xE5 + ,0x7C,0xF1,0x9F,0xE5,0x7C,0xF1,0x9F,0xE5,0x7C,0xF1 + ,0x9F,0xE5,0xD3,0x00,0xA0,0xE3,0x00,0xF0,0x21,0xE1 + ,0x0E,0x04,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x81,0x11 + ,0xA0,0xE1,0x00,0x10,0x81,0xE3,0x00,0x10,0x80,0xE5 + ,0x0F,0x04,0xA0,0xE3,0x00,0x10,0xA0,0xE3,0x04,0x10 + ,0x80,0xE5,0x0C,0x10,0x80,0xE5,0x00,0x10,0x90,0xE5 + ,0x08,0x10,0x90,0xE5,0x48,0xD1,0x9F,0xE5,0x46,0x13 + ,0x00,0xEB,0x44,0x11,0x9F,0xE5,0xD0,0x20,0x9F,0xE5 + ,0xD1,0x00,0xA0,0xE3,0x00,0xF0,0x21,0xE1,0x02,0x10 + ,0x81,0xE0,0x03,0x10,0xC1,0xE3,0x04,0x10,0x41,0xE2 + ,0x01,0xD0,0xA0,0xE1,0x00,0xA0,0xA0,0xE3,0x00,0xB0 + ,0xA0,0xE3,0xB0,0x20,0x9F,0xE5,0xD2,0x00,0xA0,0xE3 + ,0x00,0xF0,0x21,0xE1,0x02,0x10,0x81,0xE0,0x03,0x10 + ,0xC1,0xE3,0x04,0x10,0x41,0xE2,0x01,0xD0,0xA0,0xE1 + ,0xD3,0x00,0xA0,0xE3,0x00,0xF0,0x21,0xE1,0x84,0x30 + ,0x9F,0xE5,0x00,0x10,0x83,0xE5,0x01,0xD0,0xA0,0xE1 + ,0x74,0x00,0x9F,0xE5,0x01,0x00,0x80,0xE3,0x0F,0xE0 + ,0xA0,0xE1,0x10,0xFF,0x2F,0xE1,0x00,0xA0,0x00,0x47 + ,0x64,0x10,0x9F,0xE5,0x00,0x00,0x91,0xE5,0x04,0x00 + ,0x80,0xE2,0x6C,0x10,0x9F,0xE5,0x6C,0x30,0x9F,0xE5 + ,0x5C,0x20,0x9F,0xE5,0x00,0x00,0x81,0xE5,0x00,0x20 + ,0x83,0xE5,0x02,0x00,0x80,0xE0,0x5C,0x10,0x9F,0xE5 + ,0x00,0x20,0xA0,0xE3,0x00,0x20,0x81,0xE5,0x44,0x20 + ,0x9F,0xE5,0x00,0x00,0x82,0xE5,0x1E,0xFF,0x2F,0xE1 + ,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF + ,0xFF,0xEA,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF,0xFF,0xEA + ,0x65,0x0E,0x00,0xEA,0x02,0xF0,0x92,0xF8,0x22,0x48 + ,0x87,0x46,0x7E,0x0E,0x00,0xEA,0x01,0xF0,0x9E,0xFE + ,0x20,0x48,0x87,0x46,0xB5,0x01,0x00,0x00,0xB4,0x03 + ,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00 + ,0x00,0x01,0x00,0x00,0x38,0x04,0x00,0x02,0x58,0x04 + ,0x00,0x02,0x5C,0x04,0x00,0x02,0x60,0x04,0x00,0x02 + ,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF + ,0xFF,0xEA,0xFE,0xFF,0xFF,0xEA,0x00,0x00,0xA0,0xE3 + ,0x0E,0xF0,0xA0,0xE1,0xFE,0xFF,0xFF,0xEA,0xFE,0xFF + ,0xFF,0xEA,0x00,0x00,0xA0,0xE3,0x0E,0xF0,0xA0,0xE1 + ,0x00,0x00,0xA0,0xE3,0x0E,0xF0,0xA0,0xE1,0x20,0x00 + ,0x00,0x00,0x04,0x01,0x00,0x00,0x08,0x01,0x00,0x00 + ,0x0C,0x01,0x00,0x00,0x10,0x01,0x00,0x00,0x14,0x01 + ,0x00,0x00,0x18,0x01,0x00,0x00,0x24,0x01,0x00,0x00 + ,0x00,0x60,0x00,0x01,0xE0,0x59,0x00,0x01,0xA5,0x3B + ,0x00,0x00,0x95,0x3C,0x00,0x00,0x00,0xB5,0x03,0xF0 + ,0x4F,0xFC,0x00,0x20,0x00,0xBD,0x80,0xB5,0x86,0xB0 + ,0x07,0x1C,0x00,0x21,0x04,0x91,0xFF,0x21,0x01,0x22 + ,0x91,0x31,0x01,0x20,0x03,0x90,0x01,0x91,0x05,0x92 + ,0x02,0x92,0x17,0x4A,0x19,0xA1,0x17,0x48,0x01,0x23 + ,0x00,0x97,0x03,0xF0,0x25,0xFE,0x00,0x21,0x04,0x91 + ,0xFF,0x21,0x91,0x31,0x01,0x22,0x05,0x92,0xFB,0x1D + ,0xFF,0x33,0x03,0x22,0x03,0x20,0x8A,0x33,0x00,0x93 + ,0x03,0x90,0x02,0x92,0x01,0x91,0x13,0xA1,0x11,0x4A + ,0x11,0x48,0x02,0x23,0x03,0xF0,0x10,0xFE,0x13,0x48 + ,0x14,0xA1,0x03,0xF0,0x82,0xFE,0x16,0x48,0x17,0xA1 + ,0x03,0xF0,0x7E,0xFE,0x1A,0x48,0x1B,0xA1,0x03,0xF0 + ,0x7A,0xFE,0x1E,0x48,0x1F,0xA1,0x03,0xF0,0x76,0xFE + ,0x03,0xF0,0x5A,0xFA,0x06,0xB0,0x80,0xBD,0x05,0x13 + ,0x00,0x00,0xB8,0x05,0x00,0x02,0x54,0x78,0x20,0x74 + ,0x68,0x72,0x65,0x61,0x64,0x00,0x00,0x00,0x91,0x25 + ,0x00,0x00,0x48,0x06,0x00,0x02,0x4D,0x67,0x6D,0x20 + ,0x74,0x68,0x72,0x65,0x61,0x64,0x00,0x00,0xD8,0x06 + ,0x00,0x02,0x54,0x78,0x20,0x73,0x74,0x61,0x74,0x75 + ,0x73,0x20,0x66,0x6C,0x61,0x67,0x73,0x00,0xF8,0x06 + ,0x00,0x02,0x4D,0x67,0x6D,0x20,0x73,0x74,0x61,0x74 + ,0x75,0x73,0x20,0x66,0x6C,0x61,0x67,0x73,0x00,0x00 + ,0x00,0x00,0x18,0x07,0x00,0x02,0x54,0x58,0x20,0x47 + ,0x4F,0x20,0x73,0x74,0x61,0x74,0x75,0x73,0x20,0x66 + ,0x6C,0x61,0x67,0x73,0x00,0x00,0x38,0x07,0x00,0x02 + ,0x50,0x73,0x50,0x6F,0x6C,0x6C,0x20,0x73,0x74,0x61 + ,0x74,0x75,0x73,0x20,0x66,0x6C,0x61,0x67,0x73,0x00 + ,0xC3,0x00,0x18,0x18,0x80,0x00,0x80,0x08,0x01,0xD0 + ,0x01,0x38,0xFD,0xD1,0xF7,0x46,0x03,0x49,0x0F,0x20 + ,0x00,0x06,0x81,0x80,0x02,0x49,0x81,0x81,0xF7,0x46 + ,0x00,0x00,0xE8,0xE8,0x00,0x00,0x13,0x13,0x00,0x00 + ,0x01,0x20,0x80,0x06,0x40,0x6A,0xF7,0x46,0x01,0x1C + ,0x06,0x48,0x04,0xD0,0x41,0x68,0xC3,0x01,0x19,0x43 + ,0x41,0x60,0xF7,0x46,0x41,0x68,0x01,0x23,0x5B,0x03 + ,0x99,0x43,0x41,0x60,0xF7,0x46,0x40,0x00,0x00,0x04 + ,0x80,0xB5,0x13,0x49,0x15,0x4F,0x08,0x78,0x42,0x01 + ,0x12,0x48,0x42,0x70,0x12,0x4A,0x52,0x7A,0x00,0x2A + ,0x0B,0xD0,0x09,0x78,0x00,0x29,0x08,0xDD,0x41,0x78 + ,0x10,0x23,0x19,0x43,0x41,0x70,0x48,0x21,0x79,0x81 + ,0x18,0x21,0x39,0x81,0x03,0xE0,0x90,0x21,0x79,0x81 + ,0x30,0x21,0x39,0x81,0x41,0x78,0x01,0x20,0x00,0xF0 + ,0x5B,0xF8,0x78,0x89,0x39,0x89,0x40,0x18,0x06,0x49 + ,0x08,0x80,0x01,0xF0,0xA8,0xFC,0x80,0xBD,0x00,0x00 + ,0x93,0x01,0x00,0x02,0xCC,0x07,0x00,0x02,0x04,0x01 + ,0x00,0x02,0x00,0x00,0x00,0x02,0xAC,0x01,0x00,0x02 + ,0x01,0x1C,0x06,0x48,0x04,0xD0,0x41,0x7C,0x01,0x23 + ,0x19,0x43,0x41,0x74,0xF7,0x46,0x41,0x7C,0xFE,0x23 + ,0x19,0x40,0x41,0x74,0xF7,0x46,0x00,0x00,0xCC,0x07 + ,0x00,0x02,0xF0,0xB4,0x07,0x24,0x64,0x06,0xA2,0x69 + ,0x04,0x23,0x9A,0x43,0xA2,0x61,0xF3,0x22,0x12,0x05 + ,0x93,0x68,0x40,0x23,0xD3,0x60,0x17,0x69,0xBB,0x08 + ,0xFC,0xD3,0x13,0x69,0x5B,0x08,0xFC,0xD3,0x93,0x68 + ,0x80,0x23,0x03,0x43,0xD3,0x60,0x17,0x69,0xBB,0x08 + ,0xFC,0xD3,0x13,0x69,0x5B,0x08,0xFC,0xD3,0x17,0x1C + ,0x92,0x68,0x00,0x22,0x00,0x29,0x0D,0xD9,0x0A,0x4D + ,0x83,0x18,0xEB,0x5C,0xFB,0x60,0x3E,0x69,0xB3,0x08 + ,0xFC,0xD3,0x3B,0x69,0x5B,0x08,0xFC,0xD3,0x01,0x32 + ,0x8A,0x42,0xBB,0x68,0xF2,0xD3,0xA0,0x69,0x04,0x23 + ,0x18,0x43,0xA0,0x61,0xF0,0xBC,0xF7,0x46,0x00,0x00 + ,0xCC,0x07,0x00,0x02,0x90,0xB4,0x07,0x27,0x7F,0x06 + ,0xBA,0x69,0x04,0x23,0x9A,0x43,0xBA,0x61,0xF3,0x22 + ,0x12,0x05,0x93,0x68,0x40,0x23,0xD3,0x60,0x14,0x69 + ,0xA3,0x08,0xFC,0xD3,0x13,0x69,0x5B,0x08,0xFC,0xD3 + ,0x93,0x68,0xD0,0x60,0x10,0x69,0x80,0x08,0xFC,0xD3 + ,0x10,0x1C,0x02,0x69,0x52,0x08,0xFC,0xD3,0x82,0x68 + ,0xC1,0x60,0x01,0x69,0x89,0x08,0xFC,0xD3,0x01,0x69 + ,0x49,0x08,0xFC,0xD3,0x80,0x68,0x04,0x23,0xB8,0x69 + ,0x18,0x43,0xB8,0x61,0x90,0xBC,0xF7,0x46,0x80,0xB4 + ,0x07,0x22,0x52,0x06,0x91,0x69,0x04,0x23,0x99,0x43 + ,0x91,0x61,0xF3,0x21,0x09,0x05,0x8B,0x68,0x40,0x23 + ,0xCB,0x60,0x0F,0x69,0xBB,0x08,0xFC,0xD3,0x0B,0x69 + ,0x5B,0x08,0xFC,0xD3,0x8B,0x68,0xC8,0x60,0x08,0x69 + ,0x80,0x08,0xFC,0xD3,0x08,0x69,0x40,0x08,0xFC,0xD3 + ,0x97,0x69,0x04,0x23,0x3B,0x43,0x88,0x68,0x93,0x61 + ,0x97,0x69,0x04,0x23,0x9F,0x43,0x97,0x61,0x41,0x20 + ,0xC8,0x60,0x08,0x69,0x80,0x08,0xFC,0xD3,0x08,0x1C + ,0x01,0x69,0x49,0x08,0xFC,0xD3,0x81,0x68,0xFF,0x21 + ,0xC1,0x60,0x01,0x69,0x49,0x08,0xFC,0xD3,0x91,0x69 + ,0x04,0x23,0x19,0x43,0x80,0x68,0x91,0x61,0x80,0xBC + ,0xF7,0x46,0x80,0xB5,0x0B,0x4F,0xF8,0x69,0xBB,0x01 + ,0x18,0x43,0xF8,0x61,0x00,0x20,0xFF,0xF7,0x0A,0xFF + ,0x08,0x48,0xF9,0x69,0x00,0x68,0xC0,0x43,0x08,0x40 + ,0xF8,0x61,0x07,0x20,0x40,0x06,0x81,0x69,0x01,0x23 + ,0x19,0x43,0x81,0x61,0x03,0x49,0x01,0x20,0x08,0x70 + ,0x80,0xBD,0x40,0x00,0x00,0x04,0xB4,0x02,0x00,0x02 + ,0xB3,0x02,0x00,0x02,0xC1,0x0A,0x01,0xD3,0x00,0x20 + ,0xF7,0x46,0xFF,0x22,0x01,0x32,0x02,0x40,0x01,0x21 + ,0x00,0x2A,0x01,0xD0,0x08,0x1C,0xF7,0x46,0x80,0x0A + ,0x01,0xD3,0x08,0x1C,0xF7,0x46,0x02,0x20,0xF7,0x46 + ,0xF0,0xB5,0x0F,0x1C,0x19,0x49,0x04,0x1C,0x19,0x4E + ,0x1A,0x48,0x31,0x60,0x05,0x6C,0x00,0x2D,0x16,0xD0 + ,0x06,0x22,0x20,0x1C,0x31,0x68,0x04,0xF0,0x37,0xFA + ,0x00,0x28,0x08,0xD1,0x30,0x68,0xC1,0x88,0xB9,0x42 + ,0x01,0xD1,0x01,0x20,0xF0,0xBD,0xC7,0x80,0x00,0x20 + ,0xF0,0xBD,0x30,0x68,0x08,0x30,0x30,0x60,0x28,0x1C + ,0x01,0x3D,0x00,0x28,0xE8,0xD1,0x0C,0x48,0x01,0x6C + ,0x01,0x31,0x01,0x64,0x01,0x6C,0x07,0x29,0x03,0xD9 + ,0x06,0x49,0x31,0x60,0x08,0x21,0x01,0x64,0x06,0x22 + ,0x21,0x1C,0x30,0x68,0x04,0xF0,0x33,0xFA,0x30,0x68 + ,0xC7,0x80,0x00,0x20,0xF0,0xBD,0x00,0x00,0x74,0x07 + ,0x00,0x02,0x40,0x01,0x00,0x02,0x44,0x09,0x00,0x02 + ,0x05,0x49,0x0A,0x68,0x12,0x01,0x02,0x70,0x0A,0x68 + ,0x12,0x01,0x12,0x0A,0x42,0x70,0x08,0x68,0x01,0x30 + ,0x08,0x60,0xF7,0x46,0x44,0x01,0x00,0x02,0x00,0x2A + ,0x0C,0xD1,0x08,0x4A,0x92,0x7A,0x8A,0x42,0x00,0xD8 + ,0x11,0x1C,0x07,0x4A,0x49,0x00,0x51,0x5A,0x06,0x4A + ,0xD2,0x88,0x89,0x18,0xC9,0x18,0x00,0xE0,0x00,0x21 + ,0x01,0x70,0x09,0x0A,0x41,0x70,0xF7,0x46,0x04,0x01 + ,0x00,0x02,0xB0,0x01,0x00,0x02,0x00,0x00,0x00,0x02 + ,0xF0,0xB5,0x49,0x48,0x00,0x68,0xFF,0xF7,0x85,0xFF + ,0x04,0x06,0x47,0x48,0x24,0x0E,0x00,0x68,0x47,0x68 + ,0x38,0x78,0x06,0x07,0x36,0x0F,0x02,0x2C,0x73,0xD0 + ,0x44,0x4D,0x28,0x79,0x02,0x28,0x07,0xD1,0xF8,0x1D + ,0x09,0x30,0x06,0x22,0x41,0x49,0x04,0xF0,0xC9,0xF9 + ,0x00,0x28,0x67,0xD0,0x30,0x06,0x00,0x0E,0x08,0x28 + ,0x64,0xD1,0x3E,0x48,0x80,0x79,0x05,0x28,0x61,0xD1 + ,0x28,0x79,0x3C,0x4E,0x02,0x28,0x0C,0xD1,0xF8,0x1D + ,0x03,0x30,0x06,0x22,0x31,0x1C,0x04,0xF0,0xB5,0xF9 + ,0x00,0x28,0x55,0xD1,0x78,0x78,0x81,0x08,0x5A,0xD3 + ,0x40,0x08,0x58,0xD2,0x28,0x79,0x01,0x28,0x0C,0xD1 + ,0xF8,0x1D,0x09,0x30,0x06,0x22,0x31,0x1C,0x04,0xF0 + ,0xA5,0xF9,0x00,0x28,0x45,0xD1,0x78,0x78,0x81,0x08 + ,0x4A,0xD2,0x40,0x08,0x48,0xD2,0x38,0x78,0x08,0x28 + ,0x30,0xD1,0x2C,0x48,0x01,0x78,0x00,0x29,0x11,0xD0 + ,0xC0,0x78,0x00,0x28,0x11,0xD0,0x78,0x78,0xC0,0x09 + ,0x0E,0xD2,0xB9,0x7F,0xF8,0x1D,0x09,0x30,0x88,0x29 + ,0x02,0xD1,0xC0,0x7B,0x8E,0x28,0x06,0xD0,0xB8,0x7D + ,0x00,0x07,0x26,0xD0,0x02,0xE0,0x78,0x78,0xC0,0x09 + ,0x2C,0xD2,0x28,0x79,0x02,0x28,0x14,0xD1,0x78,0x78 + ,0x04,0x21,0x01,0x40,0x20,0x23,0x18,0x40,0x22,0x1C + ,0x03,0xF0,0x09,0xF9,0x00,0x2C,0x0A,0xD1,0x1A,0x48 + ,0x41,0x68,0x04,0x29,0x06,0xD1,0x01,0x26,0x46,0x60 + ,0x01,0x20,0x01,0xF0,0xB8,0xFB,0x16,0x48,0x06,0x70 + ,0x68,0x79,0x03,0x28,0x0D,0xD1,0x19,0x21,0xC9,0x02 + ,0x02,0x20,0x01,0xF0,0x94,0xFB,0x12,0x48,0x81,0x78 + ,0x02,0xE0,0x08,0xE0,0x08,0xE0,0x06,0xE0,0x08,0x23 + ,0x99,0x43,0x81,0x70,0x39,0x78,0x20,0x1C,0x00,0xF0 + ,0x21,0xFD,0xF0,0xBD,0x00,0x28,0xFC,0xD1,0x20,0x1C + ,0x00,0xF0,0xED,0xFB,0xF0,0xBD,0xE8,0x01,0x00,0x02 + ,0x48,0x01,0x00,0x02,0xB0,0x00,0x00,0x02,0x5C,0x00 + ,0x00,0x02,0x94,0x09,0x00,0x02,0x8E,0x00,0x00,0x02 + ,0x18,0x00,0x00,0x02,0x44,0x09,0x00,0x02,0xDC,0x01 + ,0x00,0x02,0xB4,0x09,0x00,0x02,0x08,0xB5,0x00,0x21 + ,0x00,0x91,0x00,0x28,0x0C,0xD1,0x09,0x48,0x00,0x68 + ,0x40,0x68,0x81,0x7D,0xC2,0x7D,0x12,0x02,0x11,0x43 + ,0x09,0x04,0x09,0x0C,0x0A,0x30,0xFF,0xF7,0xE3,0xFE + ,0x00,0x90,0x00,0x98,0x01,0x28,0x01,0xD0,0x00,0xF0 + ,0x03,0xF8,0x08,0xBD,0x48,0x01,0x00,0x02,0x80,0xB5 + ,0x05,0x48,0x00,0x78,0x80,0x09,0x04,0xD3,0x04,0x4F + ,0x38,0x68,0x02,0xF0,0x9F,0xF8,0x38,0x60,0x80,0xBD + ,0x00,0x00,0x94,0x01,0x00,0x02,0x48,0x01,0x00,0x02 + ,0xF0,0xB5,0x82,0xB0,0x00,0x25,0x7D,0x26,0x36,0x01 + ,0x01,0x21,0x89,0x06,0x88,0x68,0x00,0x0B,0xFC,0x24 + ,0x04,0x40,0xFA,0x48,0xC7,0x6A,0x00,0x2F,0x0F,0xD1 + ,0x00,0x20,0xFF,0xF7,0x9A,0xFD,0xF6,0x48,0xC1,0x69 + ,0x83,0x01,0x19,0x43,0xC1,0x61,0xC1,0x69,0xF4,0x4B + ,0x19,0x40,0xC1,0x61,0x01,0x05,0xC8,0x68,0x02,0xB0 + ,0xF0,0xBD,0xF2,0x49,0xA0,0x08,0x08,0x5C,0x00,0x28 + ,0x06,0xD0,0x00,0x20,0xFF,0xF7,0x85,0xFD,0x01,0x21 + ,0x89,0x06,0xC8,0x68,0xF1,0xE7,0xED,0x49,0x04,0x20 + ,0x20,0x40,0x01,0x91,0x61,0xD0,0x04,0x20,0xFF,0xF7 + ,0x2D,0xFE,0xEA,0x49,0x08,0x71,0xA0,0x09,0x01,0xD3 + ,0x14,0x21,0x00,0xE0,0x0E,0x21,0xE7,0x48,0x02,0x22 + ,0x01,0xF0,0x9E,0xFE,0x00,0x28,0x03,0xD1,0x01,0x21 + ,0x89,0x06,0xC8,0x68,0xD8,0xE7,0x01,0x21,0x89,0x06 + ,0xC8,0x68,0x28,0x43,0x01,0xE0,0xCA,0x68,0x10,0x43 + ,0x42,0x09,0x03,0xD2,0x32,0x1C,0x01,0x3E,0x00,0x2A + ,0xF7,0xD1,0x10,0x23,0x98,0x43,0x05,0x1C,0x00,0x2E + ,0x01,0xDC,0x28,0x1C,0xC4,0xE7,0xD7,0x49,0x08,0x79 + ,0x0A,0x28,0x09,0xD0,0x14,0x28,0x0B,0xD0,0x37,0x28 + ,0x0D,0xD0,0x6E,0x28,0x0F,0xD1,0xD4,0x4A,0x03,0x20 + ,0x50,0x75,0x14,0xE0,0xD2,0x4A,0x00,0x20,0x50,0x75 + ,0x10,0xE0,0xD0,0x4A,0x01,0x21,0x51,0x75,0x0C,0xE0 + ,0xCE,0x4A,0x02,0x20,0x50,0x75,0x08,0xE0,0x14,0x2F + ,0x03,0xD2,0xCB,0x4A,0x03,0x20,0x50,0x75,0x02,0xE0 + ,0xC9,0x4A,0x02,0x20,0x50,0x75,0xA8,0x09,0x06,0xD3 + ,0xE8,0x08,0x04,0xD2,0x01,0x20,0xFF,0xF7,0x2A,0xFD + ,0x28,0x1C,0x98,0xE7,0xC3,0x4F,0x00,0x20,0x38,0x60 + ,0xE8,0x0A,0x1D,0xD3,0xB4,0x2C,0x07,0xD0,0xC4,0x2C + ,0x16,0xD0,0xD4,0x2C,0x23,0xD1,0x00,0xF0,0xFF,0xF9 + ,0x20,0xE0,0x3D,0xE0,0xB6,0x48,0x40,0x68,0x80,0x0B + ,0x1B,0xD3,0xB9,0x4C,0x02,0x20,0xE1,0x1D,0x03,0x31 + ,0xB8,0x72,0x01,0x98,0x06,0x22,0xB7,0x4E,0x04,0xF0 + ,0x8D,0xF8,0x60,0x88,0x70,0x80,0x0E,0xE0,0x00,0xF0 + ,0xF8,0xFA,0x0B,0xE0,0xA4,0x2C,0x15,0xD0,0xB4,0x2C + ,0x13,0xD0,0xC4,0x2C,0x01,0xD0,0xD4,0x2C,0x03,0xD1 + ,0xAD,0x48,0xAF,0x49,0x40,0x88,0x08,0x80,0x78,0x68 + ,0x04,0x28,0x06,0xD1,0x00,0xF0,0xCE,0xF9,0x00,0x22 + ,0x10,0x21,0xAB,0x48,0x03,0xF0,0x31,0xFB,0x28,0x1C + ,0x5D,0xE7,0x7A,0x7D,0xA9,0x48,0xAA,0x4B,0x52,0x00 + ,0x9A,0x5A,0xC1,0x88,0xA5,0x4B,0x8A,0x18,0x1A,0x80 + ,0xB4,0x2C,0xE8,0xD1,0x80,0x88,0x40,0x00,0x08,0x18 + ,0x19,0x88,0x40,0x18,0x18,0x80,0xE1,0xE7,0xA3,0x49 + ,0x08,0x68,0x00,0x7A,0x00,0x28,0x06,0xD0,0xC4,0x20 + ,0x9A,0x4A,0x01,0x21,0x89,0x06,0x10,0x60,0xC8,0x68 + ,0x3F,0xE7,0x01,0x20,0xFF,0xF7,0xCC,0xFC,0x29,0x2F + ,0x0D,0xD2,0x07,0x20,0xFF,0xF7,0x7B,0xFD,0x91,0x49 + ,0xC8,0x71,0x0B,0x21,0x79,0x43,0xCF,0x08,0x03,0x21 + ,0x00,0x91,0x00,0x0A,0x1D,0xD3,0x01,0x3F,0x1B,0xE0 + ,0x04,0x20,0xFF,0xF7,0x6D,0xFD,0x00,0x06,0x00,0x0E + ,0x89,0x4E,0x0A,0x28,0x30,0x71,0x1F,0xD0,0x14,0x28 + ,0x21,0xD0,0x37,0x28,0x23,0xD0,0x6E,0x28,0x03,0xD1 + ,0x07,0x20,0xFF,0xF7,0x5E,0xFD,0xF0,0x71,0x0B,0x20 + ,0x78,0x43,0xC7,0x08,0x03,0x21,0x00,0x91,0xF0,0x79 + ,0x00,0x0A,0x00,0xD3,0x01,0x3F,0x80,0x2C,0x01,0xD0 + ,0x50,0x2C,0x16,0xD1,0x03,0x20,0xFF,0xF7,0x4D,0xFD + ,0x82,0x49,0x80,0x06,0x09,0x68,0x80,0x0E,0x48,0x74 + ,0x11,0xE0,0xFF,0x08,0x00,0x21,0x00,0x91,0xEE,0xE7 + ,0xBF,0x08,0x01,0x21,0x00,0x91,0xEA,0xE7,0x0B,0x20 + ,0x78,0x43,0x07,0x09,0x02,0x21,0x00,0x91,0xE4,0xE7 + ,0x78,0x49,0x00,0x20,0x09,0x68,0x48,0x74,0x74,0x48 + ,0x80,0x89,0x04,0x30,0xB8,0x42,0x01,0xD3,0x18,0x2F + ,0x0E,0xD8,0x6C,0x4A,0xC3,0x20,0x10,0x60,0x65,0x48 + ,0xC1,0x69,0x83,0x01,0x19,0x43,0xC1,0x61,0xC1,0x69 + ,0x63,0x4B,0x19,0x40,0xC1,0x61,0x01,0x05,0xC8,0x68 + ,0xDB,0xE6,0x6B,0x4E,0x02,0x22,0x30,0x68,0x18,0x21 + ,0x40,0x68,0x01,0xF0,0x94,0xFD,0x00,0x28,0x03,0xD1 + ,0x01,0x21,0x89,0x06,0xC8,0x68,0xCE,0xE6,0x7D,0x20 + ,0xC0,0x00,0x01,0x22,0x92,0x06,0xD1,0x68,0x29,0x43 + ,0x03,0xE0,0x01,0x22,0x92,0x06,0xD2,0x68,0x11,0x43 + ,0x4A,0x09,0x03,0xD2,0x02,0x1C,0x01,0x38,0x00,0x2A + ,0xF5,0xD1,0x10,0x23,0x99,0x43,0x0D,0x1C,0x00,0x28 + ,0x01,0xDC,0x28,0x1C,0xB6,0xE6,0x58,0x48,0x54,0x49 + ,0x00,0x68,0x00,0x22,0x46,0x68,0x0A,0x80,0x2A,0x0A + ,0x52,0x07,0x08,0xD1,0x70,0x88,0x4D,0x4A,0x00,0x27 + ,0x08,0x80,0x01,0x21,0x11,0x73,0xD7,0x72,0x28,0x1C + ,0xA4,0xE6,0x50,0x49,0x0D,0x60,0xE9,0x0A,0x13,0xD3 + ,0x47,0x4A,0x01,0x21,0x91,0x72,0x71,0x78,0xC9,0x08 + ,0x03,0xD3,0x71,0x88,0x45,0x4A,0x51,0x80,0x02,0xE0 + ,0x43,0x49,0x00,0x22,0x4A,0x80,0x40,0x68,0xC1,0x1D + ,0x03,0x31,0x06,0x22,0x01,0x98,0x03,0xF0,0x9E,0xFF + ,0x00,0x98,0x3D,0x49,0x48,0x75,0x42,0x48,0x02,0x68 + ,0x97,0x81,0x4A,0x7D,0x03,0x68,0x00,0x27,0x9A,0x73 + ,0x0F,0x60,0x31,0x78,0x48,0x29,0x03,0xD1,0x71,0x78 + ,0x40,0x23,0x99,0x43,0x71,0x70,0x71,0x78,0xC9,0x09 + ,0x2E,0xD2,0x00,0x68,0x02,0x22,0x81,0x89,0x40,0x68 + ,0x18,0x30,0x18,0x39,0x01,0xF0,0x2F,0xFD,0x00,0x28 + ,0x05,0xD1,0x2E,0x48,0x01,0x21,0x01,0x73,0xC7,0x72 + ,0x28,0x1C,0x67,0xE6,0x2B,0x4F,0x03,0x20,0xF8,0x72 + ,0x02,0x20,0x38,0x73,0x80,0x2C,0x15,0xD1,0x2F,0x48 + ,0xC1,0x1D,0x29,0x31,0x09,0x79,0x01,0x29,0x0F,0xD1 + ,0xF9,0x1D,0x49,0x31,0x89,0x79,0x05,0x29,0x0A,0xD1 + ,0xC1,0x1D,0x07,0x31,0xF0,0x1D,0x06,0x22,0x09,0x30 + ,0x03,0xF0,0x42,0xFF,0x00,0x28,0x01,0xD1,0x01,0x21 + ,0xB9,0x76,0x28,0x1C,0x48,0xE6,0x24,0x4E,0x31,0x78 + ,0x00,0x29,0x05,0xD1,0x19,0x48,0x01,0x21,0x01,0x73 + ,0xC7,0x72,0x28,0x1C,0x3E,0xE6,0x04,0x1C,0x00,0x68 + ,0x02,0x22,0x40,0x68,0x04,0x21,0x18,0x30,0x01,0xF0 + ,0xF6,0xFC,0x00,0x28,0x01,0xD1,0x28,0x1C,0x32,0xE6 + ,0x7D,0x20,0xC0,0x00,0x01,0x22,0x92,0x06,0xD1,0x68 + ,0x29,0x43,0x01,0xE0,0xD3,0x68,0x19,0x43,0x4B,0x09 + ,0x03,0xD2,0x03,0x1C,0x01,0x38,0x00,0x2B,0xF7,0xD1 + ,0x10,0x23,0x99,0x43,0x0D,0x1C,0x00,0x28,0x23,0xDC + ,0x20,0xE0,0x00,0x00,0x40,0x00,0x00,0x04,0xFF,0xEF + ,0x00,0x00,0x4C,0x01,0x00,0x02,0x30,0x09,0x00,0x02 + ,0xCC,0x07,0x00,0x02,0xB4,0x07,0x00,0x02,0x44,0x09 + ,0x00,0x02,0x2C,0x09,0x00,0x02,0xE2,0x01,0x00,0x02 + ,0x38,0x07,0x00,0x02,0x00,0x00,0x00,0x02,0xB0,0x01 + ,0x00,0x02,0x48,0x01,0x00,0x02,0xE4,0x01,0x00,0x02 + ,0x80,0x00,0x00,0x02,0x18,0x00,0x00,0x02,0x28,0x1C + ,0xFA,0xE5,0x20,0x68,0x40,0x68,0xC1,0x1D,0x11,0x31 + ,0x40,0x7E,0x0A,0x78,0x00,0x02,0x10,0x43,0x8A,0x78 + ,0xC9,0x78,0x12,0x04,0x10,0x43,0x89,0x09,0x09,0x06 + ,0x09,0x0E,0x0D,0x23,0x59,0x43,0x89,0x19,0x0B,0x7B + ,0x1B,0x06,0x18,0x43,0x32,0x1C,0x03,0x26,0x76,0x06 + ,0x30,0x60,0x8B,0x7B,0x48,0x7B,0x1B,0x02,0x18,0x43 + ,0xCB,0x7B,0x1B,0x04,0x18,0x43,0x0B,0x7C,0x1B,0x06 + ,0x18,0x43,0x70,0x60,0xD0,0x1D,0x39,0x30,0x00,0x78 + ,0x01,0x28,0x02,0xD1,0x01,0x21,0xB1,0x60,0x19,0xE0 + ,0x02,0x28,0x17,0xD1,0x8A,0x7C,0x48,0x7C,0x12,0x02 + ,0x10,0x43,0xCA,0x7C,0x12,0x04,0x10,0x43,0x0A,0x7D + ,0x12,0x06,0x10,0x43,0x70,0x61,0x8A,0x7D,0x48,0x7D + ,0x12,0x02,0x10,0x43,0xCA,0x7D,0x09,0x7E,0x12,0x04 + ,0x10,0x43,0x09,0x06,0x08,0x43,0xB0,0x61,0x81,0x20 + ,0xB0,0x60,0x20,0x68,0x0E,0x22,0x81,0x89,0x40,0x68 + ,0x18,0x30,0x20,0x39,0x01,0xF0,0x6C,0xFC,0x00,0x28 + ,0x06,0xD1,0x08,0x48,0x01,0x21,0x01,0x73,0xC7,0x72 + ,0xB7,0x60,0x28,0x1C,0xA3,0xE5,0x20,0x68,0x81,0x89 + ,0x08,0x39,0x81,0x81,0x03,0x49,0x03,0x20,0xC8,0x72 + ,0x02,0x20,0x08,0x73,0x28,0x1C,0x98,0xE5,0x44,0x09 + ,0x00,0x02,0x00,0xB5,0x03,0x49,0x01,0x20,0x48,0x60 + ,0x01,0xF0,0xD0,0xF8,0x00,0xBD,0x00,0x00,0x44,0x09 + ,0x00,0x02,0xF0,0xB5,0x3D,0x4F,0x01,0x24,0x78,0x68 + ,0x04,0x28,0x0C,0xD1,0x01,0x20,0x01,0xF0,0xC3,0xF8 + ,0x7C,0x60,0x01,0x20,0xFF,0xF7,0x0F,0xFB,0x00,0x22 + ,0x01,0x21,0x37,0x48,0x03,0xF0,0x4C,0xF9,0xF0,0xBD + ,0x78,0x68,0x02,0x28,0xFB,0xD1,0x01,0x20,0x01,0xF0 + ,0xB3,0xF8,0x7C,0x60,0x78,0x6E,0x08,0x23,0x41,0x78 + ,0x32,0x4C,0x99,0x43,0x41,0x70,0x2F,0x49,0x89,0x89 + ,0xB9,0x87,0x22,0x78,0x2F,0x49,0x01,0x2A,0x45,0xD1 + ,0x2F,0x4B,0x1A,0x78,0x00,0x2A,0x01,0xD0,0x18,0x25 + ,0x00,0xE0,0x1E,0x25,0x2C,0x4E,0x36,0x88,0x75,0x1B + ,0x2C,0x4E,0x36,0x68,0xAD,0x19,0x2A,0x4E,0x01,0x32 + ,0x35,0x60,0x1A,0x70,0x1A,0x78,0x86,0x7D,0x12,0x07 + ,0x12,0x0F,0x1D,0x1C,0xF0,0x23,0x33,0x40,0x1A,0x43 + ,0x82,0x75,0x42,0x78,0xD2,0x09,0x03,0xD3,0x22,0x4A + ,0x13,0x68,0x08,0x3B,0x13,0x60,0x21,0x4B,0x2A,0x78 + ,0x1B,0x88,0x9A,0x42,0x0F,0xD1,0x20,0x4A,0x1C,0x4E + ,0x12,0x88,0x04,0x23,0x32,0x80,0x42,0x78,0x9A,0x43 + ,0x42,0x70,0x02,0x20,0x20,0x70,0x08,0x68,0x80,0x7D + ,0x31,0x88,0x00,0xF0,0x68,0xFF,0xF8,0x66,0x15,0x4E + ,0x30,0x88,0xB8,0x66,0x20,0x78,0x02,0x28,0x04,0xD0 + ,0x01,0x21,0x01,0x20,0x00,0xF0,0x2D,0xF8,0xF0,0xBD + ,0x01,0x21,0x00,0x20,0x00,0xF0,0x28,0xF8,0xF0,0xBD + ,0x09,0x68,0x00,0x20,0x48,0x73,0x0F,0x49,0x09,0x68 + ,0x48,0x70,0x01,0x20,0xFF,0xF7,0xA6,0xFA,0x00,0x22 + ,0x10,0x21,0x0C,0x48,0x03,0xF0,0xE3,0xF8,0xF0,0xBD + ,0x44,0x09,0x00,0x02,0x38,0x07,0x00,0x02,0xC0,0x00 + ,0x00,0x02,0x95,0x01,0x00,0x02,0xC4,0x01,0x00,0x02 + ,0x96,0x01,0x00,0x02,0x98,0x01,0x00,0x02,0xA0,0x01 + ,0x00,0x02,0x9C,0x01,0x00,0x02,0x9A,0x01,0x00,0x02 + ,0xD0,0x01,0x00,0x02,0xF8,0x06,0x00,0x02,0xF0,0xB5 + ,0x30,0x4D,0x04,0x1C,0x28,0x68,0x0F,0x1C,0x80,0x7D + ,0x2E,0x49,0x08,0x70,0x00,0xF0,0x86,0xFF,0x2C,0x49 + ,0x08,0x78,0x03,0x28,0x04,0xD1,0x2B,0x48,0x40,0x6B + ,0xFF,0xF7,0xB8,0xFA,0x02,0xE0,0x00,0x20,0xFF,0xF7 + ,0xB4,0xFA,0x28,0x68,0x85,0x7D,0x27,0x48,0x80,0x7A + ,0x85,0x42,0x00,0xDB,0x05,0x1C,0x23,0x48,0x00,0x78 + ,0x01,0xF0,0xAF,0xFB,0x24,0x4A,0x24,0x49,0x10,0x60 + ,0xCB,0x88,0x69,0x00,0x23,0x4D,0x69,0x5A,0x59,0x18 + ,0x00,0x2C,0x12,0xD0,0x00,0x2F,0x11,0xD0,0x21,0x4C + ,0x21,0x4D,0x24,0x88,0x2D,0x78,0x5B,0x18,0x1B,0x18 + ,0x01,0x3C,0xAC,0x42,0x03,0xD1,0x1E,0x4C,0x24,0x68 + ,0x1E,0x19,0x04,0xE0,0x15,0x4C,0xE4,0x6E,0xE6,0x18 + ,0x00,0xE0,0x00,0x26,0x13,0x4C,0x14,0x4A,0xE3,0x6E + ,0x18,0x18,0x10,0x60,0x18,0x4A,0x12,0x88,0x10,0x18 + ,0x45,0x18,0x00,0x2F,0x07,0xD0,0x60,0x6E,0x0C,0x49 + ,0x02,0x30,0x33,0x1C,0x00,0x22,0x09,0x78,0xFF,0xF7 + ,0x9E,0xFB,0x01,0x20,0x29,0x1C,0x00,0xF0,0xC8,0xFF + ,0x02,0x20,0x60,0x60,0x01,0x20,0x0F,0x49,0xE0,0x75 + ,0x09,0x88,0xE0,0x6E,0x06,0x4A,0x40,0x18,0x10,0x60 + ,0xF0,0xBD,0x00,0x00,0xC4,0x01,0x00,0x02,0x93,0x01 + ,0x00,0x02,0x44,0x09,0x00,0x02,0x04,0x01,0x00,0x02 + ,0x8C,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0xB0,0x01 + ,0x00,0x02,0x9C,0x01,0x00,0x02,0x96,0x01,0x00,0x02 + ,0xA4,0x01,0x00,0x02,0xAE,0x01,0x00,0x02,0xAC,0x01 + ,0x00,0x02,0x00,0xB5,0x06,0x48,0x40,0x68,0x03,0x28 + ,0x06,0xD1,0x01,0x20,0x00,0xF0,0xB6,0xFF,0x00,0x21 + ,0x01,0x20,0xFF,0xF7,0x7A,0xFF,0x00,0xBD,0x00,0x00 + ,0x44,0x09,0x00,0x02,0x00,0xB5,0x11,0x49,0x09,0x68 + ,0x49,0x68,0x0A,0x78,0x13,0x07,0x10,0xD1,0x12,0x11 + ,0x0D,0x2A,0x0D,0xD2,0x01,0xA3,0x9B,0x5C,0x5B,0x00 + ,0x9F,0x44,0x09,0x0A,0x09,0x0A,0x0D,0x06,0x09,0x09 + ,0x06,0x09,0x0A,0x0A,0x0A,0x00,0x08,0x1C,0x00,0xF0 + ,0x10,0xF8,0x00,0xBD,0xFF,0xF7,0x0D,0xFC,0x00,0xBD + ,0x04,0x48,0x40,0x78,0x00,0x28,0xF7,0xD0,0x07,0xF0 + ,0x12,0xFE,0x00,0xBD,0x00,0x00,0x48,0x01,0x00,0x02 + ,0x94,0x09,0x00,0x02,0xB0,0xB5,0x28,0x4C,0x07,0x1C + ,0xA0,0x79,0x01,0x28,0x02,0xD1,0x38,0x1C,0x07,0xF0 + ,0xF5,0xFD,0x38,0x78,0x50,0x28,0x0E,0xD0,0xA0,0x79 + ,0x03,0x28,0x03,0xD1,0x07,0xF0,0xD1,0xF9,0x00,0x28 + ,0x3D,0xD0,0xA0,0x79,0x04,0x28,0x04,0xD1,0x01,0x20 + ,0x07,0xF0,0xC7,0xF8,0x00,0x28,0x35,0xD0,0xA0,0x79 + ,0x05,0x28,0x30,0xD1,0x1A,0x4D,0xF8,0x1D,0x09,0x30 + ,0x06,0x22,0xE9,0x1D,0x07,0x31,0x03,0xF0,0x14,0xFD + ,0x17,0x4C,0x00,0x28,0x20,0xD1,0x20,0x79,0x20,0x37 + ,0x02,0x28,0x0A,0xD1,0xB8,0x78,0x40,0x08,0x20,0xD3 + ,0x06,0x20,0x00,0xF0,0x53,0xFF,0x00,0x20,0x00,0xF0 + ,0x22,0xF8,0x00,0xF0,0xD4,0xF8,0x20,0x79,0x01,0x28 + ,0x13,0xD1,0xB8,0x78,0x80,0x08,0x12,0xD3,0x00,0x20 + ,0x00,0xF0,0x17,0xF8,0x00,0xF0,0x05,0xFF,0x29,0x88 + ,0x89,0x02,0x09,0x1A,0x06,0x20,0x00,0xF0,0x23,0xFF + ,0x04,0xE0,0x20,0x79,0x01,0x28,0x01,0xD1,0x07,0xF0 + ,0x45,0xFE,0xFF,0xF7,0xC9,0xFB,0xB0,0xBD,0x94,0x09 + ,0x00,0x02,0x80,0x00,0x00,0x02,0xB0,0x00,0x00,0x02 + ,0xF1,0xB5,0x83,0xB0,0x3E,0x49,0x00,0x25,0x0B,0x68 + ,0x02,0x93,0x59,0x68,0x4A,0x7E,0x0F,0x7E,0x12,0x02 + ,0x3A,0x43,0x8F,0x7E,0x3F,0x04,0x3A,0x43,0xCF,0x7E + ,0x3F,0x06,0x3A,0x43,0x16,0x1C,0x4F,0x7F,0x0A,0x7F + ,0x3F,0x02,0x3A,0x43,0x8F,0x7F,0xC9,0x7F,0x3F,0x04 + ,0x3A,0x43,0x09,0x06,0x0A,0x43,0x99,0x89,0x18,0x39 + ,0xCC,0x00,0x99,0x7B,0x17,0x1C,0x00,0x29,0x26,0xD0 + ,0x01,0x29,0x26,0xD0,0x02,0x29,0x26,0xD0,0x03,0x29 + ,0x0C,0xD1,0x0B,0x20,0x21,0x1C,0x03,0xF0,0x17,0xFD + ,0x00,0x91,0x61,0x1A,0x0B,0x20,0x03,0xF0,0x12,0xFD + ,0x00,0x99,0x00,0x29,0x00,0xD9,0x01,0x30,0x01,0x24 + ,0xA4,0x06,0xA2,0x6A,0x61,0x6A,0x02,0x9B,0x30,0x18 + ,0x5B,0x69,0xCB,0x1A,0xC0,0x18,0xB0,0x42,0x00,0xD2 + ,0x01,0x37,0x06,0x1C,0x1F,0x48,0x03,0x79,0x00,0x20 + ,0x02,0x2B,0x14,0xD1,0x01,0x25,0x1F,0xE0,0x20,0x1C + ,0xE9,0xE7,0x60,0x08,0xE7,0xE7,0x61,0x00,0x01,0x91 + ,0x0B,0x20,0x03,0xF0,0xF1,0xFC,0x0C,0x1C,0x01,0x99 + ,0x09,0x1B,0x0B,0x20,0x03,0xF0,0xEB,0xFC,0x00,0x2C + ,0xDA,0xD9,0x01,0x30,0xD8,0xE7,0x01,0x2B,0x0A,0xD1 + ,0x12,0x4B,0x97,0x42,0x58,0x70,0x01,0xD9,0x01,0x25 + ,0x04,0xE0,0x97,0x42,0x02,0xD1,0x8E,0x42,0x00,0xD9 + ,0x01,0x25,0x03,0x9A,0x00,0x2A,0x03,0xD0,0x00,0x2D + ,0x03,0xD1,0x04,0xB0,0xF0,0xBD,0x00,0x2D,0x09,0xD0 + ,0x70,0x1A,0x00,0xF0,0x10,0xF8,0x01,0x23,0xDE,0x42 + ,0x01,0xD1,0x00,0x26,0x01,0x37,0xA7,0x62,0x66,0x62 + ,0x01,0x20,0xEF,0xE7,0x00,0x00,0x48,0x01,0x00,0x02 + ,0xB0,0x00,0x00,0x02,0x94,0x09,0x00,0x02,0x90,0xB4 + ,0x10,0x4A,0x00,0x21,0x97,0x69,0x91,0x61,0x01,0x21 + ,0x0E,0x4B,0x8C,0x00,0xE3,0x18,0xDC,0x6A,0x01,0x31 + ,0x24,0x18,0xDC,0x62,0x08,0x29,0xF6,0xD9,0x0B,0x49 + ,0x0B,0x6B,0x1B,0x18,0x0B,0x63,0x0B,0x6B,0x5B,0x00 + ,0x5B,0x08,0x0B,0x63,0xCB,0x6A,0x18,0x18,0xC8,0x62 + ,0xC8,0x6A,0x40,0x00,0x40,0x08,0xC8,0x62,0x97,0x61 + ,0x90,0xBC,0xF7,0x46,0x00,0x00,0x80,0x00,0x00,0x04 + ,0x40,0x00,0x00,0x04,0x44,0x09,0x00,0x02,0x00,0xB5 + ,0x08,0x29,0x01,0xD1,0xFF,0xF7,0xF5,0xFA,0x00,0xBD + ,0xB0,0xB5,0x1D,0x48,0x00,0x25,0x02,0x68,0x24,0x20 + ,0x51,0x68,0x92,0x89,0x00,0x24,0x04,0x3A,0x24,0x2A + ,0x26,0xD9,0x0F,0x5C,0x06,0x2F,0x1C,0xD2,0x01,0xA3 + ,0xDB,0x5D,0x5B,0x00,0x9F,0x44,0x02,0x02,0x18,0x02 + ,0x07,0x20,0x0B,0x18,0x5B,0x78,0x02,0x33,0x18,0x18 + ,0x0E,0xE0,0x0B,0x18,0x5F,0x79,0x1C,0x79,0x3F,0x02 + ,0x27,0x43,0x3D,0x1C,0xDF,0x79,0x9C,0x79,0x5B,0x78 + ,0x3F,0x02,0x27,0x43,0x3C,0x04,0x24,0x0C,0x02,0x33 + ,0x18,0x18,0x82,0x42,0xDF,0xD8,0x00,0x2C,0x04,0xD9 + ,0xAC,0x42,0x02,0xD2,0xA0,0x02,0x00,0xF0,0x0E,0xF8 + ,0xB0,0xBD,0x05,0x4A,0x52,0x79,0x01,0x2A,0xF3,0xDD + ,0x08,0x18,0x00,0xF0,0x24,0xF8,0xEF,0xE7,0x00,0x00 + ,0x48,0x01,0x00,0x02,0xB0,0x00,0x00,0x02,0x0B,0x49 + ,0x09,0x68,0x49,0x69,0x08,0x18,0x0A,0x49,0x4A,0x7A + ,0x05,0x2A,0x02,0xD1,0x8A,0x6B,0x82,0x42,0x0A,0xD2 + ,0x05,0x22,0x4A,0x72,0x02,0x1C,0x06,0x48,0x80,0x23 + ,0xC2,0x60,0x82,0x69,0x1A,0x43,0x82,0x61,0xC0,0x68 + ,0x88,0x63,0xF7,0x46,0x00,0x00,0x48,0x01,0x00,0x02 + ,0x44,0x09,0x00,0x02,0x80,0x00,0x00,0x04,0xF0,0xB5 + ,0x02,0x79,0x35,0x4C,0x87,0x78,0xFE,0x21,0x11,0x40 + ,0xE5,0x88,0x03,0x23,0x9B,0x03,0x9D,0x43,0x2B,0x1C + ,0x00,0x29,0x03,0xD0,0xCD,0x00,0x01,0x3D,0x9D,0x42 + ,0x05,0xD2,0x45,0x78,0x6D,0x18,0xED,0x00,0x18,0x3D + ,0x9D,0x42,0x01,0xD8,0x00,0x25,0x08,0xE0,0xC9,0x00 + ,0x59,0x1A,0x89,0x09,0x5E,0x07,0x76,0x0F,0x41,0x18 + ,0x49,0x79,0xF1,0x40,0x0D,0x1C,0x00,0x23,0x26,0x49 + ,0x52,0x08,0x8B,0x70,0x05,0xD3,0x00,0x2F,0x03,0xD1 + ,0x8A,0x78,0x02,0x23,0x1A,0x43,0x8A,0x70,0xEA,0x07 + ,0xD2,0x0F,0x03,0xD0,0x8D,0x78,0x04,0x23,0x2B,0x43 + ,0x8B,0x70,0xE3,0x1D,0x29,0x33,0x5B,0x79,0x01,0x25 + ,0x02,0x2B,0x1D,0xD1,0x8E,0x78,0x08,0x23,0x33,0x43 + ,0x8B,0x70,0x00,0x2A,0x03,0xD0,0x0A,0x78,0x00,0x2A + ,0x00,0xD1,0x4D,0x70,0x00,0x2F,0x00,0xD1,0xC7,0x78 + ,0x15,0x48,0x40,0x8B,0xB8,0x42,0x00,0xD8,0x07,0x1C + ,0x00,0xF0,0x90,0xFD,0x21,0x88,0x12,0x4B,0x4F,0x43 + ,0xB9,0x02,0x08,0x1A,0xC1,0x18,0x06,0x20,0x00,0xF0 + ,0xAB,0xFD,0xF0,0xBD,0x88,0x78,0xC0,0x08,0x00,0xD3 + ,0x8D,0x71,0x88,0x78,0x40,0x08,0x80,0x07,0x07,0xD1 + ,0x0A,0x48,0x80,0x69,0x80,0x08,0x03,0xD2,0x88,0x78 + ,0x08,0x23,0x18,0x43,0x88,0x70,0x88,0x78,0x04,0x23 + ,0x98,0x43,0x88,0x70,0xF0,0xBD,0x00,0x00,0x80,0x00 + ,0x00,0x02,0xB4,0x09,0x00,0x02,0xC0,0x00,0x00,0x02 + ,0x48,0xF4,0xFF,0xFF,0x80,0x00,0x00,0x04,0xF0,0xB5 + ,0x82,0xB0,0x36,0x48,0x34,0x4E,0xC5,0x1D,0x09,0x35 + ,0x33,0x4C,0xC7,0x1D,0x69,0x37,0x00,0x22,0xD2,0x43 + ,0x00,0x92,0x01,0x22,0x01,0xAB,0x31,0x48,0x32,0x49 + ,0x02,0xF0,0x1E,0xFF,0x01,0x98,0x41,0x0A,0x0C,0xD3 + ,0x80,0x20,0x38,0x71,0x00,0x20,0x78,0x71,0x38,0x79 + ,0x00,0x0A,0x4C,0xD3,0x07,0xF0,0x9E,0xFD,0x38,0x79 + ,0x00,0x0A,0xFA,0xD2,0x46,0xE0,0x41,0x08,0x0F,0xD3 + ,0x30,0x1C,0xFF,0xF7,0x27,0xF9,0x27,0x48,0x41,0x6C + ,0x09,0x78,0x40,0x29,0x3C,0xD0,0x07,0xF0,0x78,0xFA + ,0x23,0x48,0x40,0x6C,0x00,0x78,0x40,0x28,0xF8,0xD1 + ,0x34,0xE0,0x41,0x0D,0x03,0xD3,0x40,0x20,0x07,0xF0 + ,0x3B,0xF9,0x2E,0xE0,0x41,0x09,0x03,0xD3,0x50,0x20 + ,0x07,0xF0,0x35,0xF9,0x28,0xE0,0x40,0x0F,0x03,0xD3 + ,0x80,0x20,0x07,0xF0,0x2F,0xF9,0x22,0xE0,0x00,0x21 + ,0x79,0x22,0x52,0x05,0x17,0x48,0x91,0x82,0x10,0x82 + ,0x91,0x80,0x64,0x20,0x10,0x80,0x02,0x20,0x90,0x82 + ,0x12,0x48,0x21,0x72,0x81,0x6B,0x09,0x7B,0x09,0x0A + ,0x06,0xD3,0x00,0xF0,0x21,0xF8,0x0E,0x48,0x80,0x6B + ,0x00,0x7B,0x00,0x0A,0xF8,0xD2,0xC0,0x20,0x02,0xF0 + ,0x31,0xFF,0x00,0x21,0x79,0x22,0x52,0x05,0x91,0x82 + ,0x11,0x83,0x21,0x72,0x02,0xF0,0x29,0xFF,0x00,0x20 + ,0xA8,0x73,0x9C,0xE7,0x1A,0x08,0x00,0x02,0xCC,0x01 + ,0x00,0x02,0x44,0x09,0x00,0x02,0x18,0x07,0x00,0x02 + ,0x11,0x11,0x10,0x10,0x8C,0x01,0x00,0x02,0xA0,0x8C + ,0x00,0x00,0xF0,0xB5,0x83,0xB0,0x87,0x4D,0x00,0x24 + ,0xA8,0x6B,0x47,0x68,0x39,0x79,0x49,0x08,0x01,0xD3 + ,0x01,0x26,0x00,0xE0,0x00,0x26,0x82,0x4D,0x69,0x7A + ,0x00,0x29,0x73,0xD1,0x81,0x4A,0xD1,0x78,0x00,0x29 + ,0x0C,0xD0,0x39,0x78,0x08,0x29,0x09,0xD1,0x7F,0x4A + ,0x91,0x78,0x00,0x29,0x05,0xD0,0x81,0x7D,0xD3,0x78 + ,0x99,0x42,0x01,0xDD,0xD1,0x78,0x81,0x75,0x78,0x4B + ,0x7A,0x49,0x9D,0x6B,0x00,0x22,0x68,0x68,0x00,0x2E + ,0x48,0x66,0x9A,0x72,0x65,0xD1,0x77,0x48,0xA9,0x8A + ,0x00,0x89,0x04,0x38,0x81,0x42,0x60,0xDD,0x70,0x4A + ,0x01,0x21,0x51,0x72,0xF9,0x1D,0x17,0x31,0x51,0x61 + ,0x6D,0x49,0x04,0x04,0x24,0x0C,0x8C,0x81,0xA8,0x8A + ,0x01,0x1B,0xE0,0x1F,0x11,0x38,0x02,0x90,0x03,0xF0 + ,0x17,0xFB,0x68,0x49,0x01,0x30,0x08,0x82,0xA8,0x8A + ,0x01,0x1B,0x02,0x98,0x03,0xF0,0x0F,0xFB,0xC8,0x1D + ,0x63,0x49,0x11,0x30,0xC8,0x81,0xC8,0x89,0x18,0x28 + ,0x04,0xD1,0x60,0x4B,0xDC,0x81,0x18,0x8A,0x01,0x38 + ,0x18,0x82,0x78,0x78,0xC0,0x09,0x06,0xD3,0x5C,0x4B + ,0xE0,0x1D,0x01,0x30,0x98,0x81,0xD8,0x89,0x08,0x30 + ,0xD8,0x81,0x59,0x4C,0xA8,0x7D,0xE1,0x89,0x00,0xF0 + ,0xBE,0xFB,0xA0,0x61,0xA0,0x6B,0x80,0x7D,0xA1,0x89 + ,0x00,0xF0,0xB8,0xFB,0x56,0x49,0x54,0x4A,0xC8,0x66 + ,0xA0,0x89,0x88,0x66,0xA0,0x6B,0x80,0x7D,0x92,0x7A + ,0x90,0x42,0x00,0xDA,0x02,0x1C,0x53,0x4B,0x52,0x00 + ,0x9A,0x5A,0x52,0x4B,0xDB,0x88,0x5B,0x00,0xD2,0x18 + ,0x23,0x8A,0xA5,0x7A,0x01,0x3B,0xAB,0x42,0x04,0xD1 + ,0xA1,0x69,0x54,0x18,0x00,0xE0,0x25,0xE0,0x01,0xE0 + ,0xC9,0x6E,0x8C,0x18,0x01,0xF0,0x38,0xF8,0x04,0x19 + ,0x78,0x78,0x04,0x23,0x18,0x43,0x78,0x70,0x12,0xE0 + ,0xFF,0xE7,0x40,0x48,0x42,0x49,0x42,0x72,0xA8,0x8A + ,0x88,0x66,0x78,0x78,0xC0,0x09,0x02,0xD3,0x88,0x6E + ,0x08,0x30,0x88,0x66,0x3D,0x49,0x89,0x6E,0xA8,0x7D + ,0x00,0xF0,0x81,0xFB,0x3B,0x49,0xC8,0x66,0x37,0x48 + ,0x32,0x1C,0x80,0x6B,0x81,0x7D,0xB8,0x1C,0x23,0x1C + ,0xFF,0xF7,0x37,0xF8,0x30,0x1C,0x00,0xF0,0xF0,0xFA + ,0x00,0x28,0x0A,0xD0,0x02,0x20,0x33,0x49,0xC2,0x1E + ,0x48,0x74,0x00,0x92,0x01,0x22,0x11,0x21,0x34,0x48 + ,0x01,0xAB,0x02,0xF0,0xFB,0xFD,0x2E,0x48,0x00,0x24 + ,0x2A,0x4D,0x44,0x74,0xA8,0x6B,0x41,0x7B,0x00,0x29 + ,0x0C,0xD1,0x38,0x1C,0x00,0xF0,0x70,0xF8,0x27,0x4A + ,0x54,0x70,0x10,0x78,0x01,0x30,0x10,0x70,0x00,0xF0 + ,0xD9,0xFB,0x00,0xF0,0x55,0xF8,0x3E,0xE0,0xE9,0x1D + ,0x39,0x31,0x0A,0x7A,0x01,0x2A,0x05,0xD1,0x08,0x22 + ,0x42,0x73,0x0C,0x72,0x00,0xF0,0x4A,0xF8,0x33,0xE0 + ,0x40,0x7B,0x04,0x28,0x1F,0xD0,0x00,0xF0,0xB6,0xFB + ,0xA8,0x6B,0x81,0x7B,0x01,0x31,0x81,0x73,0x78,0x78 + ,0x08,0x23,0x18,0x43,0x78,0x70,0x38,0x78,0x08,0x28 + ,0x12,0xD1,0x14,0x48,0xC0,0x78,0x00,0x28,0x0E,0xD0 + ,0x13,0x4A,0x18,0x4B,0x50,0x78,0x01,0x30,0x00,0x06 + ,0x00,0x0E,0x50,0x70,0xA9,0x6B,0x89,0x7D,0x59,0x5C + ,0x88,0x42,0x00,0xDD,0x14,0x70,0x00,0xF0,0xA8,0xFB + ,0xA8,0x6B,0x0D,0x4A,0x81,0x7B,0x12,0x7C,0x91,0x42 + ,0x04,0xDA,0x44,0x73,0xA9,0x6B,0x82,0x20,0x08,0x73 + ,0x05,0xE0,0x01,0x21,0x38,0x1C,0x00,0xF0,0x29,0xF8 + ,0x00,0xF0,0x15,0xF8,0x03,0xB0,0xF0,0xBD,0x00,0x00 + ,0x8C,0x01,0x00,0x02,0x04,0x01,0x00,0x02,0xC8,0x01 + ,0x00,0x02,0x44,0x09,0x00,0x02,0xC0,0x00,0x00,0x02 + ,0xB0,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0xF8,0x06 + ,0x00,0x02,0xD6,0x01,0x00,0x02,0x05,0x48,0x00,0x21 + ,0x41,0x72,0x81,0x72,0x04,0x49,0x05,0x4A,0x89,0x89 + ,0x91,0x87,0x80,0x6B,0x10,0x21,0x01,0x73,0xF7,0x46 + ,0x8C,0x01,0x00,0x02,0xC0,0x00,0x00,0x02,0x44,0x09 + ,0x00,0x02,0x80,0xB4,0x09,0x4A,0x01,0x27,0x53,0x79 + ,0x08,0x4A,0x03,0x2B,0x02,0xD1,0xD7,0x70,0x80,0xBC + ,0xF7,0x46,0x40,0x78,0x40,0x09,0xFA,0xD3,0x00,0x29 + ,0x02,0xD1,0x00,0x20,0xD0,0x70,0xF5,0xE7,0xD7,0x70 + ,0xF3,0xE7,0xB0,0x00,0x00,0x02,0xB4,0x09,0x00,0x02 + ,0x90,0xB5,0xC0,0x20,0x02,0xF0,0xC6,0xFD,0x0A,0x4C + ,0x03,0x21,0xA1,0x73,0x02,0xF0,0xC1,0xFD,0x60,0x7F + ,0x01,0x28,0x0C,0xD0,0xC0,0x20,0x02,0xF0,0xBB,0xFD + ,0x07,0x1C,0xA0,0x7B,0x03,0x28,0x02,0xD1,0x00,0x20 + ,0x00,0xF0,0x86,0xF9,0x38,0x1C,0x02,0xF0,0xB1,0xFD + ,0x90,0xBD,0x44,0x09,0x00,0x02,0x90,0xB5,0xFE,0xF7 + ,0x09,0xFE,0x1E,0x4F,0xF9,0x6A,0x40,0x1A,0x41,0x00 + ,0x78,0x7F,0x49,0x08,0x01,0x28,0x01,0xD1,0xB8,0x6A + ,0x00,0xE0,0x78,0x6A,0x3B,0x68,0x19,0x4A,0x00,0x2B + ,0x1C,0xD1,0x84,0x00,0x93,0x8B,0x24,0x18,0xA4,0x00 + ,0xE2,0x18,0x51,0x1A,0x8A,0x42,0x00,0xD2,0x11,0x1C + ,0x00,0x28,0x0F,0xD1,0x01,0x20,0x78,0x72,0xB8,0x7B + ,0x03,0x28,0x05,0xD1,0x0D,0x29,0x04,0xD9,0xC8,0x1F + ,0x01,0x38,0x00,0xF0,0x58,0xF9,0x90,0xBD,0x00,0x20 + ,0x00,0xF0,0x54,0xF9,0x90,0xBD,0x3B,0x62,0x09,0xE0 + ,0x83,0x00,0xD2,0x8B,0x18,0x18,0x80,0x00,0x80,0x18 + ,0x41,0x1A,0x88,0x42,0x00,0xD2,0x01,0x1C,0x3A,0x62 + ,0x08,0x20,0x00,0xF0,0x6A,0xFB,0x04,0x20,0x78,0x72 + ,0x90,0xBD,0x00,0x00,0x44,0x09,0x00,0x02,0x8C,0x01 + ,0x00,0x02,0x00,0xB5,0x04,0x49,0x02,0x0A,0x8A,0x74 + ,0xC8,0x74,0x03,0x21,0x11,0x20,0xFE,0xF7,0x15,0xFE + ,0x00,0xBD,0xCC,0x07,0x00,0x02,0xB0,0xB5,0x82,0xB0 + ,0x11,0x4D,0x01,0x20,0x68,0x74,0x11,0x4F,0x11,0x48 + ,0x00,0x24,0xBC,0x82,0x38,0x82,0xBC,0x80,0x1E,0x20 + ,0x38,0x80,0x02,0x20,0xB8,0x82,0xC2,0x1E,0x00,0x92 + ,0x01,0x22,0x1A,0x21,0x0C,0x48,0x01,0xAB,0x02,0xF0 + ,0xE5,0xFC,0x6C,0x74,0x3C,0x83,0xBC,0x82,0x01,0x98 + ,0x81,0x08,0x06,0xD3,0x00,0x09,0x02,0xD3,0x82,0x20 + ,0x02,0xB0,0xB0,0xBD,0x20,0x1C,0xFB,0xE7,0x42,0x20 + ,0xF9,0xE7,0x44,0x09,0x00,0x02,0x20,0x00,0x20,0x0F + ,0xA0,0x8C,0x00,0x00,0xD8,0x06,0x00,0x02,0xF0,0xB5 + ,0xFF,0x20,0x01,0x25,0xAD,0x06,0xF5,0x30,0x29,0x69 + ,0x89,0x08,0x03,0xD3,0x01,0x1C,0x01,0x38,0x00,0x29 + ,0xF8,0xD8,0x6A,0x4E,0x00,0x27,0xB0,0x7D,0x6A,0x4C + ,0x00,0x28,0x11,0xD0,0x30,0x6E,0xFF,0xF7,0xB1,0xFF + ,0x60,0x79,0x11,0x23,0x9B,0x02,0x03,0x43,0x03,0x22 + ,0xF1,0x6D,0xB0,0x6D,0x12,0x03,0x00,0xF0,0xD3,0xF8 + ,0xB7,0x75,0x01,0x20,0xFE,0xF7,0x6F,0xFD,0xF0,0xBD + ,0xF0,0x7B,0x00,0x28,0x1A,0xD0,0xA0,0x6B,0x5E,0x49 + ,0x80,0x7D,0x89,0x7A,0x88,0x42,0x00,0xDB,0x08,0x1C + ,0x5C,0x49,0x40,0x00,0x08,0x5A,0xFF,0xF7,0x93,0xFF + ,0x60,0x79,0x11,0x23,0x9B,0x02,0x03,0x43,0x03,0x22 + ,0x12,0x03,0x10,0x21,0x57,0x48,0x00,0xF0,0xB5,0xF8 + ,0x01,0x20,0xFE,0xF7,0x52,0xFD,0xF7,0x73,0xF0,0xBD + ,0xF0,0x7D,0x00,0x28,0xDD,0xD0,0x4E,0x4E,0xF0,0x6E + ,0xFF,0xF7,0x7D,0xFF,0x76,0x6E,0x70,0x78,0xC0,0x09 + ,0x4E,0xD3,0x4A,0x4A,0xD0,0x7A,0x00,0x28,0x00,0xD0 + ,0xD7,0x72,0x07,0x20,0x40,0x06,0x81,0x69,0x08,0x23 + ,0x19,0x43,0x81,0x61,0x81,0x69,0x99,0x43,0x81,0x61 + ,0xE8,0x68,0x00,0xF0,0x8C,0xFF,0x01,0x23,0x9B,0x03 + ,0x9A,0x08,0x1C,0x21,0x44,0x48,0x00,0xF0,0x8D,0xF8 + ,0xFF,0x20,0x43,0x49,0xF5,0x30,0x4A,0x68,0xD2,0x0B + ,0x03,0xD3,0x02,0x1C,0x01,0x38,0x00,0x2A,0xF8,0xD1 + ,0x40,0x48,0x03,0x21,0x00,0x78,0x49,0x06,0x02,0x28 + ,0x02,0xD1,0x81,0x20,0x88,0x60,0x01,0xE0,0x01,0x20 + ,0x88,0x60,0x62,0x7A,0x00,0x2A,0x0F,0xD0,0xA0,0x7A + ,0x00,0x28,0x03,0xD0,0x00,0x28,0x01,0xDD,0x60,0x69 + ,0x01,0xE0,0x60,0x69,0x06,0x38,0xA1,0x89,0x20,0x39 + ,0x02,0x2A,0x08,0xD1,0x2B,0x4A,0xD7,0x75,0x05,0xE0 + ,0x2A,0x4A,0x50,0x6E,0x91,0x6E,0x18,0x30,0x20,0x39 + ,0xD7,0x75,0x62,0x79,0x17,0x23,0x9B,0x02,0x13,0x43 + ,0x01,0x22,0x52,0x03,0x00,0xF0,0x57,0xF8,0x33,0xE0 + ,0x60,0x7A,0x00,0x28,0x23,0xD0,0xA0,0x7A,0x00,0x28 + ,0x01,0xD0,0x18,0x25,0x00,0xE0,0x1E,0x25,0x01,0x23 + ,0x9B,0x03,0x1D,0x48,0x9A,0x08,0x29,0x1C,0x40,0x6E + ,0x00,0xF0,0x45,0xF8,0xFF,0x20,0x1F,0x49,0xF5,0x30 + ,0x4A,0x68,0xD2,0x0B,0x03,0xD3,0x02,0x1C,0x01,0x38 + ,0x00,0x2A,0xF8,0xD1,0x60,0x79,0x11,0x23,0x9B,0x02 + ,0x03,0x43,0xA0,0x89,0x41,0x1B,0x01,0x22,0x52,0x03 + ,0x60,0x69,0x00,0xF0,0x30,0xF8,0x0A,0xE0,0x60,0x79 + ,0x11,0x23,0x9B,0x02,0x03,0x43,0x0D,0x48,0x03,0x22 + ,0x81,0x6E,0x40,0x6E,0x12,0x03,0x00,0xF0,0x24,0xF8 + ,0x09,0x48,0xC7,0x75,0x08,0x48,0x47,0x77,0x50,0x30 + ,0x07,0x71,0x30,0x79,0x40,0x08,0x02,0xD2,0x60,0x7A + ,0x01,0x28,0x03,0xD1,0x01,0x20,0xFE,0xF7,0xB5,0xFC + ,0xF0,0xBD,0x00,0x20,0xFE,0xF7,0xB1,0xFC,0xF0,0xBD + ,0x44,0x09,0x00,0x02,0x8C,0x01,0x00,0x02,0x04,0x01 + ,0x00,0x02,0xB8,0x01,0x00,0x02,0xEC,0x07,0x00,0x02 + ,0x58,0x07,0x00,0x02,0x40,0x00,0x00,0x04,0x58,0x00 + ,0x00,0x02,0xB0,0xB4,0x06,0x4C,0x1F,0x1C,0x65,0x68 + ,0xEB,0x0B,0x04,0xD2,0x0A,0x43,0x21,0x05,0x4A,0x63 + ,0x88,0x63,0x67,0x60,0xB0,0xBC,0xF7,0x46,0x00,0x00 + ,0x40,0x00,0x00,0x04,0xF0,0xB5,0x52,0x49,0x07,0x1C + ,0x8A,0x7A,0x00,0x20,0x00,0x2A,0x61,0xD1,0x0A,0x7A + ,0x00,0x2A,0x6B,0xD0,0x4A,0x7A,0x01,0x2A,0x5B,0xD1 + ,0x0A,0x7B,0x01,0x2A,0x58,0xD1,0xCA,0x7A,0x00,0x2A + ,0x55,0xD1,0xCE,0x1D,0x49,0x36,0xF1,0x78,0xF5,0x1F + ,0x39,0x3D,0x00,0x29,0x0F,0xD1,0x45,0x49,0xCA,0x1D + ,0x69,0x32,0x12,0x78,0x00,0x2A,0x09,0xD1,0x6A,0x7B + ,0x01,0x2A,0x06,0xD0,0x32,0x79,0x00,0x2A,0x03,0xD1 + ,0x0C,0x1C,0x89,0x7C,0x00,0x29,0x09,0xD0,0x3E,0x4A + ,0x3F,0x4B,0xD1,0x79,0xD9,0x71,0x3B,0x49,0x88,0x75 + ,0x01,0x20,0xC8,0x75,0xCC,0x6E,0x21,0xE0,0x21,0x7F + ,0x00,0x29,0x12,0xD0,0x39,0x4B,0x37,0x4A,0x99,0x6B + ,0x89,0x7D,0x92,0x7A,0x91,0x42,0x01,0xDA,0xD9,0x71 + ,0x00,0xE0,0xDA,0x71,0xA0,0x75,0x01,0x21,0xE1,0x73 + ,0xE0,0x75,0xD8,0x79,0x32,0x49,0x40,0x00,0x0C,0x5A + ,0x0B,0xE0,0xE2,0x7E,0x21,0x1C,0x00,0x2A,0x27,0xD0 + ,0xCC,0x6E,0x88,0x75,0x01,0x20,0x2C,0x4B,0xC8,0x75 + ,0x98,0x6B,0x80,0x7D,0xD8,0x71,0x00,0xF0,0x40,0xF9 + ,0x26,0x4B,0xD8,0x7B,0x00,0x28,0x03,0xD0,0x00,0x20 + ,0xFE,0xF7,0x73,0xFC,0x0C,0xE0,0x24,0x4B,0xD8,0x79 + ,0x03,0x28,0x05,0xD1,0x20,0x4B,0x58,0x6B,0xFE,0xF7 + ,0x6A,0xFC,0x03,0xE0,0x3A,0xE0,0x00,0x20,0xFE,0xF7 + ,0x65,0xFC,0x01,0x21,0x89,0x06,0x00,0x2F,0x05,0xD0 + ,0x05,0x2F,0x03,0xD9,0x48,0x6A,0x38,0x18,0x02,0xE0 + ,0x2D,0xE0,0x48,0x6A,0x0A,0x30,0x16,0x4B,0x02,0x22 + ,0x9A,0x73,0x18,0x4B,0x92,0x03,0x5A,0x60,0x08,0x62 + ,0x6A,0x7B,0x01,0x2A,0x02,0xD0,0x32,0x79,0x00,0x2A + ,0x15,0xD0,0x10,0x4A,0x8D,0x6A,0x4E,0x6A,0xD1,0x79 + ,0x13,0x4A,0x12,0x4F,0x89,0x00,0x51,0x58,0x0D,0x4B + ,0x08,0x18,0x38,0x60,0xD8,0x79,0x00,0xF0,0x44,0xFD + ,0x39,0x68,0x40,0x18,0x38,0x60,0xB0,0x42,0x00,0xD2 + ,0x01,0x35,0x7D,0x60,0x38,0x1D,0x06,0x4F,0x3C,0x60 + ,0xF8,0x79,0x00,0xF0,0x37,0xFD,0x39,0x68,0x40,0x18 + ,0x38,0x60,0x01,0x20,0xF0,0xBD,0x44,0x09,0x00,0x02 + ,0x04,0x01,0x00,0x02,0x8C,0x01,0x00,0x02,0xB8,0x01 + ,0x00,0x02,0x40,0x00,0x00,0x04,0x1C,0x08,0x00,0x02 + ,0x1C,0x09,0x00,0x02,0xF8,0xB5,0x38,0x49,0x04,0x1C + ,0x88,0x6B,0x37,0x4A,0x85,0x7D,0x46,0x68,0x92,0x7A + ,0x00,0x27,0x95,0x42,0x00,0xDB,0x15,0x1C,0x34,0x49 + ,0x80,0x8A,0x49,0x89,0x88,0x42,0x2E,0xDD,0x00,0x2C + ,0x2C,0xD1,0x2F,0x49,0x88,0x7A,0x00,0x28,0x28,0xD1 + ,0x30,0x49,0xB4,0x20,0x08,0x70,0x2F,0x48,0x30,0x4A + ,0xC0,0x88,0x41,0x00,0x09,0x18,0x68,0x00,0x10,0x5A + ,0x40,0x00,0x08,0x18,0x2D,0x49,0xC9,0x6E,0x40,0x18 + ,0x28,0x49,0x48,0x80,0x28,0x1C,0x00,0xF0,0xF9,0xFC + ,0x26,0x49,0x49,0x88,0x40,0x18,0x24,0x49,0x48,0x80 + ,0x31,0x1D,0x06,0x22,0x26,0x48,0x02,0xF0,0x29,0xFF + ,0xF1,0x1D,0x03,0x31,0x06,0x22,0x24,0x48,0x02,0xF0 + ,0x23,0xFF,0x01,0x20,0x20,0x49,0x01,0x26,0x08,0x77 + ,0x03,0xE0,0x01,0x20,0x1E,0x49,0x00,0x26,0xC8,0x76 + ,0xFF,0xF7,0x6A,0xFD,0xFF,0xF7,0xD4,0xFD,0x00,0x90 + ,0x00,0x98,0x00,0x28,0x1E,0xD1,0x12,0x49,0x00,0x2E + ,0x8A,0x6B,0x50,0x73,0x01,0xD1,0x00,0x2C,0x01,0xD0 + ,0x01,0x2E,0x19,0xD1,0x13,0x4A,0x68,0x00,0x10,0x5A + ,0x10,0x4A,0xD2,0x88,0x49,0x8C,0x80,0x18,0x41,0x18 + ,0x01,0x20,0x00,0xF0,0x12,0xF9,0x01,0x2E,0x03,0xD1 + ,0x0D,0x49,0x03,0x20,0x48,0x60,0x02,0xE0,0x0B,0x49 + ,0x02,0x20,0x48,0x60,0x01,0x27,0x03,0xE0,0x03,0x49 + ,0x04,0x20,0x89,0x6B,0x48,0x73,0x38,0x1C,0xF8,0xBD + ,0x00,0x00,0x8C,0x01,0x00,0x02,0x04,0x01,0x00,0x02 + ,0xC0,0x00,0x00,0x02,0xEC,0x07,0x00,0x02,0x00,0x00 + ,0x00,0x02,0xB0,0x01,0x00,0x02,0x44,0x09,0x00,0x02 + ,0xF0,0x07,0x00,0x02,0xF6,0x07,0x00,0x02,0x90,0xB5 + ,0x04,0x31,0xCF,0x00,0x01,0x28,0x17,0xD0,0x02,0x28 + ,0x17,0xD0,0x03,0x28,0x27,0xD1,0x0B,0x20,0x39,0x1C + ,0x02,0xF0,0x11,0xFF,0x0C,0x1C,0x79,0x1A,0x0B,0x20 + ,0x02,0xF0,0x0C,0xFF,0x07,0x1C,0x00,0x21,0x00,0x2C + ,0x0F,0x48,0x18,0xD9,0x01,0x37,0x04,0x2C,0x13,0xD2 + ,0x01,0x21,0x41,0x63,0x13,0xE0,0x7F,0x08,0x11,0xE0 + ,0x79,0x00,0x0B,0x20,0x0F,0x1C,0x02,0xF0,0xFA,0xFE + ,0x0C,0x1C,0x79,0x1A,0x0B,0x20,0x02,0xF0,0xF5,0xFE + ,0x07,0x1C,0x00,0x2C,0x04,0xD9,0x01,0x37,0x02,0xE0 + ,0x41,0x63,0x00,0xE0,0x41,0x63,0x38,0x1C,0x90,0xBD + ,0x00,0x00,0x44,0x09,0x00,0x02,0xFF,0x21,0x10,0x48 + ,0x31,0x31,0x01,0x80,0x0F,0x49,0x09,0x8C,0xCA,0x1D + ,0x31,0x32,0x42,0x80,0xCA,0x1D,0x0E,0x32,0x82,0x80 + ,0x0B,0x31,0xC1,0x80,0x0B,0x48,0xA0,0x21,0x01,0x80 + ,0x50,0x21,0x41,0x80,0x1E,0x21,0x81,0x80,0x0F,0x21 + ,0xC1,0x80,0x08,0x48,0xC0,0x21,0x01,0x60,0x60,0x21 + ,0x41,0x60,0x23,0x21,0x81,0x60,0x12,0x21,0xC1,0x60 + ,0xF7,0x46,0x00,0x00,0xB0,0x01,0x00,0x02,0x8C,0x01 + ,0x00,0x02,0xB8,0x01,0x00,0x02,0x1C,0x09,0x00,0x02 + ,0x00,0xB5,0x07,0x48,0xC1,0x79,0x82,0x79,0x91,0x42 + ,0x07,0xD0,0xC1,0x79,0x81,0x71,0x82,0x79,0x04,0x49 + ,0x89,0x5C,0x41,0x71,0xFE,0xF7,0xFA,0xFA,0x00,0xBD + ,0x00,0x00,0x8C,0x01,0x00,0x02,0xC0,0x01,0x00,0x02 + ,0x05,0x48,0x81,0x8F,0x49,0x00,0x01,0x31,0x81,0x87 + ,0x04,0x49,0x82,0x8F,0xC9,0x89,0x8A,0x42,0x00,0xDD + ,0x81,0x87,0xF7,0x46,0x44,0x09,0x00,0x02,0xC0,0x00 + ,0x00,0x02,0x1A,0x49,0x19,0x48,0x89,0x6B,0x1A,0x4B + ,0x89,0x7D,0x42,0x78,0x5B,0x5C,0x00,0x21,0x9A,0x42 + ,0x15,0xDD,0x41,0x70,0x01,0x70,0xC2,0x78,0x01,0x21 + ,0x00,0x2A,0x0D,0xDD,0xC2,0x78,0x04,0x2A,0x0A,0xDA + ,0xC2,0x78,0x01,0x3A,0xC2,0x70,0xC2,0x78,0x00,0x2A + ,0x04,0xD1,0x10,0x4A,0x52,0x7A,0x01,0x2A,0x00,0xD1 + ,0xC1,0x70,0x81,0x70,0xF7,0x46,0x82,0x78,0x00,0x2A + ,0xFB,0xD0,0x02,0x78,0x02,0x2A,0xF8,0xDD,0x41,0x70 + ,0x01,0x70,0xC2,0x78,0x01,0x32,0x12,0x06,0x12,0x0E + ,0xC2,0x70,0x03,0x2A,0xEF,0xDD,0x81,0x70,0x03,0x21 + ,0xC1,0x70,0xF7,0x46,0x00,0x00,0xC8,0x01,0x00,0x02 + ,0x8C,0x01,0x00,0x02,0xD6,0x01,0x00,0x02,0x04,0x01 + ,0x00,0x02,0x00,0xB5,0x02,0xF0,0x97,0xFE,0x02,0x49 + ,0x8A,0x8F,0x10,0x40,0x48,0x62,0x00,0xBD,0x44,0x09 + ,0x00,0x02,0xB0,0xB5,0x01,0x20,0x80,0x06,0x85,0x6A + ,0x41,0x6A,0x0E,0x48,0x00,0x88,0x84,0x02,0x20,0x1C + ,0x02,0xF0,0x49,0xFE,0x0F,0x1C,0x00,0x2D,0x10,0xD9 + ,0x20,0x1C,0x29,0x1C,0x02,0xF0,0x42,0xFE,0x0D,0x1C + ,0x00,0x21,0xC9,0x43,0x20,0x1C,0x02,0xF0,0x3C,0xFE + ,0x48,0x1C,0x45,0x43,0xE9,0x19,0x20,0x1C,0x02,0xF0 + ,0x36,0xFE,0x0F,0x1C,0x38,0x1C,0xB0,0xBD,0x00,0x00 + ,0x80,0x00,0x00,0x02,0x90,0xB5,0x0C,0x1C,0x07,0x1C + ,0x00,0xF0,0x15,0xF8,0x01,0x20,0x80,0x06,0x40,0x6A + ,0x06,0x4B,0x20,0x18,0xB9,0x00,0xC9,0x18,0xC8,0x62 + ,0x01,0x21,0x78,0x1E,0x81,0x40,0x03,0x48,0x82,0x69 + ,0x11,0x43,0x81,0x61,0x90,0xBD,0x00,0x00,0x40,0x00 + ,0x00,0x04,0x80,0x00,0x00,0x04,0x80,0xB4,0x47,0x1E + ,0x01,0x20,0x04,0x49,0xB8,0x40,0x8A,0x69,0xC0,0x43 + ,0x10,0x40,0x88,0x61,0x80,0xBC,0xF7,0x46,0x00,0x00 + ,0x80,0x00,0x00,0x04,0xF0,0xB5,0x84,0xB0,0x0F,0x20 + ,0x00,0x06,0x00,0x88,0xE5,0x4C,0x00,0x27,0x03,0x90 + ,0xE0,0x7C,0x00,0x28,0x04,0xD0,0x03,0x98,0x06,0xF0 + ,0x12,0xF8,0x00,0x28,0x60,0xD1,0x03,0x98,0xE0,0x4B + ,0x18,0x40,0x1C,0xD0,0xDF,0x48,0x00,0x68,0x02,0x90 + ,0x02,0x98,0x80,0x08,0x02,0xD2,0x02,0x98,0x40,0x08 + ,0x13,0xD3,0x01,0x20,0x80,0x06,0x00,0x6B,0x02,0x99 + ,0x40,0x00,0x40,0x08,0xC9,0x08,0x05,0xD3,0xE0,0x62 + ,0x02,0x27,0x07,0x20,0xFF,0xF7,0xC8,0xFF,0x05,0xE0 + ,0x20,0x63,0x01,0x27,0xFA,0x21,0x07,0x20,0xFF,0xF7 + ,0xA7,0xFF,0x03,0x98,0xD1,0x4B,0xCE,0x49,0x18,0x40 + ,0xCD,0x1D,0xCE,0x1D,0x49,0x36,0x09,0x35,0x00,0x28 + ,0x58,0xD0,0xD8,0x04,0xC1,0x6B,0x01,0x91,0x01,0x99 + ,0x89,0x09,0x0D,0xD3,0x00,0x6A,0x40,0x00,0x40,0x08 + ,0x20,0x63,0xA0,0x7A,0x00,0x28,0x01,0xD0,0x00,0xF0 + ,0xDA,0xFA,0xFF,0xF7,0x64,0xFC,0x01,0x27,0x01,0x22 + ,0x62,0x73,0x01,0x98,0x12,0x23,0x18,0x40,0x40,0xD0 + ,0x00,0x20,0x60,0x73,0xA0,0x7A,0x00,0x28,0x19,0xD0 + ,0x01,0x98,0x80,0x08,0x0E,0xD3,0x20,0x6B,0x21,0x6E + ,0x40,0x18,0xE0,0x62,0xBC,0x48,0x00,0x78,0x00,0xF0 + ,0x27,0xFB,0xE1,0x6A,0x40,0x18,0xE0,0x62,0xE0,0x6A + ,0x40,0x00,0x40,0x08,0xE0,0x62,0x01,0x20,0xFE,0xF7 + ,0xD5,0xF9,0x00,0x20,0xA0,0x72,0xA0,0x75,0x0C,0xE0 + ,0x55,0xE1,0xFF,0xF7,0x36,0xFF,0x01,0x98,0x80,0x08 + ,0x06,0xD3,0xB1,0x49,0x20,0x6B,0x09,0x68,0x40,0x18 + ,0x40,0x00,0x40,0x08,0xE0,0x62,0x00,0x2F,0x00,0xD1 + ,0x02,0x27,0x01,0x98,0x40,0x09,0x02,0xD3,0x01,0x20 + ,0xFE,0xF7,0xBB,0xF9,0xA0,0x7B,0x02,0x28,0x09,0xD1 + ,0x00,0x20,0x68,0x73,0x30,0x71,0x00,0xF0,0x41,0xFA + ,0x01,0x99,0xA5,0x48,0x00,0x22,0x01,0xF0,0xF0,0xFF + ,0x03,0x98,0xA4,0x4B,0x18,0x40,0x73,0xD0,0x19,0x05 + ,0xC8,0x68,0x00,0x90,0x00,0x98,0x40,0x09,0x14,0xD3 + ,0xE0,0x7A,0x03,0x28,0x11,0xD1,0x04,0x20,0xE0,0x72 + ,0x00,0x98,0xC9,0x68,0x08,0x43,0x9C,0x49,0x00,0x90 + ,0x08,0x68,0x40,0x68,0x40,0x78,0xC0,0x09,0x05,0xD3 + ,0x00,0x98,0x40,0x08,0x02,0xD2,0x98,0x49,0x00,0x20 + ,0x48,0x71,0x00,0x98,0x80,0x08,0x3F,0xD3,0x07,0x20 + ,0xFF,0xF7,0x39,0xFF,0xB0,0x79,0x01,0x28,0x0E,0xD1 + ,0xE0,0x1D,0x69,0x30,0x81,0x7A,0x01,0x29,0x09,0xD1 + ,0x02,0x21,0x81,0x72,0x90,0x48,0x01,0x8B,0xC0,0x8A + ,0x08,0x1A,0x81,0x02,0x04,0x20,0xFF,0xF7,0x0D,0xFF + ,0x60,0x7A,0x06,0x28,0x04,0xD1,0x02,0x21,0x61,0x72 + ,0x08,0x20,0xFF,0xF7,0x1F,0xFF,0x00,0x20,0x86,0x49 + ,0x01,0x22,0xC8,0x80,0x22,0x73,0xE0,0x72,0xA0,0x72 + ,0xA0,0x75,0x20,0x74,0x08,0x71,0x4A,0x71,0xFE,0xF7 + ,0xB6,0xFB,0x00,0x99,0x08,0x43,0x00,0x90,0x60,0x68 + ,0x04,0x28,0x0F,0xD1,0x01,0x20,0xFF,0xF7,0x09,0xFF + ,0x20,0x7B,0x01,0x28,0x09,0xD1,0xE0,0x7A,0x00,0x28 + ,0x06,0xD1,0xFE,0xF7,0x2B,0xFE,0x00,0x22,0x10,0x21 + ,0x79,0x48,0x01,0xF0,0x8E,0xFF,0x00,0x98,0x80,0x09 + ,0x60,0xD3,0x01,0x20,0x20,0x73,0x20,0x74,0x71,0x49 + ,0x87,0x06,0xF8,0x6A,0x09,0x68,0x48,0x61,0xF8,0x6A + ,0x40,0x00,0x40,0x08,0xE0,0x62,0x60,0x7A,0x05,0x28 + ,0x0C,0xD1,0xA0,0x6B,0x79,0x6A,0x88,0x42,0x00,0xE0 + ,0xB1,0xE0,0x06,0xD2,0x02,0x21,0x6C,0x48,0x61,0x72 + ,0x81,0x69,0x80,0x23,0x99,0x43,0x81,0x61,0x00,0x98 + ,0xC0,0x08,0x0E,0xD3,0x64,0x48,0x01,0x21,0x01,0x71 + ,0xC1,0x88,0x00,0x29,0x33,0xDD,0xC1,0x88,0x01,0x23 + ,0xDB,0x03,0x99,0x42,0x2E,0xDA,0xC0,0x88,0xFF,0xF7 + ,0x92,0xF8,0x2A,0xE0,0x5D,0x49,0x00,0x20,0x08,0x71 + ,0xA0,0x72,0xC1,0x20,0x20,0x60,0x01,0x20,0xFE,0xF7 + ,0x12,0xF9,0x20,0x7E,0x01,0x28,0x14,0xD1,0x61,0x7E + ,0x00,0x29,0x00,0xD0,0x00,0x20,0x60,0x76,0x58,0x48 + ,0xC1,0x78,0x89,0x06,0x89,0x0E,0xC1,0x70,0x61,0x7E + ,0x01,0x29,0x03,0xD1,0xC1,0x78,0x40,0x23,0x19,0x43 + ,0xC1,0x70,0xC1,0x78,0x03,0x20,0xFE,0xF7,0x84,0xF9 + ,0x60,0x68,0x04,0x28,0x06,0xD1,0xFE,0xF7,0xCF,0xFD + ,0x00,0x22,0x10,0x21,0x4B,0x48,0x01,0xF0,0x32,0xFF + ,0x40,0x48,0x00,0x68,0x02,0x90,0x02,0x98,0xC0,0x08 + ,0x02,0xD3,0x02,0x27,0x09,0xE0,0x30,0xE0,0x38,0x6B + ,0x40,0x00,0x40,0x08,0x20,0x63,0x01,0x27,0xFA,0x21 + ,0x07,0x20,0xFF,0xF7,0x74,0xFE,0xA0,0x7E,0x00,0x28 + ,0x22,0xD0,0x3D,0x48,0x00,0x79,0x00,0x28,0x1E,0xD0 + ,0x20,0x7C,0x00,0x28,0x1B,0xD0,0x20,0x68,0x00,0x28 + ,0x18,0xD1,0x06,0x20,0xFF,0xF7,0x7E,0xFE,0x00,0x20 + ,0xE8,0x73,0xA0,0x76,0x70,0x70,0x69,0x7B,0x01,0x29 + ,0x02,0xD0,0x69,0x7B,0x03,0x29,0x0B,0xD1,0x69,0x7B + ,0x01,0x29,0x07,0xD1,0xA1,0x73,0x68,0x73,0x00,0x22 + ,0x10,0x21,0x2B,0x48,0x01,0xF0,0xFC,0xFE,0x00,0xE0 + ,0x68,0x73,0x00,0x20,0xA0,0x76,0xE0,0x7A,0x04,0x28 + ,0x2F,0xD1,0x20,0x7C,0x00,0x28,0x2C,0xD0,0x60,0x7B + ,0x00,0x28,0x02,0xD1,0x00,0x2F,0x00,0xD1,0x02,0x27 + ,0x00,0x20,0xE0,0x72,0x23,0x4D,0x20,0x74,0x29,0x79 + ,0x01,0x29,0x15,0xD1,0x21,0x68,0x00,0x29,0x12,0xD1 + ,0x69,0x79,0x00,0x29,0x0F,0xD0,0x1D,0x49,0x09,0x68 + ,0x48,0x72,0xA9,0x68,0xE9,0x60,0x28,0x70,0xFE,0xF7 + ,0x17,0xFA,0x28,0x78,0x01,0x28,0x04,0xD1,0x00,0x22 + ,0x01,0x21,0x19,0x48,0x01,0xF0,0xCF,0xFE,0x60,0x68 + ,0x04,0x28,0x06,0xD1,0xFE,0xF7,0x62,0xFD,0x00,0x22 + ,0x10,0x21,0x14,0x48,0x01,0xF0,0xC5,0xFE,0x01,0x2F + ,0x02,0xD1,0x00,0xF0,0x19,0xF9,0x03,0xE0,0x02,0x2F + ,0x01,0xD1,0x00,0xF0,0x44,0xF9,0x03,0x98,0x11,0x4B + ,0x18,0x40,0x01,0xD0,0x01,0xF0,0xE0,0xF8,0x04,0xB0 + ,0xF0,0xBD,0x44,0x09,0x00,0x02,0x20,0x20,0x00,0x00 + ,0x40,0x00,0x00,0x04,0x80,0x80,0x00,0x00,0x93,0x01 + ,0x00,0x02,0x8C,0x01,0x00,0x02,0xD8,0x06,0x00,0x02 + ,0x40,0x40,0x00,0x00,0x48,0x01,0x00,0x02,0xDC,0x01 + ,0x00,0x02,0xC0,0x00,0x00,0x02,0x38,0x07,0x00,0x02 + ,0x80,0x00,0x00,0x04,0xCC,0x07,0x00,0x02,0x08,0x08 + ,0x00,0x00,0xF0,0xB5,0x0F,0x20,0x00,0x06,0x05,0x89 + ,0x63,0x48,0x64,0x4E,0x28,0x40,0x01,0x24,0x00,0x28 + ,0x6E,0xD0,0x62,0x49,0xCF,0x69,0x78,0x08,0x3E,0xD3 + ,0x88,0x69,0x40,0x08,0x3B,0xD3,0x88,0x69,0xA0,0x43 + ,0x88,0x61,0x5E,0x48,0x41,0x68,0x04,0x29,0x0A,0xD1 + ,0xFE,0xF7,0x14,0xFD,0x01,0x20,0xFE,0xF7,0x37,0xF8 + ,0x00,0x22,0x10,0x21,0x5A,0x48,0x01,0xF0,0x74,0xFE + ,0x29,0xE0,0x42,0x68,0x58,0x49,0x02,0x2A,0x05,0xD1 + ,0x09,0x68,0x4C,0x73,0x57,0x49,0x09,0x68,0x4C,0x70 + ,0x05,0xE0,0x42,0x68,0x03,0x2A,0x02,0xD1,0x09,0x68 + ,0x02,0x22,0x4A,0x73,0x4F,0x48,0x44,0x60,0x00,0xF0 + ,0xAB,0xF8,0x01,0x20,0xFE,0xF7,0x1A,0xF8,0x4B,0x48 + ,0x40,0x7C,0x01,0x28,0x05,0xD1,0x00,0x22,0x10,0x21 + ,0x30,0x1C,0x01,0xF0,0x53,0xFE,0x08,0xE0,0x46,0x48 + ,0x40,0x7C,0x02,0x28,0x04,0xD1,0x00,0x22,0x10,0x21 + ,0x47,0x48,0x01,0xF0,0x49,0xFE,0x41,0x48,0x80,0x69 + ,0xC0,0x09,0x03,0xD3,0xF8,0x09,0x01,0xD3,0x07,0xF0 + ,0x0F,0xFB,0x3D,0x48,0x80,0x69,0x00,0x0A,0x32,0xD3 + ,0x38,0x0A,0x30,0xD3,0x3A,0x48,0x80,0x23,0x81,0x69 + ,0x99,0x43,0x81,0x61,0x38,0x48,0x41,0x7A,0x05,0x29 + ,0x02,0xD0,0x41,0x7A,0x06,0x29,0x15,0xD1,0x00,0x21 + ,0x81,0x63,0x01,0x7A,0x01,0x29,0x0D,0xD1,0x44,0x72 + ,0x81,0x7A,0x00,0x29,0x1B,0xD1,0x01,0x7B,0x01,0x29 + ,0x18,0xD1,0xC0,0x7A,0x00,0x28,0x15,0xD1,0xFF,0xF7 + ,0xCC,0xF9,0x12,0xE0,0x3A,0xE0,0x02,0x22,0x42,0x72 + ,0x0E,0xE0,0x44,0x72,0x41,0x7F,0x01,0x29,0x02,0xD1 + ,0x00,0x21,0x81,0x62,0x01,0xE0,0x00,0x21,0x41,0x62 + ,0x80,0x7B,0x03,0x28,0x02,0xD1,0x00,0x20,0xFF,0xF7 + ,0x38,0xFB,0x38,0x09,0x05,0xD3,0x20,0x48,0x80,0x69 + ,0x00,0x09,0x01,0xD3,0x04,0xF0,0x4E,0xFA,0xB8,0x08 + ,0x16,0xD3,0x1C,0x48,0x81,0x69,0x89,0x08,0x12,0xD3 + ,0x81,0x69,0x02,0x23,0x99,0x43,0x81,0x61,0x19,0x48 + ,0xC1,0x1D,0x49,0x31,0x89,0x79,0x05,0x29,0x08,0xD1 + ,0x1B,0x49,0x49,0x79,0x03,0x29,0x04,0xD1,0x70,0x30 + ,0x81,0x78,0x08,0x23,0x19,0x43,0x81,0x70,0xB8,0x09 + ,0x05,0xD3,0x10,0x48,0x80,0x69,0x80,0x09,0x01,0xD3 + ,0x07,0xF0,0x57,0xFA,0x14,0x48,0x28,0x40,0x06,0xD0 + ,0x13,0x48,0x00,0x21,0x04,0x70,0x79,0x20,0x40,0x05 + ,0x01,0x83,0x81,0x82,0xFF,0x20,0x02,0x30,0x28,0x40 + ,0x06,0xD0,0x07,0xF0,0x8B,0xFA,0x00,0x22,0x10,0x21 + ,0x30,0x1C,0x01,0xF0,0xCC,0xFD,0xF0,0xBD,0x00,0x00 + ,0x10,0x10,0x00,0x00,0xD8,0x06,0x00,0x02,0x80,0x00 + ,0x00,0x04,0x44,0x09,0x00,0x02,0x38,0x07,0x00,0x02 + ,0xC4,0x01,0x00,0x02,0xD0,0x01,0x00,0x02,0xF8,0x06 + ,0x00,0x02,0xB0,0x00,0x00,0x02,0x02,0x02,0x00,0x00 + ,0xD4,0x01,0x00,0x02,0x04,0x48,0x01,0x21,0x81,0x73 + ,0x00,0x21,0xC1,0x75,0xC1,0x73,0xC1,0x76,0x01,0x77 + ,0xF7,0x46,0x00,0x00,0x44,0x09,0x00,0x02,0x80,0xB5 + ,0x16,0x4F,0x00,0x20,0x38,0x72,0x79,0x7A,0x02,0x20 + ,0x01,0x29,0x1C,0xD0,0x04,0x29,0x19,0xD1,0x78,0x72 + ,0x08,0x20,0xFF,0xF7,0x08,0xFD,0x38,0x6B,0xF9,0x6A + ,0x40,0x1A,0x40,0x00,0x39,0x6A,0x40,0x08,0x81,0x42 + ,0x0D,0xD2,0x39,0x6A,0x41,0x1A,0x14,0x20,0x02,0xF0 + ,0x11,0xFB,0x79,0x7F,0x01,0x29,0x08,0xD1,0xB9,0x6A + ,0x81,0x42,0x02,0xD3,0xB9,0x6A,0x08,0x1A,0xB8,0x62 + ,0x80,0xBD,0x78,0x72,0x80,0xBD,0x79,0x6A,0x81,0x42 + ,0xF9,0xD3,0x79,0x6A,0x08,0x1A,0x78,0x62,0x80,0xBD + ,0x44,0x09,0x00,0x02,0x00,0xB5,0x0A,0x48,0x01,0x21 + ,0x01,0x72,0x01,0x7B,0x01,0x29,0x0D,0xD1,0xC1,0x7A + ,0x00,0x29,0x0A,0xD1,0x81,0x7A,0x00,0x29,0x07,0xD1 + ,0x41,0x7A,0x06,0x29,0x04,0xD0,0x40,0x7A,0x05,0x28 + ,0x01,0xD0,0xFF,0xF7,0x11,0xF9,0x00,0xBD,0x44,0x09 + ,0x00,0x02,0xB0,0xB5,0x20,0x4F,0x20,0x48,0x79,0x7D + ,0x80,0x7A,0x20,0x4C,0x81,0x42,0x02,0xDA,0x78,0x7D + ,0x20,0x70,0x00,0xE0,0x20,0x70,0xFF,0xF7,0x18,0xFC + ,0x20,0x78,0x03,0x28,0x03,0xD1,0x01,0x20,0xFD,0xF7 + ,0x4C,0xFF,0x02,0xE0,0x00,0x20,0xFD,0xF7,0x48,0xFF + ,0xB8,0x7A,0x17,0x4D,0x02,0x28,0x02,0xD1,0xC4,0x20 + ,0x28,0x70,0x04,0xE0,0xB8,0x7A,0x01,0x28,0x01,0xD1 + ,0xD4,0x20,0x28,0x70,0x00,0x20,0x68,0x70,0x69,0x88 + ,0x11,0x48,0x00,0x29,0x07,0xD0,0x23,0x78,0x10,0x4A + ,0x5B,0x00,0xC3,0x5A,0xD2,0x88,0xD2,0x18,0x89,0x1A + ,0x69,0x80,0x0A,0x21,0xF9,0x65,0x21,0x78,0x49,0x00 + ,0x40,0x5A,0x38,0x66,0x20,0x78,0x00,0xF0,0x2B,0xF8 + ,0x39,0x6E,0x08,0x1A,0x38,0x66,0xBD,0x65,0x01,0x20 + ,0xB8,0x75,0xB0,0xBD,0x44,0x09,0x00,0x02,0x04,0x01 + ,0x00,0x02,0x93,0x01,0x00,0x02,0x2C,0x09,0x00,0x02 + ,0xB0,0x01,0x00,0x02,0x00,0x00,0x00,0x02,0xB0,0xB4 + ,0x0A,0x4B,0x00,0x24,0x99,0x42,0x01,0xD8,0x00,0x29 + ,0x02,0xD1,0x20,0x1C,0xB0,0xBC,0xF7,0x46,0x01,0x27 + ,0xBF,0x06,0x3D,0x69,0xAB,0x08,0x01,0xD3,0x20,0x1C + ,0xF6,0xE7,0x03,0xC7,0x08,0x3F,0x3A,0x61,0x01,0x20 + ,0xF1,0xE7,0x0E,0x06,0x00,0x00,0x00,0x28,0x01,0xD1 + ,0xC0,0x20,0xF7,0x46,0x01,0x48,0x00,0x88,0xF7,0x46 + ,0x00,0x00,0xAC,0x01,0x00,0x02,0xF8,0xB5,0x3D,0x48 + ,0x00,0x90,0x3D,0x48,0xC4,0x1D,0x49,0x34,0xC7,0x1D + ,0x09,0x37,0x3B,0x4D,0x3C,0x4E,0x00,0xF0,0xFA,0xFC + ,0x00,0xF0,0xEA,0xF8,0x30,0x78,0x00,0x28,0x04,0xD1 + ,0xA0,0x79,0x05,0x28,0x01,0xD0,0x06,0xF0,0xEE,0xFC + ,0x28,0x78,0x00,0x28,0xF0,0xD0,0xB8,0x7B,0x00,0x28 + ,0xED,0xD1,0x33,0x48,0x01,0x78,0x01,0x29,0x03,0xD1 + ,0x00,0x21,0x01,0x70,0x04,0xF0,0xE0,0xF9,0x30,0x48 + ,0x00,0x78,0x02,0x28,0x46,0xD0,0x2F,0x48,0x00,0x78 + ,0x02,0x28,0x01,0xD1,0x06,0xF0,0x0C,0xFD,0x06,0xF0 + ,0x2E,0xFE,0x28,0x4E,0x05,0x1C,0x30,0x78,0x01,0x28 + ,0x09,0xD1,0x03,0x03,0x9D,0x42,0x03,0xD1,0x28,0x49 + ,0x10,0x20,0x09,0x68,0x08,0x73,0x00,0x21,0xB9,0x73 + ,0xC8,0xE7,0x00,0x2D,0x23,0xD0,0x01,0x23,0x1B,0x03 + ,0x9D,0x42,0x08,0xD0,0x23,0x48,0x80,0x21,0x02,0x68 + ,0x11,0x70,0x02,0x68,0x00,0x21,0x51,0x70,0x00,0x68 + ,0x81,0x70,0xA0,0x79,0x05,0x28,0x0D,0xD1,0x00,0x98 + ,0x40,0x79,0x01,0x28,0x09,0xDD,0xC0,0x20,0x01,0xF0 + ,0xF4,0xFD,0x06,0x1C,0x28,0x1C,0x06,0xF0,0x0A,0xFD + ,0x30,0x1C,0x01,0xF0,0xED,0xFD,0x29,0x1C,0x00,0x22 + ,0x16,0x48,0x01,0xF0,0x8C,0xFC,0xA2,0xE7,0x00,0x98 + ,0x40,0x79,0x01,0x28,0x9E,0xDD,0xA0,0x79,0x05,0x28 + ,0x9B,0xD1,0x00,0xF0,0x22,0xF8,0x98,0xE7,0x06,0xF0 + ,0xED,0xFD,0x01,0x23,0x1B,0x03,0x98,0x42,0x03,0xD1 + ,0x0A,0x49,0x10,0x20,0x09,0x68,0x08,0x73,0x00,0x21 + ,0xB9,0x73,0x8B,0xE7,0xB0,0x00,0x00,0x02,0x44,0x09 + ,0x00,0x02,0x5E,0x02,0x00,0x02,0xB3,0x02,0x00,0x02 + ,0xD5,0x01,0x00,0x02,0x53,0x02,0x00,0x02,0x3C,0x01 + ,0x00,0x02,0xC4,0x01,0x00,0x02,0xD0,0x01,0x00,0x02 + ,0x18,0x07,0x00,0x02,0x80,0xB5,0xC0,0x20,0x01,0xF0 + ,0xB8,0xFD,0x07,0x1C,0x0D,0x48,0x81,0x78,0x49,0x08 + ,0x89,0x07,0x11,0xD1,0x81,0x78,0x09,0x09,0x0E,0xD3 + ,0x0A,0x49,0x09,0x68,0x09,0x7B,0x09,0x0A,0x09,0xD2 + ,0xC1,0x78,0x00,0x29,0x04,0xD0,0x00,0x21,0xC1,0x70 + ,0x01,0x21,0x81,0x71,0x01,0xE0,0x06,0xF0,0xE8,0xFC + ,0x38,0x1C,0x01,0xF0,0x9D,0xFD,0x80,0xBD,0xB4,0x09 + ,0x00,0x02,0xC4,0x01,0x00,0x02,0xB0,0xB5,0x1C,0x4C + ,0x01,0x20,0x1C,0x4D,0xA0,0x77,0x28,0x68,0x00,0xF0 + ,0xBE,0xFE,0x29,0x68,0x00,0x20,0x4F,0x68,0x88,0x73 + ,0x18,0x49,0x8A,0x78,0x00,0x2A,0x00,0xD1,0x48,0x70 + ,0x38,0x78,0x08,0x28,0x19,0xD1,0x20,0x7D,0x01,0x28 + ,0x06,0xD1,0x06,0x22,0xF8,0x1D,0x09,0x30,0x12,0x49 + ,0x02,0xF0,0x5F,0xF9,0x0F,0xE0,0x20,0x7D,0x02,0x28 + ,0x0C,0xD1,0x10,0x48,0x40,0x79,0x02,0x28,0x08,0xD1 + ,0xE0,0x1D,0x49,0x30,0x80,0x79,0x05,0x28,0x03,0xD1 + ,0x78,0x78,0x10,0x23,0x18,0x43,0x78,0x70,0xF8,0x1D + ,0x0F,0x30,0xFD,0xF7,0x22,0xFF,0x38,0x1C,0x06,0xF0 + ,0x27,0xFA,0x29,0x68,0x80,0x20,0x08,0x73,0x40,0x01 + ,0xB0,0xBD,0x44,0x09,0x00,0x02,0xC4,0x01,0x00,0x02 + ,0xC8,0x01,0x00,0x02,0xFC,0x00,0x00,0x02,0xB0,0x00 + ,0x00,0x02,0x00,0xB5,0x05,0x48,0x01,0x78,0x00,0x29 + ,0x04,0xD0,0x40,0x78,0x00,0x28,0x01,0xD1,0x04,0xF0 + ,0xD6,0xF8,0x00,0xBD,0x00,0x00,0xC4,0x09,0x00,0x02 + ,0xF0,0xB5,0x2E,0x48,0x47,0x6E,0xFD,0xF7,0x9F,0xFD + ,0x01,0x02,0x2C,0x4C,0x09,0x0A,0x2C,0x48,0x21,0x60 + ,0x43,0x78,0x2C,0x4A,0x13,0x70,0x15,0x78,0x0D,0x23 + ,0x6B,0x43,0x1B,0x18,0x1B,0x7B,0x1B,0x06,0x0B,0x43 + ,0x03,0x21,0x49,0x06,0x0B,0x60,0x15,0x78,0x0D,0x23 + ,0x6B,0x43,0x1B,0x18,0x9E,0x7B,0x5D,0x7B,0x36,0x02 + ,0x35,0x43,0xDE,0x7B,0x1B,0x7C,0x36,0x04,0x35,0x43 + ,0x1B,0x06,0x2B,0x43,0x4B,0x60,0xC3,0x1D,0x39,0x33 + ,0x1B,0x78,0x02,0x2B,0x1D,0xD1,0x15,0x78,0x0D,0x23 + ,0x6B,0x43,0x1B,0x18,0x9E,0x7C,0x5D,0x7C,0x36,0x02 + ,0x35,0x43,0xDE,0x7C,0x1B,0x7D,0x36,0x04,0x35,0x43 + ,0x1B,0x06,0x2B,0x43,0x4B,0x61,0x15,0x78,0x0D,0x23 + ,0x6B,0x43,0x18,0x18,0x85,0x7D,0x43,0x7D,0x2D,0x02 + ,0x2B,0x43,0xC5,0x7D,0x00,0x7E,0x2D,0x04,0x2B,0x43 + ,0x00,0x06,0x18,0x43,0x88,0x61,0x10,0x78,0x21,0x68 + ,0x0D,0x4A,0x80,0x07,0x01,0x43,0x21,0x60,0x00,0x20 + ,0x3B,0x5C,0x13,0x54,0x01,0x30,0x18,0x28,0xFA,0xD3 + ,0x11,0x76,0x08,0x0A,0x50,0x76,0x08,0x0C,0x90,0x76 + ,0x08,0x0E,0xD0,0x76,0xF0,0xBD,0x00,0x00,0x44,0x09 + ,0x00,0x02,0xEC,0x01,0x00,0x02,0x18,0x00,0x00,0x02 + ,0x90,0x01,0x00,0x02,0x58,0x07,0x00,0x02,0x80,0xB4 + ,0x11,0x4A,0x11,0x88,0x01,0x31,0x09,0x04,0x09,0x0C + ,0x1E,0x29,0x00,0xD1,0x00,0x21,0x0E,0x4F,0x0E,0x4B + ,0x4F,0x43,0xFB,0x18,0x1F,0x7B,0x00,0x2F,0x11,0xD1 + ,0x11,0x80,0x0C,0x49,0x03,0x22,0x19,0x60,0xD9,0x1D + ,0x15,0x31,0x59,0x60,0x08,0x39,0x99,0x60,0x00,0x21 + ,0x19,0x73,0x99,0x73,0x9A,0x75,0x99,0x82,0x03,0x60 + ,0x40,0x21,0x01,0x73,0x18,0x1C,0x80,0xBC,0xF7,0x46 + ,0xF0,0x01,0x00,0x02,0xA4,0x06,0x00,0x00,0x00,0x11 + ,0x00,0x02,0x00,0x00,0x00,0x80,0x80,0xB4,0x13,0x4A + ,0x51,0x88,0x01,0x31,0x09,0x04,0x09,0x0C,0x14,0x29 + ,0x00,0xD1,0x00,0x21,0x10,0x4F,0x10,0x4B,0x4F,0x43 + ,0xFB,0x18,0x1F,0x7A,0x00,0x2F,0x15,0xD1,0x51,0x80 + ,0x0E,0x49,0x01,0x22,0x19,0x60,0xD9,0x1D,0x11,0x31 + ,0x59,0x60,0x9A,0x81,0x00,0x21,0x19,0x72,0x0A,0x4F + ,0xD9,0x73,0xBF,0x79,0x01,0x2F,0x01,0xD1,0xC2,0x73 + ,0x00,0xE0,0xC1,0x73,0x80,0x21,0x03,0x60,0x01,0x72 + ,0x18,0x1C,0x80,0xBC,0xF7,0x46,0xF0,0x01,0x00,0x02 + ,0xA4,0x06,0x00,0x00,0x00,0xDA,0x00,0x02,0x00,0x00 + ,0x00,0x80,0xB0,0x00,0x00,0x02,0x01,0x1C,0x00,0x68 + ,0x02,0x08,0x01,0xD3,0x08,0x1C,0xF7,0x46,0x00,0x22 + ,0x0A,0x73,0xF7,0x46,0x01,0x68,0x09,0x08,0x02,0xD3 + ,0x40,0x21,0x01,0x72,0xF7,0x46,0x04,0x4A,0x01,0x68 + ,0x12,0x78,0x00,0x2A,0xF9,0xD1,0x02,0x72,0x08,0x1C + ,0xF7,0x46,0x00,0x00,0x4B,0x02,0x00,0x02,0x0A,0x49 + ,0x01,0x20,0x48,0x63,0x00,0x20,0xCA,0x1D,0x39,0x32 + ,0x88,0x63,0x50,0x83,0x10,0x83,0x08,0x65,0xCB,0x1D + ,0x49,0x33,0x90,0x82,0x18,0x73,0x98,0x71,0x58,0x73 + ,0x90,0x81,0xD0,0x81,0x60,0x31,0xC8,0x72,0xF7,0x46 + ,0x00,0x00,0xF4,0x01,0x00,0x02,0x80,0xB5,0x07,0x27 + ,0x7F,0x06,0xF8,0x69,0x40,0x23,0x18,0x43,0xF8,0x61 + ,0x14,0x48,0xFD,0xF7,0x8E,0xFC,0xF8,0x69,0x20,0x23 + ,0x18,0x43,0xF8,0x61,0xF8,0x69,0x1B,0x01,0x18,0x43 + ,0xF8,0x61,0x00,0x20,0xFF,0x21,0x91,0x31,0x01,0x30 + ,0x88,0x42,0xFC,0xD3,0xF8,0x69,0x0C,0x4B,0x18,0x40 + ,0xF8,0x61,0x00,0x20,0x7D,0x21,0x49,0x01,0x01,0x30 + ,0x88,0x42,0xFC,0xD3,0xFF,0xF7,0xC4,0xFF,0xFD,0xF7 + ,0x7A,0xFC,0x00,0xF0,0x0E,0xF8,0x05,0x49,0x0D,0x20 + ,0x00,0x06,0x01,0x81,0xFF,0x21,0x41,0x31,0x81,0x80 + ,0x80,0xBD,0x50,0xC3,0x00,0x00,0xFF,0xFD,0x00,0x00 + ,0xFF,0x0F,0x00,0x00,0x90,0xB4,0x0E,0x48,0x00,0x21 + ,0x01,0x70,0x0D,0x48,0x80,0x27,0x07,0x73,0x01,0x23 + ,0x03,0x72,0x82,0x22,0x02,0x71,0x07,0x22,0x02,0x70 + ,0x0A,0x48,0x05,0x24,0x04,0x73,0x86,0x24,0x04,0x72 + ,0x02,0x71,0x08,0x48,0x24,0x22,0x02,0x71,0x07,0x72 + ,0x03,0x73,0x06,0x48,0x01,0x71,0x01,0x73,0x90,0xBC + ,0xF7,0x46,0x00,0x00,0x10,0x00,0x00,0x0D,0xB0,0x03 + ,0x00,0x0D,0xA0,0x03,0x00,0x0D,0xC0,0x03,0x00,0x0D + ,0xE0,0x03,0x00,0x0D,0xF0,0xB5,0x25,0x48,0x01,0x27 + ,0x00,0x7B,0x24,0x4C,0x0A,0x28,0x1F,0xD1,0x24,0x49 + ,0x24,0x4E,0x00,0x20,0x0B,0x7B,0x02,0x1C,0x01,0x30 + ,0x08,0x28,0xB3,0x54,0xF9,0xD1,0xF1,0x78,0xB0,0x78 + ,0xF2,0x79,0x09,0x02,0x08,0x43,0x05,0x1C,0x71,0x79 + ,0x30,0x79,0x09,0x02,0x01,0x43,0xB0,0x79,0x12,0x02 + ,0x02,0x43,0x30,0x78,0x73,0x78,0x00,0x02,0x18,0x43 + ,0x05,0x28,0x08,0xD1,0x28,0x1C,0x00,0xF0,0x7E,0xFB + ,0x21,0xE0,0x16,0x49,0x00,0x20,0x08,0x73,0x27,0x71 + ,0xF0,0xBD,0x09,0x28,0x03,0xD1,0x28,0x1C,0x00,0xF0 + ,0x97,0xFB,0x16,0xE0,0x11,0x4B,0x98,0x42,0x04,0xD1 + ,0xF1,0x78,0x10,0x1C,0x00,0xF0,0xC7,0xFB,0x0E,0xE0 + ,0x0E,0x4B,0x9B,0x7A,0x00,0x2B,0x05,0xD1,0x13,0x1C + ,0x0A,0x1C,0x29,0x1C,0x00,0xF0,0x17,0xF8,0x04,0xE0 + ,0x13,0x1C,0x0A,0x1C,0x29,0x1C,0x04,0xF0,0x89,0xFC + ,0x27,0x71,0xF0,0xBD,0x00,0x00,0xF0,0x02,0x00,0x0D + ,0xD0,0x03,0x00,0x0D,0x30,0x03,0x00,0x0D,0x30,0x02 + ,0x00,0x02,0x70,0x03,0x00,0x0D,0x06,0x80,0x00,0x00 + ,0x54,0x02,0x00,0x02,0x80,0xB5,0x0F,0x1C,0x11,0x1C + ,0x1A,0x1C,0x08,0x4B,0x98,0x42,0x03,0xD1,0x38,0x1C + ,0x00,0xF0,0x12,0xF8,0x80,0xBD,0x06,0x4B,0x98,0x42 + ,0x03,0xD1,0x38,0x1C,0x00,0xF0,0x2B,0xF8,0x80,0xBD + ,0x03,0x49,0x20,0x20,0x08,0x73,0x80,0xBD,0x33,0xC1 + ,0x00,0x00,0x0E,0x40,0x00,0x00,0x70,0x03,0x00,0x0D + ,0x0B,0x49,0x0C,0x48,0x4A,0x6B,0x03,0x2A,0x03,0xD1 + ,0x0B,0x4A,0x92,0x78,0x01,0x2A,0x02,0xD0,0x20,0x21 + ,0x01,0x73,0xF7,0x46,0x80,0x22,0x02,0x73,0x50,0x31 + ,0xC9,0x7B,0x06,0x4A,0x10,0x23,0x11,0x73,0x01,0x7B + ,0x19,0x43,0x01,0x73,0xF7,0x46,0x00,0x00,0xF4,0x01 + ,0x00,0x02,0x70,0x03,0x00,0x0D,0x30,0x02,0x00,0x02 + ,0x30,0x03,0x00,0x0D,0xF0,0xB5,0x13,0x4D,0x17,0x1C + ,0xA8,0x78,0x12,0x4A,0x02,0x28,0x06,0xD1,0xE8,0x78 + ,0x08,0x28,0x03,0xD1,0x10,0x48,0x43,0x6B,0x03,0x2B + ,0x02,0xD0,0x20,0x20,0x10,0x73,0xF0,0xBD,0x00,0x26 + ,0x00,0x2F,0x0D,0x4C,0x04,0xD1,0x00,0xF0,0x03,0xFC + ,0x01,0x20,0xA0,0x72,0x04,0xE0,0x00,0x29,0x01,0xD1 + ,0x09,0x49,0x41,0x66,0x16,0x73,0x27,0x80,0x29,0x1C + ,0x08,0x22,0x66,0x80,0x07,0x48,0x01,0xF0,0x18,0xFF + ,0x26,0x73,0xF0,0xBD,0x30,0x02,0x00,0x02,0x70,0x03 + ,0x00,0x0D,0xF4,0x01,0x00,0x02,0x54,0x02,0x00,0x02 + ,0x00,0x60,0x00,0x01,0x38,0x02,0x00,0x02,0x90,0xB5 + ,0x17,0x49,0x08,0x78,0x4A,0x78,0x00,0x02,0x10,0x43 + ,0x05,0x28,0x15,0x4A,0x04,0xD1,0x89,0x78,0x50,0x6B + ,0x00,0xF0,0x59,0xFB,0x90,0xBD,0x13,0x4B,0x01,0x27 + ,0x98,0x42,0x11,0x4C,0x04,0xD1,0xC8,0x78,0x00,0xF0 + ,0x28,0xFA,0x27,0x71,0x90,0xBD,0x09,0x28,0x0A,0xD1 + ,0x0E,0x49,0x20,0x20,0x08,0x73,0x27,0x71,0x50,0x6B + ,0x03,0x28,0xEB,0xD1,0xD0,0x1D,0x49,0x30,0x47,0x73 + ,0x90,0xBD,0xD1,0x1D,0x59,0x31,0x89,0x7A,0x00,0x29 + ,0x02,0xD1,0x00,0xF0,0x0E,0xF8,0x90,0xBD,0x04,0xF0 + ,0x19,0xFC,0x90,0xBD,0x30,0x02,0x00,0x02,0xF4,0x01 + ,0x00,0x02,0xD0,0x03,0x00,0x0D,0x06,0x80,0x00,0x00 + ,0x70,0x03,0x00,0x0D,0x08,0x4B,0x07,0x49,0x98,0x42 + ,0x02,0xD1,0xE0,0x20,0x08,0x73,0x04,0xE0,0x06,0x4B + ,0x98,0x42,0x01,0xD1,0x20,0x20,0x08,0x73,0x04,0x49 + ,0x01,0x20,0x08,0x71,0xF7,0x46,0x70,0x03,0x00,0x0D + ,0x33,0xC1,0x00,0x00,0x0E,0x40,0x00,0x00,0xD0,0x03 + ,0x00,0x0D,0x80,0xB5,0x11,0x48,0x11,0x4B,0x01,0x78 + ,0x42,0x78,0x09,0x02,0x11,0x43,0x0F,0x1C,0x9F,0x42 + ,0x03,0xD1,0x80,0x78,0x00,0xF0,0x2D,0xFA,0x05,0xE0 + ,0x0C,0x49,0xE0,0x20,0x08,0x73,0x0C,0x49,0x01,0x20 + ,0x08,0x71,0x0B,0x4B,0x9F,0x42,0x0B,0xD1,0x0B,0x48 + ,0x01,0x7B,0x02,0x29,0x07,0xD1,0x03,0x21,0x01,0x73 + ,0x09,0x48,0x00,0x22,0xC1,0x78,0x80,0x78,0x04,0xF0 + ,0xF5,0xF8,0x80,0xBD,0x30,0x02,0x00,0x02,0x0E,0x40 + ,0x00,0x00,0x70,0x03,0x00,0x0D,0xD0,0x03,0x00,0x0D + ,0x22,0xC1,0x00,0x00,0x54,0x02,0x00,0x02,0x38,0x02 + ,0x00,0x02,0x00,0xB5,0x0C,0x49,0x08,0x7B,0x02,0x09 + ,0x05,0xD3,0x00,0x20,0x08,0x73,0x0A,0x49,0x01,0x20 + ,0x08,0x71,0x00,0xBD,0xC1,0x08,0x02,0xD3,0xFF,0xF7 + ,0xA3,0xFE,0x00,0xBD,0x41,0x08,0x02,0xD3,0xFF,0xF7 + ,0x68,0xFF,0x00,0xBD,0x80,0x08,0xF2,0xD3,0xFF,0xF7 + ,0xB5,0xFF,0x00,0xBD,0x70,0x03,0x00,0x0D,0xD0,0x03 + ,0x00,0x0D,0xF0,0xB5,0x47,0x4E,0x30,0x79,0x80,0x08 + ,0x4A,0xD3,0x46,0x4D,0x68,0x79,0x01,0x28,0x01,0xDD + ,0x00,0xF0,0x57,0xFE,0x44,0x48,0x04,0x79,0xC0,0x20 + ,0x01,0xF0,0x74,0xFA,0x01,0x1C,0x42,0x48,0x04,0x22 + ,0x02,0x71,0x00,0x22,0x02,0x71,0x08,0x1C,0x01,0xF0 + ,0x6B,0xFA,0x3F,0x48,0xC7,0x1D,0x39,0x37,0x39,0x8B + ,0x40,0x29,0x07,0xDA,0x39,0x8B,0x00,0x29,0x04,0xD0 + ,0x39,0x8B,0x02,0x31,0x09,0x04,0x09,0x0C,0x07,0xE0 + ,0x40,0x2C,0x04,0xDA,0x39,0x8B,0x00,0x29,0x01,0xD1 + ,0x21,0x1C,0x00,0xE0,0x40,0x21,0x7A,0x8B,0x34,0x4C + ,0x52,0x18,0x19,0x23,0x9B,0x01,0x9A,0x42,0x04,0xD9 + ,0x00,0x22,0x7A,0x83,0x3A,0x83,0x01,0x22,0xA2,0x73 + ,0x2E,0x48,0x40,0x6F,0x80,0x68,0x7A,0x8B,0x80,0x18 + ,0xCD,0x22,0x00,0xF0,0xA7,0xFA,0x00,0x20,0x30,0x71 + ,0x68,0x79,0x01,0x28,0x01,0xDD,0x00,0xF0,0x04,0xFE + ,0xA1,0x7B,0x26,0x48,0x01,0x29,0x02,0xD1,0x00,0x20 + ,0xA0,0x73,0xF0,0xBD,0x04,0x1C,0x78,0x8B,0x00,0x28 + ,0x28,0xD1,0x60,0x6F,0x81,0x8A,0xC0,0x7D,0x08,0x31 + ,0x08,0x18,0x38,0x83,0x60,0x6F,0x81,0x7D,0x45,0x68 + ,0x03,0x29,0x01,0xDD,0x03,0x21,0x81,0x75,0x38,0x8B + ,0x1C,0x4B,0x98,0x42,0x13,0xD8,0x38,0x8B,0x00,0x28 + ,0x10,0xD0,0xE8,0x1D,0x03,0x30,0x06,0x22,0x18,0x49 + ,0x01,0xF0,0xDB,0xFD,0x00,0x28,0x08,0xD1,0x28,0x78 + ,0x08,0x28,0x09,0xD0,0x00,0x28,0x07,0xD0,0x20,0x28 + ,0x05,0xD0,0xB0,0x28,0x03,0xD0,0x00,0x20,0x78,0x83 + ,0x38,0x83,0xF0,0xBD,0x38,0x8B,0x40,0x28,0x06,0xDD + ,0x38,0x8B,0x40,0x38,0x38,0x83,0x78,0x8B,0x40,0x30 + ,0x78,0x83,0xF0,0xBD,0x00,0x20,0x38,0x83,0x78,0x83 + ,0x60,0x6F,0xFF,0xF7,0x18,0xFD,0x60,0x67,0xF0,0xBD + ,0x70,0x03,0x00,0x0D,0xB0,0x00,0x00,0x02,0xF0,0x02 + ,0x00,0x0D,0x60,0x02,0x00,0x0D,0xF4,0x01,0x00,0x02 + ,0x54,0x02,0x00,0x02,0x32,0x06,0x00,0x00,0x5C,0x00 + ,0x00,0x02,0x90,0xB5,0x1C,0x4F,0x38,0x7A,0x40,0x08 + ,0x1D,0xD3,0x1B,0x48,0x40,0x79,0x01,0x28,0x01,0xDD + ,0x00,0xF0,0xB7,0xFD,0x00,0x20,0x18,0x4B,0x38,0x72 + ,0x3A,0x1C,0xDF,0x1D,0x49,0x37,0xBC,0x79,0xD9,0x1D + ,0x39,0x31,0x01,0x2C,0x15,0xD1,0xB8,0x71,0xFB,0x79 + ,0x00,0x2B,0x01,0xD1,0x10,0x23,0x13,0x72,0x89,0x8A + ,0x01,0x24,0x00,0x29,0x03,0xD0,0x00,0xF0,0x1E,0xF8 + ,0xBC,0x71,0x90,0xBD,0x39,0x7B,0x01,0x29,0x02,0xD1 + ,0x38,0x73,0xBC,0x71,0x90,0xBD,0xB8,0x71,0x90,0xBD + ,0x18,0x65,0x88,0x82,0x38,0x73,0xB8,0x71,0x18,0x6F + ,0x01,0x7A,0x10,0x29,0xEE,0xD1,0x1F,0x1C,0xFF,0xF7 + ,0x36,0xFD,0x38,0x67,0x90,0xBD,0x00,0x00,0x60,0x03 + ,0x00,0x0D,0xB0,0x00,0x00,0x02,0xF4,0x01,0x00,0x02 + ,0xF0,0xB4,0x10,0x49,0xCA,0x1D,0x39,0x32,0x90,0x8A + ,0x40,0x28,0x01,0xDB,0x40,0x20,0x00,0xE0,0x90,0x8A + ,0x00,0x23,0x00,0x28,0x0F,0x6D,0x0B,0xDD,0xCC,0x1D + ,0x0A,0x4D,0x49,0x34,0xE6,0x79,0x00,0x2E,0x05,0xD1 + ,0x3E,0x78,0x01,0x37,0x01,0x33,0x83,0x42,0x2E,0x72 + ,0xF6,0xDB,0x93,0x8A,0x1B,0x1A,0x93,0x82,0x0A,0x6D + ,0x10,0x18,0x08,0x65,0xF0,0xBC,0xF7,0x46,0xF4,0x01 + ,0x00,0x02,0x20,0x03,0x00,0x0D,0xF0,0xB5,0x04,0x1C + ,0x17,0x48,0x0F,0x1C,0x40,0x79,0x01,0x28,0x01,0xDD + ,0x00,0xF0,0x53,0xFD,0x15,0x48,0x00,0x25,0xC6,0x1D + ,0x39,0x36,0x04,0x65,0xB7,0x82,0xC7,0x1D,0x49,0x37 + ,0xBD,0x71,0x3D,0x73,0xB0,0x8A,0x80,0x06,0x80,0x0E + ,0x01,0x24,0x00,0x28,0x00,0xD1,0x3C,0x73,0xFF,0xF7 + ,0xBE,0xFF,0xF8,0x79,0x00,0x28,0x02,0xD1,0x0B,0x49 + ,0x10,0x20,0x08,0x72,0xB0,0x8A,0x00,0x28,0x03,0xD0 + ,0xFF,0xF7,0xB3,0xFF,0xBC,0x71,0xF0,0xBD,0x38,0x7B + ,0x00,0x28,0x02,0xD0,0x3D,0x73,0xBC,0x71,0xF0,0xBD + ,0xBD,0x71,0xF0,0xBD,0x00,0x00,0xB0,0x00,0x00,0x02 + ,0xF4,0x01,0x00,0x02,0x60,0x03,0x00,0x0D,0xB0,0xB5 + ,0x29,0x4D,0xEF,0x1D,0x49,0x37,0x78,0x7B,0x00,0x28 + ,0x39,0xD0,0x27,0x48,0x00,0x78,0x01,0x28,0x35,0xD1 + ,0x26,0x48,0x00,0x24,0x01,0x78,0x01,0x29,0x02,0xD1 + ,0x04,0x70,0x06,0xF0,0xB7,0xF8,0xF8,0x79,0x01,0x28 + ,0x03,0xD1,0xFC,0x71,0xF8,0x7B,0x00,0xF0,0xA4,0xF9 + ,0xE8,0x1D,0x59,0x30,0xC0,0x7A,0x01,0x28,0x02,0xD1 + ,0xF8,0x7B,0x00,0xF0,0x9C,0xF9,0xF8,0x7B,0x02,0x28 + ,0x1C,0xD0,0xFF,0xF7,0x9B,0xFE,0x28,0x6F,0x80,0x23 + ,0x01,0x7A,0x17,0x4F,0x19,0x40,0x0C,0xD0,0x10,0x21 + ,0x01,0x72,0x28,0x6F,0x81,0x89,0x0C,0x30,0x0C,0x31 + ,0xFF,0xF7,0x93,0xFF,0x78,0x79,0x01,0x28,0x01,0xDD + ,0x00,0xF0,0xD6,0xFC,0xFF,0xF7,0x26,0xFF,0x78,0x79 + ,0x01,0x28,0x01,0xDD,0x00,0xF0,0xCF,0xFC,0xB0,0xBD + ,0x0C,0x48,0x00,0x78,0x00,0x28,0xFA,0xD0,0x28,0x6F + ,0x01,0x7A,0x10,0x29,0x05,0xD0,0x01,0x7A,0x80,0x29 + ,0x02,0xD0,0x01,0x7A,0x40,0x29,0xF0,0xD1,0xFF,0xF7 + ,0x7D,0xFC,0x28,0x67,0xB0,0xBD,0xF4,0x01,0x00,0x02 + ,0xDF,0x01,0x00,0x02,0xDD,0x01,0x00,0x02,0xB0,0x00 + ,0x00,0x02,0xDE,0x01,0x00,0x02,0xB0,0xB4,0x21,0x4F + ,0x80,0x21,0x21,0x4A,0x39,0x73,0xD1,0x1D,0x59,0x31 + ,0x4C,0x88,0x0D,0x88,0xAC,0x42,0x17,0xD1,0x38,0x7B + ,0x40,0x23,0x03,0x40,0xE0,0x20,0x00,0x2B,0x0F,0xD1 + ,0x09,0x88,0x49,0x07,0x02,0xD0,0x38,0x73,0xB0,0xBC + ,0xF7,0x46,0xD1,0x1D,0x49,0x31,0x89,0x7B,0x01,0x29 + ,0x02,0xD1,0xD0,0x20,0x38,0x73,0xF5,0xE7,0x38,0x73 + ,0xF3,0xE7,0x38,0x73,0xF1,0xE7,0x4A,0x88,0x0C,0x88 + ,0xA2,0x42,0xED,0xDA,0x0A,0x88,0x4C,0x88,0x12,0x1B + ,0x08,0x2A,0x00,0xD9,0x08,0x22,0x01,0x28,0x01,0xD1 + ,0x0C,0x4B,0x02,0xE0,0x02,0x28,0x00,0xD1,0x0B,0x4B + ,0x00,0x2A,0x08,0xD0,0x0A,0x48,0x4C,0x88,0x4D,0x88 + ,0x01,0x34,0x4C,0x80,0x5C,0x5D,0x01,0x3A,0x04,0x73 + ,0xF7,0xD1,0x38,0x7B,0x10,0x23,0x18,0x43,0x38,0x73 + ,0xD0,0xE7,0x70,0x03,0x00,0x0D,0xF4,0x01,0x00,0x02 + ,0xF4,0x01,0x00,0x02,0x06,0x02,0x00,0x02,0x30,0x03 + ,0x00,0x0D,0xF0,0xB5,0x00,0x24,0x01,0x28,0x1F,0x4D + ,0x1F,0x4E,0x20,0x4F,0x0A,0xD1,0xFD,0xF7,0xE0,0xF9 + ,0x30,0x7B,0x1E,0x49,0xC8,0x73,0x00,0xF0,0x4C,0xF9 + ,0x3C,0x73,0x01,0x20,0x28,0x71,0xF0,0xBD,0x79,0x88 + ,0x3B,0x88,0x1A,0x4A,0x99,0x42,0x1D,0xDA,0x39,0x88 + ,0x7B,0x88,0xC9,0x1A,0x08,0x29,0x00,0xD9,0x08,0x21 + ,0x00,0x29,0x0A,0xD0,0x12,0x4E,0x53,0x6E,0x36,0x7B + ,0x1E,0x70,0x01,0x33,0x53,0x66,0x7B,0x88,0x01,0x33 + ,0x7B,0x80,0x01,0x39,0xF4,0xD1,0x7A,0x88,0x3B,0x88 + ,0x0F,0x49,0x9A,0x42,0x0D,0xD1,0x02,0x28,0x06,0xD1 + ,0x00,0xF0,0x27,0xF9,0x3C,0x73,0x08,0xE0,0x01,0x20 + ,0x28,0x71,0xF0,0xBD,0x60,0x20,0x08,0x73,0x01,0x20 + ,0x38,0x73,0x00,0xE0,0x0C,0x73,0x01,0x20,0x28,0x71 + ,0xF0,0xBD,0x00,0x00,0xD0,0x03,0x00,0x0D,0x30,0x03 + ,0x00,0x0D,0x54,0x02,0x00,0x02,0x44,0x02,0x00,0x02 + ,0xF4,0x01,0x00,0x02,0x70,0x03,0x00,0x0D,0x00,0xB5 + ,0x7F,0x28,0x07,0xD8,0x00,0x29,0x05,0xD1,0x00,0x2A + ,0x03,0xD1,0x0C,0x4A,0x51,0x6B,0x03,0x29,0x03,0xD1 + ,0x0B,0x49,0x20,0x20,0x08,0x73,0x00,0xBD,0x01,0x29 + ,0x04,0xD1,0x00,0x28,0x08,0xD0,0x02,0x20,0x50,0x63 + ,0x05,0xE0,0x02,0x29,0x03,0xD1,0x00,0x28,0x01,0xD1 + ,0x01,0x20,0x50,0x63,0x00,0xF0,0xEE,0xF8,0x00,0xBD + ,0x00,0x00,0xF4,0x01,0x00,0x02,0x70,0x03,0x00,0x0D + ,0x80,0xB5,0x00,0x29,0x09,0xD1,0x00,0x2A,0x07,0xD1 + ,0x00,0x28,0x01,0xD0,0x01,0x28,0x03,0xD1,0x14,0x49 + ,0x4A,0x6B,0x01,0x2A,0x03,0xD1,0x13,0x49,0x20,0x20 + ,0x08,0x73,0x80,0xBD,0x12,0x4B,0x02,0x2A,0x09,0xD1 + ,0x00,0x28,0x12,0xD0,0x03,0x22,0x4A,0x63,0x1F,0x7B + ,0x1A,0x1C,0x02,0x23,0x3B,0x43,0x13,0x73,0x0A,0xE0 + ,0x03,0x2A,0x08,0xD1,0x00,0x28,0x06,0xD1,0x02,0x22 + ,0x4A,0x63,0x1F,0x7B,0x1A,0x1C,0xFD,0x23,0x3B,0x40 + ,0x13,0x73,0x88,0x63,0x00,0x20,0x40,0x31,0x88,0x81 + ,0xC8,0x81,0x00,0xF0,0xB8,0xF8,0x80,0xBD,0x00,0x00 + ,0xF4,0x01,0x00,0x02,0x70,0x03,0x00,0x0D,0xE0,0x03 + ,0x00,0x0D,0x90,0xB5,0x15,0x4F,0xFA,0x1D,0x59,0x32 + ,0x01,0x29,0x02,0xD1,0x12,0x23,0x13,0x80,0x03,0xE0 + ,0x20,0x23,0x02,0x29,0x09,0xD1,0x13,0x80,0x00,0x23 + ,0x50,0x37,0xBB,0x73,0x14,0x88,0xA0,0x42,0x05,0xD8 + ,0xBB,0x73,0x10,0x80,0x0F,0xE0,0x0B,0x48,0x03,0x73 + ,0x90,0xBD,0x14,0x88,0xA0,0x42,0x09,0xD9,0x10,0x88 + ,0x40,0x07,0x01,0xD0,0xBB,0x73,0x04,0xE0,0x10,0x88 + ,0x40,0x07,0x01,0xD1,0x01,0x20,0xB8,0x73,0x53,0x80 + ,0x08,0x1C,0xFF,0xF7,0xDE,0xFE,0x90,0xBD,0x00,0x00 + ,0xF4,0x01,0x00,0x02,0x70,0x03,0x00,0x0D,0x80,0xB4 + ,0x0E,0x4F,0x0E,0x4A,0x01,0x28,0x06,0xD1,0x80,0x20 + ,0x10,0x72,0x38,0x7B,0xFE,0x23,0x18,0x40,0x38,0x73 + ,0x08,0xE0,0x02,0x28,0x06,0xD1,0x80,0x20,0x08,0x43 + ,0x10,0x72,0x38,0x7B,0x01,0x23,0x18,0x43,0x38,0x73 + ,0x06,0x49,0x20,0x20,0x08,0x73,0x05,0x49,0x01,0x20 + ,0x08,0x71,0x80,0xBC,0xF7,0x46,0x00,0x00,0xE0,0x03 + ,0x00,0x0D,0xC0,0x03,0x00,0x0D,0x70,0x03,0x00,0x0D + ,0xD0,0x03,0x00,0x0D,0x0D,0x23,0x1B,0x06,0x99,0x83 + ,0x05,0x49,0x0A,0x70,0x05,0x4A,0x10,0x60,0x02,0x20 + ,0x08,0x72,0x08,0x7A,0x00,0x28,0xFC,0xD1,0xF7,0x46 + ,0x00,0x00,0x20,0x00,0x00,0x0D,0x40,0x00,0x00,0x0D + ,0x90,0xB5,0x1B,0x4C,0x07,0x1C,0x60,0x79,0x01,0x28 + ,0x01,0xDD,0x00,0xF0,0x5E,0xFB,0x00,0x21,0x02,0x2F + ,0x17,0x48,0x18,0x4A,0x0F,0xD0,0x43,0x7B,0x02,0x2B + ,0x03,0xD1,0x41,0x73,0x03,0xF0,0x49,0xFF,0x1A,0xE0 + ,0x11,0x72,0x14,0x48,0x20,0x22,0x02,0x70,0x01,0x70 + ,0x13,0x49,0x86,0x20,0x08,0x72,0x11,0xE0,0x12,0x4B + ,0x9B,0x7B,0x00,0x2B,0x0D,0xD1,0x17,0x7A,0x7B,0x09 + ,0x0A,0xD2,0x10,0x23,0x13,0x72,0xC1,0x72,0x0E,0x4A + ,0x01,0x20,0x10,0x70,0x0F,0x20,0x00,0x06,0x81,0x81 + ,0x0C,0x49,0x81,0x80,0x60,0x79,0x01,0x28,0x01,0xDD + ,0x00,0xF0,0x1E,0xFB,0x03,0xF0,0x80,0xFF,0x90,0xBD + ,0x00,0x00,0xB0,0x00,0x00,0x02,0x54,0x02,0x00,0x02 + ,0x60,0x03,0x00,0x0D,0xC0,0x03,0x00,0x0D,0xA0,0x03 + ,0x00,0x0D,0x54,0x09,0x00,0x02,0xDE,0x01,0x00,0x02 + ,0x08,0x08,0x00,0x00,0x04,0x48,0x01,0x78,0x02,0x78 + ,0x91,0x42,0xFC,0xD0,0x03,0x49,0x60,0x20,0x08,0x73 + ,0xF7,0x46,0x00,0x00,0xF0,0x03,0x00,0x0D,0x70,0x03 + ,0x00,0x0D,0xF0,0xB5,0x29,0x4E,0x30,0x78,0x00,0x28 + ,0x01,0xD1,0x00,0xF0,0xB1,0xFA,0x0D,0x24,0x24,0x06 + ,0x27,0x89,0x40,0x20,0x25,0x4D,0x38,0x40,0x08,0xD0 + ,0x28,0x7A,0x00,0x28,0xFC,0xD1,0x23,0x48,0x00,0x7B + ,0x40,0x08,0x01,0xD3,0xFF,0xF7,0x79,0xFC,0x78,0x0A + ,0x1F,0xD3,0xF8,0x43,0xFF,0x23,0x01,0x33,0x18,0x43 + ,0x20,0x81,0xFD,0xF7,0x61,0xF8,0x20,0x7B,0x00,0x09 + ,0xFC,0xD2,0x28,0x7A,0x00,0x28,0xFC,0xD1,0xFF,0xF7 + ,0xF2,0xFA,0x18,0x49,0xC8,0x1D,0x49,0x30,0xC2,0x79 + ,0x02,0x2A,0x06,0xD0,0x01,0x22,0xC2,0x71,0xC8,0x1D + ,0x00,0x23,0x59,0x30,0x43,0x73,0x01,0xE0,0x00,0x23 + ,0xC3,0x71,0xFF,0xF7,0x93,0xFA,0x11,0x49,0x08,0x78 + ,0x01,0x28,0x10,0xD1,0xB8,0x08,0x0E,0xD3,0x0F,0x4A + ,0x00,0x23,0x10,0x7A,0x13,0x72,0xFA,0x43,0x02,0x23 + ,0x1A,0x43,0x22,0x81,0x09,0x78,0x01,0x29,0x03,0xD1 + ,0x00,0x04,0x00,0x0C,0x03,0xF0,0x90,0xFE,0x30,0x78 + ,0x00,0x28,0x01,0xD1,0x00,0xF0,0x89,0xFA,0xF0,0xBD + ,0x3D,0x01,0x00,0x02,0x20,0x00,0x00,0x0D,0xD0,0x03 + ,0x00,0x0D,0xF4,0x01,0x00,0x02,0x37,0x01,0x00,0x02 + ,0xE0,0x03,0x00,0x0D,0x90,0xB5,0x41,0x68,0x0A,0x78 + ,0x08,0x2A,0x12,0xD1,0x8A,0x7F,0xCB,0x7F,0x12,0x02 + ,0x1A,0x43,0x15,0x4B,0x12,0x04,0x1F,0x88,0x12,0x0C + ,0xBA,0x42,0x02,0xD0,0x5B,0x88,0x93,0x42,0x06,0xD1 + ,0xC8,0x1D,0x11,0x30,0x06,0x22,0x10,0x49,0x01,0xF0 + ,0x9E,0xFA,0x90,0xBD,0x03,0x23,0x5B,0x02,0x9A,0x42 + ,0x06,0xDD,0xC8,0x1D,0x11,0x30,0x06,0x22,0x0B,0x49 + ,0x01,0xF0,0x93,0xFA,0x90,0xBD,0xCF,0x1D,0x01,0x37 + ,0x47,0x60,0x18,0x32,0x82,0x82,0x08,0x4C,0x18,0x22 + ,0x20,0x1C,0x01,0xF0,0x88,0xFA,0x18,0x22,0x38,0x1C + ,0x21,0x1C,0x01,0xF0,0x83,0xFA,0x90,0xBD,0x94,0x02 + ,0x00,0x02,0x8E,0x02,0x00,0x02,0x88,0x02,0x00,0x02 + ,0x40,0x0A,0x00,0x02,0xF0,0xB5,0x00,0xF0,0x55,0xF9 + ,0x71,0x4E,0xFF,0x21,0xF0,0x1D,0x27,0x30,0x01,0x31 + ,0x06,0x22,0x05,0x1C,0x00,0xF0,0xB3,0xF9,0x6D,0x4F + ,0x12,0x22,0x03,0x21,0x38,0x1C,0x00,0xF0,0xAD,0xF9 + ,0x0E,0x22,0xFF,0x21,0x30,0x1C,0x41,0x31,0x00,0xF0 + ,0xA7,0xF9,0xF0,0x1D,0x07,0x30,0x0E,0x22,0xFF,0x21 + ,0x51,0x31,0x00,0xF0,0xA0,0xF9,0xF0,0x1D,0x2E,0x30 + ,0x0E,0x22,0xFF,0x21,0x61,0x31,0x00,0xF0,0x99,0xF9 + ,0xF0,0x1D,0x3C,0x30,0x0E,0x22,0xFF,0x21,0x71,0x31 + ,0x00,0xF0,0x92,0xF9,0xF0,0x1D,0x15,0x30,0x0E,0x22 + ,0xFF,0x21,0x11,0x31,0x00,0xF0,0x8B,0xF9,0xF0,0x1D + ,0x2D,0x30,0x01,0x22,0xFF,0x21,0x31,0x31,0x00,0xF0 + ,0x84,0xF9,0xF0,0x1D,0x4A,0x30,0x07,0x22,0xFF,0x21 + ,0x81,0x31,0x00,0xF0,0x7D,0xF9,0xF0,0x1D,0x51,0x30 + ,0x03,0x22,0xFF,0x21,0x89,0x31,0x00,0xF0,0x76,0xF9 + ,0xF0,0x1D,0x55,0x30,0x04,0x22,0xFF,0x21,0x8D,0x31 + ,0x00,0xF0,0x6F,0xF9,0x00,0xF0,0x24,0xF9,0xF0,0x1D + ,0x23,0x30,0x04,0x22,0xF9,0x1D,0x01,0x31,0x01,0xF0 + ,0x21,0xFA,0xF4,0x1D,0x19,0x34,0xA0,0x7B,0xC0,0x07 + ,0xC0,0x0F,0x00,0x27,0x00,0x28,0x10,0xD1,0x44,0x4A + ,0x17,0x54,0x01,0x30,0x06,0x28,0xFB,0xD3,0x10,0x1C + ,0x06,0x22,0x29,0x1C,0x01,0xF0,0xF1,0xF9,0x00,0x28 + ,0x04,0xD0,0x29,0x1C,0x06,0x22,0x3E,0x48,0x01,0xF0 + ,0x08,0xFA,0xF0,0x1D,0x29,0x30,0x00,0x79,0x10,0x28 + ,0x0D,0xD0,0x20,0x28,0x0B,0xD0,0x31,0x28,0x09,0xD0 + ,0x30,0x28,0x07,0xD0,0x32,0x28,0x05,0xD0,0x40,0x28 + ,0x03,0xD0,0x41,0x28,0x01,0xD0,0x50,0x28,0x01,0xD1 + ,0x34,0x49,0xC8,0x75,0xF0,0x1D,0x49,0x30,0x43,0x78 + ,0x01,0x22,0x32,0x49,0x55,0x2B,0x13,0xD1,0x83,0x78 + ,0x53,0x2B,0x10,0xD1,0xC3,0x78,0x42,0x2B,0x0D,0xD1 + ,0x03,0x79,0x53,0x2B,0x0A,0xD1,0x43,0x79,0x55,0x2B + ,0x07,0xD1,0x83,0x79,0x53,0x2B,0x04,0xD1,0xC3,0x79 + ,0x50,0x2B,0x01,0xD1,0x0A,0x70,0x00,0xE0,0x0F,0x70 + ,0xFF,0x25,0x01,0x23,0x06,0x7A,0x5B,0x02,0x01,0x35 + ,0x53,0x2E,0x24,0x49,0x08,0xD1,0x46,0x7A,0x45,0x2E + ,0x05,0xD1,0x86,0x7A,0x4C,0x2E,0x02,0xD1,0xCD,0x61 + ,0x0B,0x62,0x01,0xE0,0xCB,0x61,0x0D,0x62,0x05,0x7B + ,0x1E,0x4B,0x48,0x2D,0x12,0xD1,0x45,0x7B,0x57,0x2D + ,0x0F,0xD1,0x80,0x7B,0x31,0x28,0x02,0xD1,0x03,0x20 + ,0x98,0x70,0x0C,0xE0,0x32,0x28,0x02,0xD1,0x04,0x20 + ,0x98,0x70,0x07,0xE0,0x33,0x28,0x02,0xD1,0x05,0x20 + ,0x98,0x70,0x12,0xE0,0x98,0x78,0x05,0x28,0x0F,0xDA + ,0x40,0x20,0xC8,0x60,0x4F,0x76,0x98,0x78,0x02,0x28 + ,0x01,0xD1,0x0F,0x76,0x02,0xE0,0x0A,0x76,0x04,0x28 + ,0x03,0xDA,0x20,0x79,0x00,0x28,0x00,0xD0,0x27,0x71 + ,0xF0,0xBD,0x20,0x20,0xC8,0x60,0x4A,0x76,0x0A,0x76 + ,0xF0,0xBD,0x00,0x00,0x58,0x0A,0x00,0x02,0xF4,0x01 + ,0x00,0x02,0x00,0x72,0x01,0x02,0x5C,0x00,0x00,0x02 + ,0x00,0x00,0x00,0x02,0x36,0x01,0x00,0x02,0x98,0x02 + ,0x00,0x02,0x10,0x01,0x00,0x02,0xB0,0xB5,0x2A,0x48 + ,0x04,0x25,0x05,0x70,0x29,0x49,0x00,0x20,0x08,0x70 + ,0x29,0x49,0x02,0x24,0x0C,0x70,0x06,0x21,0x07,0x27 + ,0x7F,0x06,0xB9,0x61,0x78,0x61,0xF8,0x69,0xFB,0x0B + ,0x98,0x43,0xF8,0x61,0xF8,0x69,0x10,0x23,0x98,0x43 + ,0xF8,0x61,0xFF,0xF7,0xF1,0xFE,0x21,0x48,0x00,0x78 + ,0x00,0x28,0x00,0xD1,0xBD,0x61,0x1F,0x48,0x01,0x21 + ,0xC1,0x76,0x1F,0x49,0xCA,0x69,0x0B,0x0C,0x1A,0x43 + ,0xCA,0x61,0xCA,0x69,0x1B,0x23,0x9A,0x43,0xCA,0x61 + ,0xCA,0x69,0x04,0x23,0x9A,0x43,0xCA,0x61,0xC2,0x68 + ,0xCB,0x69,0xD2,0x43,0x1A,0x40,0xCA,0x61,0xC2,0x69 + ,0xCB,0x69,0xD2,0x43,0x1A,0x40,0xCA,0x61,0x02,0x6A + ,0xCB,0x69,0x1A,0x43,0xCA,0x61,0xCA,0x69,0x0B,0x0C + ,0x9A,0x43,0xCA,0x61,0xB9,0x69,0x01,0x23,0x19,0x43 + ,0xB9,0x61,0x84,0x76,0x00,0xF0,0x39,0xF8,0x00,0xF0 + ,0xA3,0xF8,0x0A,0x20,0xFC,0xF7,0x9E,0xFD,0x00,0xF0 + ,0x96,0xF8,0xFF,0xF7,0x02,0xF9,0xF8,0x69,0x01,0x23 + ,0xDB,0x03,0x18,0x43,0xF8,0x61,0xB0,0xBD,0x53,0x02 + ,0x00,0x02,0x5E,0x02,0x00,0x02,0x3B,0x01,0x00,0x02 + ,0x36,0x01,0x00,0x02,0x98,0x02,0x00,0x02,0x40,0x00 + ,0x00,0x04,0x80,0x21,0xF3,0x20,0x00,0x05,0x01,0x60 + ,0x00,0x21,0x01,0x60,0x01,0x21,0x41,0x60,0x01,0x60 + ,0x07,0x21,0x49,0x06,0xCA,0x69,0x01,0x23,0x5B,0x03 + ,0x1A,0x43,0xCA,0x61,0x04,0x49,0x01,0x63,0x04,0x49 + ,0x41,0x63,0x81,0x63,0xC1,0x63,0x01,0x69,0x80,0x68 + ,0xF7,0x46,0x00,0x00,0x01,0x0C,0x00,0x02,0x01,0x02 + ,0x00,0x02,0x07,0x20,0x40,0x06,0xC1,0x69,0x02,0x4B + ,0x19,0x40,0xC1,0x61,0xF7,0x46,0x00,0x00,0xFF,0xDF + ,0x00,0x00,0xF0,0xB5,0x0F,0x1C,0x00,0x21,0xF3,0x24 + ,0x24,0x05,0x00,0x28,0x08,0xD9,0x10,0x4D,0x6B,0x5C + ,0xE3,0x60,0x26,0x69,0xB3,0x08,0xFC,0xD3,0x01,0x31 + ,0x81,0x42,0xF7,0xD3,0xFF,0x20,0xE0,0x60,0xA1,0x68 + ,0x21,0x1C,0x0B,0x69,0x5B,0x08,0xFC,0xD3,0x8B,0x68 + ,0x0C,0x69,0xA3,0x08,0xFC,0xD3,0xC8,0x60,0x0B,0x69 + ,0x5B,0x08,0xFC,0xD3,0x8B,0x68,0x3B,0x70,0x01,0x37 + ,0x01,0x3A,0xF3,0xD1,0x02,0x20,0xFC,0xF7,0x39,0xFD + ,0xF0,0xBD,0xA8,0x02,0x00,0x02,0xF3,0x20,0x00,0x05 + ,0x81,0x68,0x05,0x21,0xC1,0x60,0x01,0x69,0x89,0x08 + ,0xFC,0xD3,0xFF,0x21,0xC1,0x60,0x01,0x69,0x89,0x08 + ,0xFC,0xD3,0x81,0x68,0x01,0x69,0x49,0x08,0xFC,0xD3 + ,0x80,0x68,0x00,0x06,0x00,0x0E,0xF7,0x46,0x90,0xB5 + ,0x04,0x1C,0x48,0x09,0x08,0x23,0x18,0x40,0x17,0x1C + ,0x03,0x22,0x02,0x43,0x08,0x48,0x02,0x70,0x41,0x70 + ,0xFF,0xF7,0xDE,0xFF,0x40,0x08,0xFB,0xD2,0x02,0x20 + ,0xFC,0xF7,0x0F,0xFD,0x02,0x20,0x21,0x1C,0x3A,0x1C + ,0xFF,0xF7,0xAA,0xFF,0x90,0xBD,0x00,0x00,0xA8,0x02 + ,0x00,0x02,0x07,0x20,0x40,0x06,0xC1,0x69,0x01,0x23 + ,0x5B,0x03,0x19,0x43,0xC1,0x61,0xF7,0x46,0xF3,0x20 + ,0x00,0x05,0x41,0x68,0x0F,0x23,0x1B,0x04,0x99,0x43 + ,0x41,0x60,0x41,0x68,0x19,0x43,0x41,0x60,0xF7,0x46 + ,0x00,0x00,0x80,0xB4,0x14,0x4B,0x5B,0x79,0x01,0x2B + ,0x0E,0xDD,0x17,0x1C,0x12,0x4A,0x14,0xD1,0x02,0x2B + ,0x09,0xD1,0x00,0x29,0x07,0xD1,0x00,0x28,0x07,0xD1 + ,0x90,0x78,0x4B,0x1F,0x18,0x40,0x90,0x70,0x00,0x20 + ,0x50,0x70,0x80,0xBC,0xF7,0x46,0x90,0x78,0x04,0x23 + ,0x18,0x43,0x90,0x70,0x01,0x20,0x50,0x70,0xF6,0xE7 + ,0x00,0x28,0x04,0xD1,0x90,0x78,0x02,0x23,0x98,0x43 + ,0x90,0x70,0xEF,0xE7,0x90,0x78,0x02,0x23,0x18,0x43 + ,0x90,0x70,0xEA,0xE7,0x00,0x00,0xB0,0x00,0x00,0x02 + ,0xB4,0x09,0x00,0x02,0x90,0xB5,0x07,0x21,0x49,0x06 + ,0xCA,0x69,0x52,0x09,0x15,0xD3,0xCA,0x69,0x10,0x23 + ,0x9A,0x43,0xCA,0x61,0x01,0x28,0x01,0xD1,0x08,0x49 + ,0x08,0x70,0x08,0x4C,0x67,0x68,0xFC,0xF7,0xC6,0xFC + ,0x39,0x1A,0x49,0x01,0x09,0x18,0x06,0x4A,0x61,0x60 + ,0x51,0x6B,0x09,0x1A,0x49,0x01,0x08,0x18,0x50,0x63 + ,0x90,0xBD,0x00,0x00,0x3D,0x01,0x00,0x02,0x80,0x00 + ,0x00,0x04,0x40,0x00,0x00,0x04,0x90,0xB5,0x0C,0x48 + ,0x80,0x78,0x01,0x28,0x13,0xD1,0x0B,0x4F,0x7C,0x68 + ,0xFC,0xF7,0xAB,0xFC,0x21,0x1A,0x49,0x09,0x09,0x18 + ,0x79,0x60,0x08,0x49,0x4A,0x6B,0x12,0x1A,0x52,0x09 + ,0x10,0x18,0x48,0x63,0x07,0x20,0x40,0x06,0xC1,0x69 + ,0x10,0x23,0x19,0x43,0xC1,0x61,0x90,0xBD,0xB4,0x09 + ,0x00,0x02,0x80,0x00,0x00,0x04,0x40,0x00,0x00,0x04 + ,0x80,0xB5,0xC0,0x20,0x00,0xF0,0x32,0xFC,0x07,0x1C + ,0x06,0x48,0x01,0x78,0x00,0x29,0x03,0xD0,0x00,0x21 + ,0x01,0x70,0xFF,0xF7,0xD3,0xFF,0x38,0x1C,0x00,0xF0 + ,0x26,0xFC,0x80,0xBD,0x00,0x00,0x3D,0x01,0x00,0x02 + ,0x80,0xB5,0xC0,0x20,0x00,0xF0,0x1E,0xFC,0x07,0x1C + ,0x01,0x20,0xFF,0xF7,0xA0,0xFF,0x38,0x1C,0x00,0xF0 + ,0x17,0xFC,0x80,0xBD,0xF0,0xB4,0x13,0x4A,0x00,0x27 + ,0xD7,0x65,0x17,0x66,0x17,0x67,0x57,0x67,0x20,0x20 + ,0x90,0x67,0x10,0x48,0x07,0x70,0x41,0x1C,0x01,0x20 + ,0x04,0x02,0x00,0x25,0x03,0x1C,0x46,0x08,0x05,0xD2 + ,0x5B,0x08,0x01,0x35,0x2D,0x06,0x2D,0x0E,0x5E,0x08 + ,0xF9,0xD3,0x0D,0x70,0x01,0x31,0x01,0x30,0xA0,0x42 + ,0xF0,0xD3,0x07,0x49,0x00,0x20,0x80,0xC1,0x01,0x30 + ,0x20,0x28,0xFB,0xD3,0x57,0x66,0x97,0x66,0xD7,0x67 + ,0xF0,0xBC,0xF7,0x46,0x5C,0x03,0x00,0x02,0xE0,0x0A + ,0x00,0x02,0xE0,0x0B,0x00,0x02,0x90,0xB5,0x0A,0x4F + ,0x0A,0x4C,0x38,0x68,0x63,0x1C,0x98,0x42,0x04,0xD0 + ,0x3C,0x60,0xFC,0xF7,0x2C,0xFB,0x00,0xF0,0xEC,0xFB + ,0x06,0x48,0x3C,0x60,0x00,0x68,0xFC,0xF7,0xA2,0xFB + ,0x00,0x20,0x38,0x60,0x00,0xF0,0xF3,0xFB,0x90,0xBD + ,0xC8,0x03,0x00,0x02,0xF0,0xF0,0xF0,0xF0,0x38,0x04 + ,0x00,0x02,0x80,0xB5,0x05,0x48,0x05,0x4F,0x38,0x60 + ,0xFC,0xF7,0x14,0xFB,0x00,0xF0,0xD4,0xFB,0x03,0x48 + ,0x38,0x60,0x80,0xBD,0x00,0x00,0xF0,0xF0,0xF0,0xF0 + ,0xC8,0x03,0x00,0x02,0xF1,0xF0,0xF0,0xF0,0x0F,0x00 + ,0x2D,0xE9,0xD2,0x00,0xA0,0xE3,0x00,0xF0,0x21,0xE1 + ,0xCC,0x30,0x9F,0xE5,0x00,0x20,0x93,0xE5,0x00,0x00 + ,0x52,0xE3,0x06,0x00,0x00,0x0A,0x01,0x20,0x82,0xE2 + ,0x00,0x20,0x83,0xE5,0x00,0x00,0x4F,0xE1,0x04,0xE0 + ,0x4E,0xE2,0x01,0x40,0x2D,0xE9,0xB0,0x00,0x9F,0xE5 + ,0x10,0xFF,0x2F,0xE1,0x01,0x20,0x82,0xE2,0x00,0x20 + ,0x83,0xE5,0x9C,0x10,0x9F,0xE5,0x00,0x00,0x91,0xE5 + ,0x00,0x00,0x50,0xE3,0x04,0x00,0x00,0x0A,0x00,0x20 + ,0x4F,0xE1,0x04,0xE0,0x4E,0xE2,0x04,0x40,0x2D,0xE9 + ,0x84,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1,0x10,0xD0 + ,0x8D,0xE2,0x78,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1 + ,0x0F,0x00,0x2D,0xE9,0x64,0x30,0x9F,0xE5,0x00,0x20 + ,0x93,0xE5,0x00,0x00,0x52,0xE3,0x06,0x00,0x00,0x0A + ,0x01,0x20,0x82,0xE2,0x00,0x20,0x83,0xE5,0x00,0x00 + ,0x4F,0xE1,0x04,0xE0,0x4E,0xE2,0x01,0x40,0x2D,0xE9 + ,0x4C,0x00,0x9F,0xE5,0x10,0xFF,0x2F,0xE1,0x01,0x20 + ,0x82,0xE2,0x00,0x20,0x83,0xE5,0x34,0x10,0x9F,0xE5 + ,0x00,0x00,0x91,0xE5,0x00,0x00,0x50,0xE3,0x04,0x00 + ,0x00,0x0A,0x00,0x20,0x4F,0xE1,0x04,0xE0,0x4E,0xE2 + ,0x04,0x40,0x2D,0xE9,0x20,0x00,0x9F,0xE5,0x10,0xFF + ,0x2F,0xE1,0x00,0x00,0x4F,0xE1,0x04,0xE0,0x4E,0xE2 + ,0x01,0x40,0x2D,0xE9,0x0C,0x00,0x9F,0xE5,0x10,0xFF + ,0x2F,0xE1,0xC8,0x03,0x00,0x02,0xB8,0x03,0x00,0x02 + ,0x1D,0x01,0x00,0x00,0x29,0x01,0x00,0x00,0x00,0xA0 + ,0x00,0x47,0xD2,0x00,0xA0,0xE3,0x00,0xF0,0x21,0xE1 + ,0xE4,0x31,0x9F,0xE5,0x00,0x20,0x93,0xE5,0x01,0x20 + ,0x42,0xE2,0x00,0x20,0x83,0xE5,0x00,0x00,0x52,0xE3 + ,0x03,0x00,0x00,0x0A,0x01,0x40,0xBD,0xE8,0x00,0xF0 + ,0x6F,0xE1,0x0F,0x00,0xBD,0xE8,0x0E,0xF0,0xB0,0xE1 + ,0xC0,0x11,0x9F,0xE5,0x00,0x00,0x91,0xE5,0x00,0x00 + ,0x50,0xE3,0x27,0x00,0x00,0x0A,0xC0,0x31,0x9F,0xE5 + ,0x00,0x20,0x93,0xE5,0x00,0x00,0x52,0xE3,0x03,0x00 + ,0x00,0x1A,0xA8,0x31,0x9F,0xE5,0x00,0x20,0x93,0xE5 + ,0x02,0x00,0x50,0xE1,0x03,0x00,0x00,0x1A,0x01,0x40 + ,0xBD,0xE8,0x00,0xF0,0x6F,0xE1,0x0F,0x00,0xBD,0xE8 + ,0x0E,0xF0,0xB0,0xE1,0x08,0x40,0xBD,0xE8,0x0E,0x10 + ,0xA0,0xE1,0xD3,0x20,0xA0,0xE3,0x02,0xF0,0x21,0xE1 + ,0x04,0x10,0x2D,0xE5,0xF0,0x5F,0x2D,0xE9,0x03,0x40 + ,0xA0,0xE1,0xD2,0x20,0xA0,0xE3,0x02,0xF0,0x21,0xE1 + ,0x0F,0x00,0xBD,0xE8,0xD3,0x50,0xA0,0xE3,0x05,0xF0 + ,0x21,0xE1,0x0F,0x00,0x2D,0xE9,0x01,0x30,0xA0,0xE3 + ,0x18,0x00,0x2D,0xE9,0x44,0x11,0x9F,0xE5,0x00,0x00 + ,0x91,0xE5,0x08,0xD0,0x80,0xE5,0x44,0x31,0x9F,0xE5 + ,0x00,0x20,0x93,0xE5,0x00,0x00,0x52,0xE3,0x02,0x00 + ,0x00,0x0A,0x18,0x20,0x80,0xE5,0x00,0x20,0xA0,0xE3 + ,0x00,0x20,0x83,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x00 + ,0x81,0xE5,0x78,0x01,0x00,0xEA,0xD3,0x00,0xA0,0xE3 + ,0x00,0xF0,0x21,0xE1,0x75,0x01,0x00,0xEA,0x00,0xA0 + ,0x00,0x47,0xD1,0x00,0xA0,0xE3,0x00,0xF0,0x21,0xE1 + ,0xF4,0x30,0x9F,0xE5,0x00,0x20,0x93,0xE5,0x01,0x20 + ,0x42,0xE2,0x00,0x20,0x83,0xE5,0x00,0x00,0x52,0xE3 + ,0x03,0x00,0x00,0x0A,0x01,0x40,0xBD,0xE8,0x00,0xF0 + ,0x6F,0xE1,0x0F,0x00,0xBD,0xE8,0x0E,0xF0,0xB0,0xE1 + ,0x00,0x10,0x9D,0xE5,0x1F,0x20,0xA0,0xE3,0x02,0x10 + ,0x01,0xE0,0x12,0x00,0x51,0xE3,0x0B,0x00,0x00,0x0A + ,0xBC,0x10,0x9F,0xE5,0x00,0x00,0x91,0xE5,0x00,0x00 + ,0x50,0xE3,0x27,0x00,0x00,0x0A,0xBC,0x30,0x9F,0xE5 + ,0x00,0x20,0x93,0xE5,0x00,0x00,0x52,0xE3,0x03,0x00 + ,0x00,0x1A,0xA4,0x30,0x9F,0xE5,0x00,0x20,0x93,0xE5 + ,0x02,0x00,0x50,0xE1,0x03,0x00,0x00,0x1A,0x01,0x40 + ,0xBD,0xE8,0x00,0xF0,0x6F,0xE1,0x0F,0x00,0xBD,0xE8 + ,0x0E,0xF0,0xB0,0xE1,0x08,0x40,0xBD,0xE8,0x0E,0x10 + ,0xA0,0xE1,0xD3,0x20,0xA0,0xE3,0x02,0xF0,0x21,0xE1 + ,0x04,0x10,0x2D,0xE5,0xF0,0x5F,0x2D,0xE9,0x03,0x40 + ,0xA0,0xE1,0xD1,0x20,0xA0,0xE3,0x02,0xF0,0x21,0xE1 + ,0x0F,0x00,0xBD,0xE8,0xD3,0x50,0xA0,0xE3,0x05,0xF0 + ,0x21,0xE1,0x0F,0x00,0x2D,0xE9,0x01,0x30,0xA0,0xE3 + ,0x18,0x00,0x2D,0xE9,0x40,0x10,0x9F,0xE5,0x00,0x00 + ,0x91,0xE5,0x08,0xD0,0x80,0xE5,0x40,0x30,0x9F,0xE5 + ,0x00,0x20,0x93,0xE5,0x00,0x00,0x52,0xE3,0x02,0x00 + ,0x00,0x0A,0x18,0x20,0x80,0xE5,0x00,0x20,0xA0,0xE3 + ,0x00,0x20,0x83,0xE5,0x00,0x00,0xA0,0xE3,0x00,0x00 + ,0x81,0xE5,0x37,0x01,0x00,0xEA,0x18,0xD0,0x8D,0xE2 + ,0xD3,0x00,0xA0,0xE3,0x00,0xF0,0x21,0xE1,0x33,0x01 + ,0x00,0xEA,0xC8,0x03,0x00,0x02,0xB8,0x03,0x00,0x02 + ,0xB4,0x03,0x00,0x02,0xBC,0x03,0x00,0x02,0x40,0x04 + ,0x00,0x02,0xD8,0x03,0x00,0x02,0x90,0xB5,0x86,0xB0 + ,0x00,0x24,0x13,0x4F,0x13,0x4A,0x3C,0x60,0x7C,0x60 + ,0xBC,0x60,0x00,0x21,0x10,0x1C,0xBC,0x61,0x10,0xC0 + ,0x01,0x31,0x20,0x29,0xFB,0xD3,0xD0,0x1D,0x79,0x30 + ,0xFA,0x60,0x38,0x61,0x7A,0x61,0x78,0x6A,0x00,0x22 + ,0x00,0x21,0x05,0x92,0x02,0x1C,0x04,0x91,0x03,0x90 + ,0xF8,0x69,0x39,0x6A,0x02,0x92,0x00,0x90,0x01,0x91 + ,0x08,0xA1,0x07,0x48,0x05,0x4A,0x0C,0x4B,0x00,0xF0 + ,0x18,0xF8,0xBC,0x62,0xFC,0x62,0x06,0xB0,0x90,0xBD + ,0x3C,0x04,0x00,0x02,0x60,0x0C,0x00,0x02,0xD1,0x42 + ,0x00,0x00,0xE0,0x0C,0x00,0x02,0x53,0x79,0x73,0x74 + ,0x65,0x6D,0x20,0x54,0x69,0x6D,0x65,0x72,0x20,0x54 + ,0x68,0x72,0x65,0x61,0x64,0x00,0x4D,0x49,0x54,0x41 + ,0xFF,0xB5,0x07,0x1C,0x0D,0x98,0x0E,0x9C,0x0A,0xAE + ,0x4C,0xCE,0x09,0x9D,0xB9,0x62,0x02,0x99,0x79,0x64 + ,0x03,0x99,0xB9,0x64,0x00,0x21,0xB9,0x60,0x7A,0x61 + ,0xAA,0x18,0x01,0x3A,0xFD,0x60,0x3A,0x61,0xDA,0x06 + ,0xD2,0x0E,0xF3,0x06,0xB8,0x61,0xFA,0x62,0xDB,0x0E + ,0xFB,0x63,0xF8,0x61,0x79,0x60,0x03,0x20,0x38,0x63 + ,0x79,0x63,0x25,0x48,0xB9,0x63,0x78,0x65,0x01,0x20 + ,0x90,0x40,0xBF,0x65,0x39,0x65,0x64,0x37,0x00,0x22 + ,0x00,0x23,0x0E,0xC7,0x0C,0xC7,0x78,0x3F,0x38,0x64 + ,0x38,0x1C,0x1E,0x49,0x00,0xF0,0x0B,0xFB,0xC0,0x20 + ,0x00,0xF0,0xC8,0xF9,0x1C,0x49,0x1D,0x4D,0x39,0x60 + ,0x2A,0x68,0xF9,0x1D,0x79,0x31,0x00,0x2A,0x0A,0xD0 + ,0xD3,0x1D,0x79,0x33,0xDA,0x68,0xDF,0x60,0xD3,0x1D + ,0x79,0x33,0x9F,0x60,0xCA,0x60,0x2A,0x68,0x8A,0x60 + ,0x02,0xE0,0x2F,0x60,0x8F,0x60,0xCF,0x60,0x13,0x49 + ,0x14,0x4D,0x0A,0x68,0x01,0x32,0x0A,0x60,0x29,0x68 + ,0x01,0x31,0x29,0x60,0x00,0xF0,0xA8,0xF9,0x00,0x2C + ,0x07,0xD0,0x38,0x1C,0x00,0xF0,0x1D,0xFB,0x00,0x28 + ,0x0A,0xD0,0x00,0xF0,0x83,0xFB,0x07,0xE0,0xC0,0x20 + ,0x00,0xF0,0x9B,0xF9,0x29,0x68,0x01,0x39,0x29,0x60 + ,0x00,0xF0,0x96,0xF9,0x00,0x20,0x04,0xB0,0xF0,0xBD + ,0x00,0x00,0x2D,0x44,0x00,0x00,0x6D,0x44,0x00,0x00 + ,0x44,0x52,0x48,0x54,0xC0,0x03,0x00,0x02,0xC4,0x03 + ,0x00,0x02,0xD8,0x03,0x00,0x02,0x90,0xB5,0x41,0x60 + ,0x07,0x1C,0x08,0x30,0x00,0x21,0x00,0x24,0x12,0xC0 + ,0x12,0xC0,0xC0,0x20,0x00,0xF0,0x7B,0xF9,0x0C,0x49 + ,0x0C,0x4B,0x39,0x60,0x19,0x68,0x00,0x29,0x06,0xD0 + ,0xCA,0x69,0xCF,0x61,0x97,0x61,0xFA,0x61,0x19,0x68 + ,0xB9,0x61,0x02,0xE0,0x1F,0x60,0xBF,0x61,0xFF,0x61 + ,0x06,0x49,0x0A,0x68,0x01,0x32,0x0A,0x60,0x00,0xF0 + ,0x65,0xF9,0x20,0x1C,0x90,0xBD,0x00,0x00,0x4E,0x44 + ,0x56,0x44,0x6C,0x04,0x00,0x02,0x70,0x04,0x00,0x02 + ,0xF0,0xB5,0x85,0xB0,0x07,0x1C,0xC0,0x20,0x0C,0x1C + ,0x15,0x1C,0x00,0xF0,0x54,0xF9,0xA9,0x08,0x03,0xD3 + ,0xB9,0x68,0x21,0x40,0xB9,0x60,0x3D,0xE0,0xB9,0x68 + ,0x21,0x43,0xB9,0x60,0x3C,0x69,0x0A,0x1C,0x00,0x2C + ,0x63,0xD0,0x7B,0x69,0x6D,0x49,0x01,0x2B,0x35,0xD1 + ,0xE5,0x1D,0x79,0x35,0x2E,0x68,0xB3,0x08,0x05,0xD3 + ,0xA3,0x6F,0x16,0x1C,0x1E,0x40,0x9E,0x42,0x28,0xD1 + ,0x02,0xE0,0xA3,0x6F,0x13,0x40,0x24,0xD0,0xE3,0x6F + ,0x1A,0x60,0x2A,0x68,0x52,0x08,0x03,0xD3,0xBA,0x68 + ,0xA3,0x6F,0x9A,0x43,0xBA,0x60,0x00,0x26,0x3E,0x61 + ,0x7E,0x61,0xA6,0x66,0x0A,0x68,0x01,0x32,0x0A,0x60 + ,0x00,0xF0,0x23,0xF9,0x60,0x6E,0x00,0x28,0x04,0xD0 + ,0xE0,0x1D,0x45,0x30,0x00,0xF0,0x34,0xFB,0x00,0xE0 + ,0xE6,0x64,0x6E,0x60,0x20,0x1C,0x00,0xF0,0x90,0xFA + ,0x00,0x28,0x01,0xD0,0x00,0xF0,0xF6,0xFA,0x30,0x1C + ,0x9B,0xE0,0x00,0xF0,0x0E,0xF9,0x97,0xE0,0x03,0x94 + ,0x00,0x25,0x3D,0x61,0x01,0x92,0x4F,0x4A,0x02,0x93 + ,0x11,0x68,0x00,0x26,0x01,0x31,0x11,0x60,0x00,0xF0 + ,0x01,0xF9,0xC0,0x20,0x00,0xF0,0xFE,0xF8,0xF9,0x68 + ,0x00,0x29,0x0A,0xD0,0x00,0x21,0xF9,0x60,0x03,0x9C + ,0x7B,0x69,0x02,0x93,0xB9,0x68,0x01,0x9A,0x11,0x43 + ,0x01,0x91,0x00,0x2C,0x46,0xD0,0xE3,0x1D,0x79,0x33 + ,0x04,0x93,0x19,0x68,0x00,0x91,0x89,0x08,0x06,0xD3 + ,0xA1,0x6F,0x01,0x9A,0x0A,0x40,0x8A,0x42,0x07,0xD1 + ,0x04,0xE0,0x6F,0xE0,0xA1,0x6F,0x01,0x9A,0x11,0x40 + ,0x01,0xD0,0x00,0x21,0x00,0xE0,0x07,0x21,0x22,0x6F + ,0x00,0x29,0x28,0xD1,0x01,0x99,0xE3,0x6F,0x19,0x60 + ,0x00,0x99,0x49,0x08,0x03,0xD3,0xB9,0x68,0xA3,0x6F + ,0x99,0x43,0xB9,0x60,0x21,0x6F,0xA1,0x42,0x02,0xD1 + ,0x00,0x21,0x03,0x91,0x08,0xE0,0x03,0x9B,0xA3,0x42 + ,0x00,0xD1,0x03,0x91,0x63,0x6F,0x4B,0x67,0x21,0x6F + ,0x63,0x6F,0x19,0x67,0x79,0x69,0x01,0x39,0x79,0x61 + ,0x00,0x21,0xA1,0x66,0x04,0x9B,0x00,0x2D,0x59,0x60 + ,0x03,0xD1,0x25,0x1C,0x26,0x1C,0x21,0x67,0x02,0xE0 + ,0x34,0x67,0x21,0x67,0x26,0x1C,0x02,0x9B,0x14,0x1C + ,0x01,0x3B,0x02,0x93,0x00,0x2B,0xA5,0xD1,0x03,0x99 + ,0x39,0x61,0x00,0xF0,0xA5,0xF8,0x00,0x2D,0x18,0xD0 + ,0x1C,0x4E,0x00,0x24,0x68,0x6E,0x2F,0x6F,0x00,0x28 + ,0x04,0xD0,0xE8,0x1D,0x45,0x30,0x00,0xF0,0xB1,0xFA + ,0x00,0xE0,0xEC,0x64,0xC0,0x20,0x00,0xF0,0x94,0xF8 + ,0x31,0x68,0x01,0x31,0x31,0x60,0x00,0xF0,0x8F,0xF8 + ,0x28,0x1C,0x00,0xF0,0x06,0xFA,0x3D,0x1C,0xE8,0xD1 + ,0xC0,0x20,0x00,0xF0,0x87,0xF8,0x0E,0x49,0x0A,0x68 + ,0x01,0x3A,0x0A,0x60,0x00,0xF0,0x81,0xF8,0x0C,0x48 + ,0x0C,0x49,0x00,0x68,0x09,0x68,0x88,0x42,0x05,0xD0 + ,0x0B,0x48,0x00,0x68,0x00,0x28,0x01,0xD1,0x00,0xF0 + ,0x59,0xFA,0x00,0x20,0x05,0xB0,0xF0,0xBD,0x79,0x69 + ,0x00,0x29,0x00,0xD1,0x5D,0xE7,0xF9,0x68,0x01,0x31 + ,0xF9,0x60,0x59,0xE7,0xD8,0x03,0x00,0x02,0xB8,0x03 + ,0x00,0x02,0xBC,0x03,0x00,0x02,0xC8,0x03,0x00,0x02 + ,0xFF,0xB5,0x07,0x1C,0xC0,0x20,0x0D,0x1C,0x09,0x9E + ,0x00,0xF0,0x5B,0xF8,0x02,0x9A,0x91,0x08,0x04,0xD3 + ,0xB9,0x68,0x29,0x40,0xA9,0x42,0x0E,0xD1,0x02,0xE0 + ,0xB9,0x68,0x29,0x40,0x0A,0xD0,0xB9,0x68,0x03,0x9B + ,0x00,0x24,0x19,0x60,0x02,0x9A,0x51,0x08,0x3D,0xD3 + ,0xB9,0x68,0xA9,0x43,0xB9,0x60,0x39,0xE0,0x07,0x24 + ,0x00,0x2E,0x36,0xD0,0x1D,0x49,0x0C,0x68,0x1D,0x49 + ,0xA1,0x66,0xA5,0x67,0xE5,0x1D,0x02,0x9A,0x79,0x35 + ,0x2A,0x60,0x03,0x9B,0xE3,0x67,0xE7,0x66,0x39,0x69 + ,0x00,0x29,0x09,0xD0,0x21,0x67,0x39,0x69,0x49,0x6F + ,0x61,0x67,0x39,0x69,0x49,0x6F,0x0C,0x67,0x39,0x69 + ,0x4C,0x67,0x02,0xE0,0x3C,0x61,0x24,0x67,0x64,0x67 + ,0x79,0x69,0x01,0x31,0x79,0x61,0x07,0x21,0x21,0x63 + ,0x01,0x21,0xA1,0x63,0x0E,0x49,0x0A,0x68,0x01,0x32 + ,0x0A,0x60,0xE6,0x64,0x00,0xF0,0x18,0xF8,0x01,0x23 + ,0xDE,0x42,0x03,0xD0,0xE0,0x1D,0x45,0x30,0x00,0xF0 + ,0x97,0xFA,0x20,0x1C,0x00,0xF0,0xCE,0xFA,0x68,0x68 + ,0x04,0xB0,0xF0,0xBD,0x00,0xF0,0x09,0xF8,0x20,0x1C + ,0xF9,0xE7,0x00,0x00,0xB8,0x03,0x00,0x02,0xA1,0x46 + ,0x00,0x00,0xD8,0x03,0x00,0x02,0x00,0xA3,0x18,0x47 + ,0x00,0x30,0x0F,0xE1,0x3F,0x20,0xA0,0xE3,0x02,0x10 + ,0x03,0xE0,0x00,0x10,0x81,0xE1,0x01,0xF0,0x21,0xE1 + ,0x02,0x00,0xC3,0xE1,0x1E,0xFF,0x2F,0xE1,0x00,0xB5 + ,0xFF,0xF7,0xD7,0xFB,0xFF,0xF7,0xB1,0xFD,0x00,0xF0 + ,0x8F,0xFB,0x00,0xF0,0x95,0xFB,0x00,0xF0,0xF5,0xF9 + ,0x00,0xF0,0x99,0xFB,0x00,0xF0,0x9F,0xFB,0x00,0xBD + ,0x00,0xA0,0x00,0x47,0x13,0x00,0xA0,0xE3,0x00,0xF0 + ,0x21,0xE1,0x48,0x10,0x9F,0xE5,0x00,0x00,0x91,0xE5 + ,0x00,0x00,0x50,0xE3,0xFC,0xFF,0xFF,0x0A,0xD3,0x20 + ,0xA0,0xE3,0x02,0xF0,0x21,0xE1,0x34,0x10,0x9F,0xE5 + ,0x00,0x00,0x81,0xE5,0x04,0x20,0x90,0xE5,0x18,0x30 + ,0x90,0xE5,0x01,0x20,0x82,0xE2,0x04,0x20,0x80,0xE5 + ,0x20,0x20,0x9F,0xE5,0x08,0xD0,0x90,0xE5,0x00,0x30 + ,0x82,0xE5,0x03,0x00,0xBD,0xE8,0x00,0x00,0x50,0xE3 + ,0x01,0xF0,0x6F,0xE1,0xF0,0x80,0xFD,0x08,0xFF,0xDF + ,0xFD,0xE8,0xBC,0x03,0x00,0x02,0xB8,0x03,0x00,0x02 + ,0x40,0x04,0x00,0x02,0xF0,0xB5,0x82,0xB0,0x4E,0x4B + ,0x98,0x42,0x01,0xD0,0x02,0xB0,0xF0,0xBD,0x00,0x20 + ,0x00,0x90,0x00,0x26,0xC0,0x20,0xFF,0xF7,0x9F,0xFF + ,0x4A,0x4D,0x29,0x68,0x09,0x68,0x01,0x91,0x00,0x29 + ,0x01,0xD0,0x01,0xAA,0x8A,0x61,0x29,0x68,0x46,0x4C + ,0x0E,0x60,0x29,0x68,0x04,0x31,0x29,0x60,0x22,0x68 + ,0x91,0x42,0x02,0xD1,0x43,0x49,0x09,0x68,0x29,0x60 + ,0x43,0x49,0x0E,0x60,0xFF,0xF7,0x87,0xFF,0xC0,0x20 + ,0xFF,0xF7,0x84,0xFF,0x01,0x99,0x00,0x29,0x5C,0xD0 + ,0x01,0x9C,0x21,0x69,0xA1,0x42,0x01,0xD1,0x00,0x21 + ,0x08,0xE0,0x62,0x69,0x4A,0x61,0x21,0x69,0x62,0x69 + ,0x11,0x61,0x22,0x69,0x01,0xA9,0x91,0x61,0x21,0x69 + ,0x01,0x91,0x21,0x68,0x20,0x29,0x03,0xD9,0x20,0x39 + ,0x21,0x60,0x00,0x25,0x04,0xE0,0x27,0x1D,0xA2,0xCF + ,0x21,0x60,0x00,0x29,0x03,0xD0,0x69,0x46,0xA1,0x61 + ,0x24,0x61,0x00,0xE0,0xA6,0x61,0xFF,0xF7,0x5E,0xFF + ,0x00,0x2D,0x02,0xD0,0x38,0x1C,0x00,0xF0,0xFC,0xFB + ,0xC0,0x20,0xFF,0xF7,0x56,0xFF,0xA2,0x69,0x69,0x46 + ,0x8A,0x42,0x25,0xD1,0x21,0x68,0x20,0x29,0x01,0xD9 + ,0x1F,0x21,0x00,0xE0,0x01,0x39,0x20,0x4D,0x89,0x00 + ,0x2A,0x68,0x89,0x18,0x1F,0x4A,0x12,0x68,0x91,0x42 + ,0x07,0xD3,0x89,0x1A,0x00,0xD5,0x03,0x31,0x1D,0x4A + ,0x89,0x10,0x12,0x68,0x89,0x00,0x89,0x18,0x0A,0x68 + ,0x00,0x2A,0x08,0xD0,0x22,0x61,0x0A,0x68,0x52,0x69 + ,0x62,0x61,0x14,0x61,0x0A,0x68,0x54,0x61,0xA1,0x61 + ,0x03,0xE0,0x24,0x61,0xA1,0x61,0x64,0x61,0x0C,0x60 + ,0xFF,0xF7,0x2A,0xFF,0xC0,0x20,0xFF,0xF7,0x27,0xFF + ,0x01,0x99,0x00,0x29,0xA2,0xD1,0x0F,0x49,0x09,0x68 + ,0x00,0x29,0x10,0xD1,0x0E,0x4C,0x03,0x21,0x22,0x68 + ,0x11,0x63,0x22,0x68,0x01,0x21,0x91,0x63,0x0C,0x4A + ,0x11,0x68,0x01,0x31,0x11,0x60,0xFF,0xF7,0x13,0xFF + ,0x20,0x68,0x00,0xF0,0xD0,0xF9,0x6C,0xE7,0xFF,0xF7 + ,0x0D,0xFF,0x69,0xE7,0x4D,0x49,0x54,0x41,0x50,0x04 + ,0x00,0x02,0x4C,0x04,0x00,0x02,0x48,0x04,0x00,0x02 + ,0x54,0x04,0x00,0x02,0xB8,0x03,0x00,0x02,0xD8,0x03 + ,0x00,0x02,0x90,0xB5,0x07,0x1C,0x00,0x6B,0x04,0x28 + ,0x0C,0xD1,0xC0,0x20,0xFF,0xF7,0xF6,0xFE,0x0A,0x49 + ,0x0A,0x68,0x01,0x32,0x0A,0x60,0xFF,0xF7,0xF0,0xFE + ,0x38,0x1C,0x00,0xF0,0x67,0xF8,0x90,0xBD,0xC0,0x20 + ,0xFF,0xF7,0xE9,0xFE,0xBC,0x6E,0xFF,0xF7,0xE6,0xFE + ,0x00,0x2C,0xF6,0xD0,0x38,0x1C,0x00,0xF0,0x83,0xFB + ,0x90,0xBD,0xD8,0x03,0x00,0x02,0x80,0xB5,0x0C,0x4F + ,0x39,0x68,0x88,0x6C,0x49,0x6C,0x00,0xF0,0x76,0xFB + ,0xC0,0x20,0xFF,0xF7,0xD4,0xFE,0x3A,0x68,0x01,0x21 + ,0x11,0x63,0x3A,0x68,0x91,0x63,0x06,0x49,0x0A,0x68 + ,0x01,0x32,0x0A,0x60,0xFF,0xF7,0xC9,0xFE,0x38,0x68 + ,0x00,0xF0,0x86,0xF9,0x80,0xBD,0x00,0x00,0xB8,0x03 + ,0x00,0x02,0xD8,0x03,0x00,0x02,0x00,0xA3,0x18,0x47 + ,0x10,0x20,0x90,0xE5,0x03,0x20,0xC2,0xE3,0x48,0x20 + ,0x42,0xE2,0x01,0x30,0xA0,0xE3,0x00,0x30,0x82,0xE5 + ,0x33,0x30,0xA0,0xE3,0x04,0x30,0x82,0xE5,0x00,0x30 + ,0xA0,0xE3,0x08,0x30,0x82,0xE5,0x0C,0x30,0x82,0xE5 + ,0x10,0x30,0x82,0xE5,0x14,0x30,0x82,0xE5,0x18,0x30 + ,0x82,0xE5,0x1C,0x30,0x82,0xE5,0x20,0x30,0x82,0xE5 + ,0x24,0x30,0x82,0xE5,0x28,0x30,0x82,0xE5,0x2C,0x30 + ,0x82,0xE5,0x0C,0x30,0x90,0xE5,0x30,0x30,0x82,0xE5 + ,0x00,0x30,0xA0,0xE3,0x34,0x30,0x82,0xE5,0x38,0x30 + ,0x82,0xE5,0x3C,0x30,0x82,0xE5,0x40,0x10,0x82,0xE5 + ,0x44,0x30,0x82,0xE5,0x08,0x20,0x80,0xE5,0x1E,0xFF + ,0x2F,0xE1,0xF0,0xB5,0x00,0x24,0x07,0x1C,0xC0,0x20 + ,0xFF,0xF7,0x80,0xFE,0x29,0x49,0x2A,0x4D,0x0A,0x68 + ,0x01,0x3A,0x0A,0x60,0xBA,0x6B,0x00,0x21,0x00,0x2A + ,0x06,0xD0,0x3A,0x6B,0x01,0x2A,0x39,0xD0,0x02,0x2A + ,0x37,0xD0,0xB9,0x63,0x07,0xE0,0x3A,0x6B,0x00,0x2A + ,0x32,0xD0,0x7A,0x6B,0x00,0x2A,0x03,0xD0,0x79,0x63 + ,0x03,0x21,0x39,0x63,0x2B,0xE0,0x39,0x63,0xF9,0x6A + ,0x1D,0x4B,0x8E,0x00,0x9A,0x59,0x00,0x2A,0x05,0xD0 + ,0x51,0x6A,0x0F,0x62,0x57,0x62,0x79,0x62,0x3A,0x62 + ,0x1E,0xE0,0x9F,0x51,0x3F,0x62,0x7F,0x62,0x17,0x4A + ,0x3B,0x6C,0x16,0x68,0x33,0x43,0x13,0x60,0x2A,0x68 + ,0x15,0x4B,0x00,0x2A,0x02,0xD1,0x2F,0x60,0x19,0x60 + ,0x0F,0xE0,0x1E,0x68,0xB1,0x42,0x0C,0xD2,0x19,0x60 + ,0xD3,0x6B,0x8B,0x42,0x08,0xD9,0xD1,0x6A,0x8B,0x42 + ,0x04,0xD0,0x0E,0x49,0x12,0x6C,0x0B,0x68,0x1A,0x43 + ,0x0A,0x60,0x2F,0x60,0xFF,0xF7,0x38,0xFE,0x0B,0x48 + ,0x00,0x68,0x29,0x68,0x88,0x42,0x04,0xD0,0x0A,0x48 + ,0x00,0x68,0x00,0x28,0x00,0xD1,0x01,0x24,0x20,0x1C + ,0xF0,0xBD,0xD8,0x03,0x00,0x02,0xBC,0x03,0x00,0x02 + ,0xE0,0x0B,0x00,0x02,0xCC,0x03,0x00,0x02,0xD4,0x03 + ,0x00,0x02,0xD0,0x03,0x00,0x02,0xB8,0x03,0x00,0x02 + ,0xC8,0x03,0x00,0x02,0x00,0xA0,0x00,0x47,0x00,0x00 + ,0xA0,0xE3,0x00,0x10,0x0F,0xE1,0x20,0x10,0x81,0xE3 + ,0xF3,0x40,0x2D,0xE9,0xD3,0x20,0xA0,0xE3,0x02,0xF0 + ,0x21,0xE1,0x2C,0x30,0x9F,0xE5,0x00,0x00,0x93,0xE5 + ,0x28,0x20,0x9F,0xE5,0x00,0x10,0x92,0xE5,0x08,0xD0 + ,0x80,0xE5,0x00,0x40,0xA0,0xE3,0x00,0x00,0x51,0xE3 + ,0x02,0x00,0x00,0x0A,0x1C,0x10,0x90,0xE5,0x00,0x40 + ,0x82,0xE5,0x18,0x10,0x80,0xE5,0x00,0x40,0x83,0xE5 + ,0x0A,0xFF,0xFF,0xEA,0xB8,0x03,0x00,0x02,0x40,0x04 + ,0x00,0x02,0x02,0x48,0x00,0x21,0x01,0x60,0x41,0x60 + ,0xF7,0x46,0x00,0x00,0x6C,0x04,0x00,0x02,0x90,0xB5 + ,0x07,0x1C,0xC0,0x20,0xFF,0xF7,0xE3,0xFD,0xB9,0x69 + ,0x00,0x24,0x00,0x29,0x16,0xD0,0x3A,0x69,0xBA,0x42 + ,0x04,0xD1,0x0A,0x68,0xBA,0x42,0x0F,0xD1,0x0C,0x60 + ,0x0D,0xE0,0x79,0x69,0x51,0x61,0x39,0x69,0x7A,0x69 + ,0x11,0x61,0xB9,0x69,0x0A,0x68,0xBA,0x42,0x04,0xD1 + ,0x3A,0x69,0x91,0x61,0x39,0x69,0xBA,0x69,0x11,0x60 + ,0xBC,0x61,0xFF,0xF7,0xC6,0xFD,0x20,0x1C,0x90,0xBD + ,0xB0,0xB5,0x07,0x1C,0xC4,0x6E,0xC0,0x20,0xFF,0xF7 + ,0xBE,0xFD,0xB9,0x6E,0x00,0x29,0x38,0xD0,0x00,0x2C + ,0x36,0xD0,0x21,0x68,0x1C,0x4B,0x99,0x42,0x32,0xD1 + ,0x00,0x25,0xBD,0x66,0x39,0x6F,0xB9,0x42,0x01,0xD1 + ,0x25,0x61,0x06,0xE0,0x21,0x61,0x79,0x6F,0x3A,0x6F + ,0x51,0x67,0x39,0x6F,0x7A,0x6F,0x11,0x67,0x61,0x69 + ,0x01,0x39,0x61,0x61,0x39,0x6B,0x07,0x29,0x10,0xD1 + ,0xFA,0x1D,0x79,0x32,0x51,0x60,0x10,0x49,0x0A,0x68 + ,0x01,0x32,0x0A,0x60,0xFF,0xF7,0x98,0xFD,0x38,0x1C + ,0xFF,0xF7,0x0F,0xFF,0x00,0x28,0x04,0xD0,0xFF,0xF7 + ,0x75,0xFF,0x01,0xE0,0xFF,0xF7,0x8E,0xFD,0x78,0x6E + ,0x00,0x28,0x04,0xD0,0xF8,0x1D,0x45,0x30,0xFF,0xF7 + ,0x9F,0xFF,0x00,0xE0,0xFD,0x64,0xC0,0x20,0xFF,0xF7 + ,0x82,0xFD,0xFF,0xF7,0x80,0xFD,0xB0,0xBD,0x00,0x00 + ,0x4E,0x44,0x56,0x44,0xD8,0x03,0x00,0x02,0x80,0xB5 + ,0x07,0x1C,0xC0,0x20,0xFF,0xF7,0x75,0xFD,0x39,0x68 + ,0x00,0x29,0x27,0xD0,0xBA,0x69,0x00,0x2A,0x24,0xD1 + ,0x20,0x29,0x01,0xD9,0x1F,0x21,0x00,0xE0,0x01,0x39 + ,0x11,0x4A,0x89,0x00,0x12,0x68,0x89,0x18,0x10,0x4A + ,0x12,0x68,0x91,0x42,0x07,0xD3,0x89,0x1A,0x00,0xD5 + ,0x03,0x31,0x0E,0x4A,0x89,0x10,0x12,0x68,0x89,0x00 + ,0x89,0x18,0x0A,0x68,0x00,0x2A,0x08,0xD0,0x3A,0x61 + ,0x0A,0x68,0x52,0x69,0x7A,0x61,0x17,0x61,0x0A,0x68 + ,0x57,0x61,0xB9,0x61,0x03,0xE0,0x3F,0x61,0xB9,0x61 + ,0x7F,0x61,0x0F,0x60,0xFF,0xF7,0x48,0xFD,0x00,0x20 + ,0x80,0xBD,0x50,0x04,0x00,0x02,0x4C,0x04,0x00,0x02 + ,0x48,0x04,0x00,0x02,0xF0,0xB5,0x05,0x1C,0xC0,0x20 + ,0xFF,0xF7,0x3B,0xFD,0x67,0x49,0x67,0x4C,0x0A,0x68 + ,0x67,0x4F,0x01,0x3A,0x0A,0x60,0xAA,0x6B,0x00,0x2A + ,0x74,0xD0,0x00,0x26,0xAE,0x63,0xEA,0x6A,0x2B,0x6A + ,0xAB,0x42,0x26,0xD0,0x69,0x6A,0x59,0x62,0x29,0x6A + ,0x6B,0x6A,0x19,0x62,0x91,0x00,0x5F,0x4A,0x53,0x58 + ,0xAB,0x42,0x11,0xD1,0x2B,0x6A,0x53,0x50,0x5D,0x49 + ,0x0B,0x68,0x00,0x2B,0x02,0xD0,0x2E,0x6C,0xB3,0x43 + ,0x0B,0x60,0x5B,0x49,0x0B,0x68,0x9D,0x42,0x04,0xD1 + ,0x5A,0x4B,0x1B,0x68,0x9B,0x00,0xD2,0x58,0x0A,0x60 + ,0xFF,0xF7,0x0E,0xFD,0x55,0x49,0x38,0x68,0x09,0x68 + ,0x88,0x42,0x60,0xD0,0x20,0x68,0x00,0x28,0x5E,0xD1 + ,0x95,0xE0,0x00,0x26,0x4E,0x4B,0x92,0x00,0x9E,0x50 + ,0x2A,0x6C,0xD3,0x43,0x50,0x4A,0x16,0x68,0x33,0x40 + ,0x13,0x60,0x4B,0x4A,0x12,0x68,0x00,0x2A,0x03,0xD0 + ,0x2E,0x6C,0xB2,0x43,0x48,0x4E,0x32,0x60,0x1A,0x06 + ,0x12,0x0E,0x02,0xD0,0x49,0x4B,0x9A,0x5C,0x14,0xE0 + ,0x1B,0x0A,0x1A,0x06,0x12,0x0E,0x03,0xD0,0x46,0x4B + ,0x9A,0x5C,0x08,0x32,0x0C,0xE0,0x1B,0x0A,0x1A,0x06 + ,0x12,0x0E,0x03,0xD0,0x42,0x4B,0x9A,0x5C,0x10,0x32 + ,0x04,0xE0,0x1A,0x0A,0x29,0xD0,0x3F,0x4B,0x9A,0x5C + ,0x18,0x32,0x3B,0x4B,0x1A,0x60,0x39,0x4A,0x12,0x68 + ,0x95,0x42,0x4D,0xD1,0x38,0x4E,0x35,0x4B,0x32,0x68 + ,0x36,0x4D,0x92,0x00,0x9A,0x58,0x2A,0x60,0x33,0x4A + ,0x12,0x68,0x00,0x2A,0x42,0xD0,0x0E,0x1C,0x09,0x68 + ,0x01,0x31,0x31,0x60,0xFF,0xF7,0xC1,0xFC,0xC0,0x20 + ,0xFF,0xF7,0xBE,0xFC,0x00,0xE0,0x42,0xE0,0x31,0x68 + ,0x01,0x39,0x31,0x60,0x2A,0x49,0x0A,0x68,0x11,0x06 + ,0x09,0x0E,0x0D,0xD0,0x2B,0x4B,0x59,0x5C,0x1E,0xE0 + ,0x28,0x4B,0x20,0x21,0x19,0x60,0x25,0x49,0x00,0x26 + ,0x0E,0x60,0xFF,0xF7,0xA9,0xFC,0x38,0xE0,0x39,0xE0 + ,0x38,0xE0,0x13,0x0A,0x19,0x06,0x09,0x0E,0x03,0xD0 + ,0x22,0x4B,0x59,0x5C,0x08,0x31,0x0B,0xE0,0x1B,0x0A + ,0x19,0x06,0x09,0x0E,0x03,0xD0,0x1E,0x4B,0x59,0x5C + ,0x10,0x31,0x03,0xE0,0x19,0x0A,0x1C,0x4B,0x59,0x5C + ,0x18,0x31,0x15,0x4B,0x89,0x00,0x59,0x58,0x17,0x4E + ,0xCB,0x6B,0x36,0x68,0xB3,0x42,0x05,0xD8,0x29,0x60 + ,0x09,0x6C,0x11,0x4B,0xC9,0x43,0x11,0x40,0x19,0x60 + ,0xFF,0xF7,0x82,0xFC,0x0F,0x4A,0x38,0x68,0x11,0x68 + ,0x88,0x42,0x0F,0xD0,0x20,0x68,0x00,0x28,0x0C,0xD1 + ,0x09,0xE0,0xFF,0xF7,0x77,0xFC,0x0A,0x49,0x38,0x68 + ,0x09,0x68,0x88,0x42,0x04,0xD0,0x20,0x68,0x00,0x28 + ,0x01,0xD1,0xFF,0xF7,0x51,0xFE,0xF0,0xBD,0xD8,0x03 + ,0x00,0x02,0xC8,0x03,0x00,0x02,0xB8,0x03,0x00,0x02 + ,0xE0,0x0B,0x00,0x02,0xD0,0x03,0x00,0x02,0xBC,0x03 + ,0x00,0x02,0xD4,0x03,0x00,0x02,0xCC,0x03,0x00,0x02 + ,0xE0,0x0A,0x00,0x02,0x02,0x48,0x00,0x21,0x01,0x60 + ,0x41,0x60,0xF7,0x46,0x00,0x00,0x74,0x04,0x00,0x02 + ,0x02,0x48,0x00,0x21,0x01,0x60,0x41,0x60,0xF7,0x46 + ,0x00,0x00,0x7C,0x04,0x00,0x02,0x02,0x48,0x00,0x21 + ,0x01,0x60,0x41,0x60,0xF7,0x46,0x00,0x00,0x84,0x04 + ,0x00,0x02,0x02,0x48,0x00,0x21,0x01,0x60,0x41,0x60 + ,0xF7,0x46,0x00,0x00,0x8C,0x04,0x00,0x02,0xBC,0x46 + ,0x03,0x1C,0x08,0x43,0x80,0x07,0x13,0xD1,0x12,0x1F + ,0x05,0xD3,0x01,0xCB,0x80,0xC9,0xC0,0x1B,0x04,0xD1 + ,0x12,0x1F,0xF9,0xD2,0xD2,0x1C,0x0C,0xD3,0x02,0xE0 + ,0x1B,0x1F,0x09,0x1F,0xD2,0x1C,0x18,0x78,0x0F,0x78 + ,0xC0,0x1B,0x04,0xD1,0x5B,0x1C,0x49,0x1C,0x52,0x1E + ,0xF7,0xD2,0x00,0x20,0x67,0x46,0xF7,0x46,0x43,0x1A + ,0x93,0x42,0x30,0xD3,0x84,0x46,0x8B,0x07,0x07,0xD0 + ,0x52,0x1E,0x29,0xD3,0x0B,0x78,0x03,0x70,0x40,0x1C + ,0x49,0x1C,0x8B,0x07,0xF7,0xD1,0x83,0x07,0x17,0xD1 + ,0x10,0x3A,0x05,0xD3,0xB0,0xB4,0xB8,0xC9,0xB8,0xC0 + ,0x10,0x3A,0xFB,0xD2,0xB0,0xBC,0x0C,0x32,0x0F,0xD3 + ,0x08,0xC9,0x08,0xC0,0x12,0x1F,0xFB,0xD2,0x0A,0xE0 + ,0x08,0xC9,0x03,0x70,0x1B,0x0A,0x43,0x70,0x1B,0x0A + ,0x83,0x70,0x1B,0x0A,0xC3,0x70,0x00,0x1D,0x12,0x1F + ,0xF4,0xD2,0xD2,0x1C,0x05,0xD3,0x0B,0x78,0x03,0x70 + ,0x49,0x1C,0x40,0x1C,0x52,0x1E,0xF9,0xD2,0x60,0x46 + ,0xF7,0x46,0x03,0x1C,0x0B,0x43,0x13,0x43,0x9B,0x07 + ,0x04,0xD1,0x12,0x1F,0x8B,0x58,0x83,0x50,0xFB,0xD1 + ,0xF7,0x46,0x52,0x1E,0x8B,0x5C,0x83,0x54,0xFB,0xD1 + ,0xF7,0x46,0x00,0x00,0x4B,0x08,0x02,0x1C,0x02,0xD1 + ,0x00,0xF0,0x79,0xF8,0x52,0x00,0x9A,0x42,0xFC,0xD9 + ,0x00,0x23,0x91,0x42,0x05,0xD2,0xDB,0x18,0x82,0x42 + ,0x06,0xD0,0x52,0x08,0x91,0x42,0xF9,0xD3,0x5B,0x41 + ,0x89,0x1A,0x82,0x42,0xF8,0xD1,0x18,0x1C,0xF7,0x46 + ,0x00,0x00,0xCB,0x17,0x59,0x40,0xC9,0x1A,0xC2,0x17 + ,0x50,0x40,0x80,0x1A,0x0C,0xB4,0x4B,0x08,0x02,0x1C + ,0x02,0xD1,0x00,0xF0,0x5A,0xF8,0x52,0x00,0x9A,0x42 + ,0xFC,0xD9,0x00,0x23,0x91,0x42,0x05,0xD2,0xDB,0x18 + ,0x82,0x42,0x06,0xD0,0x52,0x08,0x91,0x42,0xF9,0xD3 + ,0x5B,0x41,0x89,0x1A,0x82,0x42,0xF8,0xD1,0x18,0x1C + ,0x0C,0xBC,0x5A,0x40,0x50,0x40,0x80,0x1A,0x59,0x40 + ,0xC9,0x1A,0x70,0x47,0xB0,0xB5,0x0D,0x48,0x42,0x6E + ,0x03,0x6E,0x97,0x00,0xC1,0x1F,0x75,0x39,0x9C,0x00 + ,0x0C,0x59,0xCD,0x59,0x2C,0x19,0xCC,0x51,0x59,0x1E + ,0x36,0x23,0x00,0x29,0x01,0x66,0x03,0xDA,0x51,0x1E + ,0x41,0x66,0x03,0x66,0x03,0xE0,0x51,0x1E,0x41,0x66 + ,0x00,0xD5,0x43,0x66,0x60,0x00,0x40,0x08,0xB0,0xBD + ,0x10,0x05,0x00,0x02,0x80,0xB5,0x09,0x49,0x17,0x22 + ,0x0A,0x66,0x36,0x22,0x4A,0x66,0x07,0x4A,0x00,0x21 + ,0x03,0x0C,0x1F,0x18,0x8B,0x00,0xD7,0x50,0x05,0x4B + ,0x01,0x31,0x58,0x43,0x05,0x4B,0xC0,0x18,0x37,0x29 + ,0xF4,0xDB,0x80,0xBD,0x10,0x05,0x00,0x02,0x94,0x04 + ,0x00,0x02,0xCD,0x0D,0x01,0x00,0xE1,0x19,0xD6,0x66 + ,0x00,0x47,0x08,0x47,0x10,0x47,0x18,0x47,0x20,0x47 + ,0x28,0x47,0x30,0x47,0x38,0x47,0x78,0x47,0x00,0x00 + ,0x2C,0xC0,0x9F,0xE5,0xFF,0x7F,0x8C,0xE8,0x3C,0xC0 + ,0x8C,0xE2,0x0C,0x00,0x8F,0xE2,0x3C,0x10,0x4C,0xE2 + ,0x04,0xE0,0x4E,0xE2,0x00,0xE0,0x8C,0xE5,0x6F,0xED + ,0xFF,0xEA,0x20,0x00,0x00,0x80,0x44,0x69,0x76,0x69 + ,0x64,0x65,0x20,0x62,0x79,0x20,0x7A,0x65,0x72,0x6F + ,0x00,0x00,0x78,0x05,0x00,0x02,0x78,0x47,0x00,0x00 + ,0x01,0xE0,0x8E,0xE3,0x04,0x00,0xA0,0xE3,0x00,0x00 + ,0x90,0xE5,0xFF,0x04,0x00,0xE2,0xEA,0x04,0x50,0xE3 + ,0x01,0x00,0xA0,0x03,0x00,0x00,0xA0,0x13,0x1E,0xFF + ,0x2F,0xE1,0x78,0x47,0x00,0x00,0x01,0xE0,0x8E,0xE3 + ,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0x00,0x00,0x01,0xE0 + ,0x8E,0xE3,0x05,0x0B,0x40,0xE2,0x1B,0x0B,0x50,0xE3 + ,0x01,0x00,0xA0,0x33,0x00,0x00,0xA0,0x23,0x1E,0xFF + ,0x2F,0xE1,0x78,0x47,0x00,0x00,0x01,0xE0,0x8E,0xE3 + ,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0x00,0x00,0x01,0xE0 + ,0x8E,0xE3,0x1E,0xFF,0x2F,0xE1,0x78,0x47,0x00,0x00 + ,0x01,0xE0,0x8E,0xE3,0x00,0x00,0xA0,0xE3,0x1E,0xFF + ,0x2F,0xE1,0x78,0x47,0x00,0x00,0x01,0xE0,0x8E,0xE3 + ,0x00,0x00,0x8F,0xE2,0x1E,0xFF,0x2F,0xE1,0x55,0x6E + ,0x6B,0x6E,0x6F,0x77,0x6E,0x20,0x45,0x72,0x72,0x6F + ,0x72,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x72 + ,0x61,0x6E,0x63,0x68,0x20,0x54,0x68,0x72,0x6F,0x75 + ,0x67,0x68,0x20,0x5A,0x65,0x72,0x6F,0x00,0x01,0x00 + ,0x02,0x00,0x55,0x6E,0x64,0x65,0x66,0x69,0x6E,0x65 + ,0x64,0x20,0x49,0x6E,0x73,0x74,0x72,0x75,0x63,0x74 + ,0x69,0x6F,0x6E,0x00,0x00,0x00,0x02,0x00,0x02,0x00 + ,0x55,0x6E,0x64,0x65,0x66,0x69,0x6E,0x65,0x64,0x20 + ,0x53,0x57,0x49,0x20,0x49,0x6E,0x73,0x74,0x72,0x75 + ,0x63,0x74,0x69,0x6F,0x6E,0x00,0x00,0x00,0x03,0x00 + ,0x02,0x00,0x50,0x72,0x65,0x66,0x65,0x74,0x63,0x68 + ,0x20,0x41,0x62,0x6F,0x72,0x74,0x00,0x00,0x04,0x00 + ,0x02,0x00,0x44,0x61,0x74,0x61,0x20,0x41,0x62,0x6F + ,0x72,0x74,0x00,0x00,0x05,0x00,0x02,0x00,0x41,0x64 + ,0x64,0x72,0x65,0x73,0x73,0x20,0x45,0x78,0x63,0x65 + ,0x70,0x74,0x69,0x6F,0x6E,0x00,0x00,0x00,0x06,0x00 + ,0x02,0x00,0x55,0x6E,0x68,0x61,0x6E,0x64,0x6C,0x65 + ,0x64,0x20,0x49,0x6E,0x74,0x65,0x72,0x72,0x75,0x70 + ,0x74,0x00,0x07,0x00,0x02,0x00,0x55,0x6E,0x68,0x61 + ,0x6E,0x64,0x6C,0x65,0x64,0x20,0x46,0x61,0x73,0x74 + ,0x20,0x49,0x6E,0x74,0x65,0x72,0x72,0x75,0x70,0x74 + ,0x00,0x00,0x00,0x00,0x44,0x4C,0x00,0x00,0x5C,0x4C + ,0x00,0x00,0x78,0x4C,0x00,0x00,0x98,0x4C,0x00,0x00 + ,0xAC,0x4C,0x00,0x00,0xBC,0x4C,0x00,0x00,0xD4,0x4C + ,0x00,0x00,0xEC,0x4C,0x00,0x00,0x28,0x20,0x4F,0xE2 + ,0x00,0x01,0x92,0xE7,0x07,0xED,0xFF,0xEA,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x40,0x2D,0xE9,0x50,0x00,0x9F,0xE5 + ,0x50,0x10,0x9F,0xE5,0x01,0x20,0xA0,0xE1,0x4C,0x40 + ,0x9F,0xE5,0x04,0x20,0x82,0xE0,0x05,0x00,0x00,0xEB + ,0x44,0x20,0x9F,0xE5,0x44,0x00,0x9F,0xE5,0x00,0x10 + ,0xA0,0xE1,0x02,0x10,0x81,0xE0,0x05,0x00,0x00,0xEB + ,0x00,0x80,0xBD,0xE8,0x02,0x00,0x51,0xE1,0x04,0x30 + ,0x90,0x34,0x04,0x30,0x81,0x34,0xFB,0xFF,0xFF,0x3A + ,0x0E,0xF0,0xA0,0xE1,0x00,0x20,0xA0,0xE3,0x01,0x00 + ,0x50,0xE1,0x04,0x20,0x80,0x34,0xFB,0xFF,0xFF,0x3A + ,0x0E,0xF0,0xA0,0xE1,0xE8,0x4D,0x00,0x00,0x00,0x00 + ,0x00,0x02,0xB8,0x05,0x00,0x00,0xB8,0x07,0x00,0x00 + ,0xB8,0x05,0x00,0x02,0x00,0x00,0x00,0x00,0x14,0x00 + ,0x0A,0x00,0x90,0x00,0x30,0x00,0x08,0x06,0x07,0x00 + ,0x82,0x84,0x8B,0x96,0x09,0x04,0x02,0x41,0x00,0x00 + ,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11 + ,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x04,0xAC,0x6C + ,0x32,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x64,0x00,0x30,0x75,0x64,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x04,0xAC,0x6C + ,0x32,0x70,0x55,0x4E,0x48,0x00,0x00,0x00,0x00,0x00 + ,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,0x01,0x00,0x00,0x00,0x00 + ,0x45,0x55,0x00,0x00,0x00,0x00,0x00,0xFA,0x00,0x00 + ,0x00,0xFA,0x00,0x00,0x2A,0x09,0x2A,0x09,0x1F,0x00 + ,0xFF,0x00,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x02,0x00,0x41,0x54,0x4D,0x45,0x4C,0x5F + ,0x41,0x50,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,0x01,0x00,0x05,0x00,0x00,0x00,0x00,0x08 + ,0x00,0x00,0x00,0x00,0x01,0x01,0x00,0x64,0x02,0x10 + ,0x1E,0x1E,0x1E,0x1E,0x00,0x00,0x28,0x28,0x28,0x00 + ,0x00,0x32,0x3C,0x46,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,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,0x01 + ,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01 + ,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01 + ,0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x01,0x00,0x01 + ,0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x00,0x01,0x01 + ,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x01,0x00 + ,0x01,0x01,0x01,0x00,0x01,0x01,0x01,0x00,0x01,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,0x02,0x04,0x08,0x10,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0x01 + ,0x00,0x02,0x00,0x00,0x00,0x07,0x03,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,0x12,0x01,0x10,0x01,0xFE,0x01 + ,0x00,0x08,0xEB,0x03,0x05,0x76,0x00,0x01,0x00,0x00 + ,0x00,0x01,0x09,0x02,0x20,0x00,0x01,0x01,0x00,0x80 + ,0xFA,0x09,0x04,0x00,0x00,0x02,0xFF,0x00,0xFF,0x00 + ,0x07,0x05,0x85,0x02,0x40,0x00,0x00,0x07,0x05,0x02 + ,0x02,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xFF,0x07,0xFF,0x07,0xFF,0x1F + ,0x00,0x06,0x00,0x1E,0x00,0x20,0xFF,0x3F,0xFC,0x01 + ,0x01,0x01,0x01,0x0A,0x0A,0x0E,0x01,0x03,0x00,0x00 + ,0x00,0x00,0xAA,0xAA,0x03,0x00,0x00,0x00,0xAA,0xAA + ,0x03,0x00,0x00,0xF8,0x37,0x81,0xF3,0x80,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00 + ,0x58,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0xD8,0x05 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00 + ,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00 + ,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00 + ,0x00,0x00,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00 + ,0x04,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0xF6,0x07 + ,0x00,0x00,0xFB,0x07,0x00,0x00,0x00,0x08,0x00,0x00 + ,0x05,0x08,0x00,0x00,0x0A,0x08,0x00,0x00,0x0F,0x08 + ,0x00,0x00,0x14,0x08,0x00,0x00,0x19,0x08,0x00,0x00 + ,0x1E,0x08,0x00,0x00,0x23,0x08,0x00,0x00,0x28,0x08 + ,0x00,0x00,0x2D,0x08,0x00,0x00,0x32,0x08,0x00,0x00 + ,0x3E,0x08,0x00,0x00,0x43,0x6F,0x70,0x79,0x72,0x69 + ,0x67,0x68,0x74,0x20,0x28,0x63,0x29,0x20,0x31,0x39 + ,0x39,0x36,0x2D,0x32,0x30,0x30,0x30,0x20,0x45,0x78 + ,0x70,0x72,0x65,0x73,0x73,0x20,0x4C,0x6F,0x67,0x69 + ,0x63,0x20,0x49,0x6E,0x63,0x2E,0x20,0x2A,0x20,0x54 + ,0x68,0x72,0x65,0x61,0x64,0x58,0x20,0x54,0x48,0x55 + ,0x4D,0x42,0x2D,0x46,0x2F,0x41,0x52,0x4D,0x20,0x56 + ,0x65,0x72,0x73,0x69,0x6F,0x6E,0x20,0x47,0x33,0x2E + ,0x30,0x66,0x2E,0x33,0x2E,0x30,0x62,0x20,0x2A,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x47,0x2D,0x47,0x42,0x2D,0x47,0x4C,0x2D + ,0x4D,0x2D,0x44,0x2D,0x44,0x4C,0x2D,0x4B,0x4D,0x4C + ,0x2D,0x43,0x4D,0x52,0x2D,0x48,0x4D,0x52,0x2D,0x4D + ,0x4C,0x32,0x2D,0x47,0x5A,0x2D,0x4B,0x48,0x32,0x2D + ,0x43,0x4D,0x2D,0x52,0x50,0x2D,0x54,0x43,0x2D,0x4E + ,0x48,0x2D,0x54,0x44,0x2D,0x41,0x50,0x2D,0x48,0x41 + ,0x2D,0x47,0x46,0x2D,0x44,0x44,0x2D,0x41,0x54,0x2D + ,0x4D,0x46,0x2D,0x4D,0x53,0x2D,0x44,0x57,0x2D,0x55 + ,0x53,0x41,0x2D,0x43,0x41,0x2D,0x53,0x44,0x2D,0x53 + ,0x44,0x53,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,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 + ,0x85,0x8E,0xD7,0x66,0x09,0x8C,0xD3,0xD5,0xF5,0xD8 + ,0x09,0x0A,0xFB,0x87,0x1F,0xBF,0x67,0xF7,0x8D,0xCB + ,0x69,0x07,0xF7,0xBD,0x34,0x12,0x3D,0x50,0xC8,0x84 + ,0x4F,0x7F,0xA3,0x02,0xDE,0x61,0xAE,0x8D,0x40,0xA7 + ,0xE8,0xBD,0x24,0x7A,0xEA,0xA2,0x15,0x51,0x57,0x2E + ,0xE6,0xBB,0xFF,0x7F,0xD5,0xF6,0x7A,0x83,0x2A,0x63 + ,0x77,0x1D,0x86,0x13,0x7C,0x2E,0x9F,0xE1,0x05,0x57 + ,0x5F,0x69,0x2E,0x6B,0x93,0x87,0x6E,0x9A,0xA1,0x50 + ,0x94,0x0E,0x8B,0x72,0xAE,0x55,0xCC,0xC5,0xB1,0x8A + ,0x0A,0xB1,0xD7,0x72,0x6F,0x85,0x17,0x5C,0x22,0xD0 + ,0xA3,0xFD,0xC4,0x51,0x61,0x98,0xED,0x89,0x9F,0x82 + ,0xDB,0xF1,0x9D,0xC5,0xFB,0xBC,0x89,0xC1,0xEE,0x83 + ,0x59,0xB1,0x59,0x63,0x30,0x5C,0x50,0xCC,0xC9,0x5A + ,0xBC,0x9C,0xF9,0x30,0xE2,0x2F,0x42,0x5E,0xF6,0x39 + ,0xD2,0x7B,0x15,0x75,0xFB,0x58,0xC1,0x40,0x3E,0x9A + ,0xEB,0x27,0xD9,0xA2,0x82,0xC5,0xC2,0xD6,0x69,0x05 + ,0xB3,0x30,0x8E,0xED,0xD2,0xDD,0x83,0x10,0x41,0xA4 + ,0x1D,0x1F,0x15,0xE2,0x60,0x56,0xC5,0x2F,0xF3,0x04 + ,0x99,0xEF,0x8E,0xE1,0x08,0x32,0x59,0x4A,0x4C,0xED + ,0x7B,0x5B,0x40,0xFC,0x02,0x81,0xD9,0x41,0x53,0x51 + ,0xFA,0x3D,0xFF,0xAC,0xB5,0x6C,0x09,0x6D,0x1D,0xCC + ,0xB3,0x2B,0xFF,0x15,0x3D,0x25,0x17,0x00,0x00,0x00 + ,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 + ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; @@ -0,0 +1,39 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <errno.h> + +#define MAX_BUF 0x8000 + +int main(int argc, char *argv[]) +{ + unsigned char *buf; + FILE *fptr; + int size, i; + + if(argc == 2){ + buf = (char *)malloc(MAX_BUF); + fptr = fopen(argv[1], "r"); + if(fptr){ + printf("unsigned char InternalRFMD[] = {"); + + size = fread(buf, 1, MAX_BUF, fptr); + + for(i = 0; i < size; i++){ + if((i % 10) == 0) + printf("\n "); + printf("0x%02x,", buf[i]); + // printf("0x%02x,0x%02x,", buf[i+1], buf[i]); + } + fclose(fptr); + + printf("\n};\n"); + }else{ + fprintf(stderr, "could not open %s: %s\n", argv[1], strerror(errno)); + exit(EXIT_FAILURE); + } + free(buf); + } + exit(0); +} diff --git a/usbdfu.c b/usbdfu.c new file mode 100644 index 0000000..9a9cf99 --- /dev/null +++ b/usbdfu.c @@ -0,0 +1,735 @@ +/* -*- linux-c -*- */ +/* + * USB Device Firmware Uploader + * + * Copyright (c) 2003 Oliver Kurth <oku@masqmail.cx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * 2003_01_19 0.1: + * - initial release + * + * TODO: + * - make it more generic, so that it works with devices other than + * at76c503 + */ + +#include <linux/config.h> +#include <linux/kernel.h> +#include <linux/sched.h> +#include <linux/signal.h> +#include <linux/errno.h> +#include <linux/poll.h> +#include <linux/init.h> +#include <linux/slab.h> +#include <linux/fcntl.h> +#include <linux/module.h> +#include <linux/spinlock.h> +#include <linux/list.h> +#include <linux/smp_lock.h> +#include <linux/usb.h> +#include "usbdfu.h" + +#ifdef CONFIG_USB_DEBUG +static int debug = 1; +#else +static int debug; +#endif + +/* Use our own dbg macro */ +#undef dbg +#define dbg(format, arg...) do { if (debug) printk(KERN_DEBUG __FILE__ ": " format "\n" , ## arg); } while (0) + + +/* Version Information */ +#define DRIVER_AUTHOR "Oliver Kurth oku@masqmail.cx" +#define DRIVER_DESC "USB Device Fimware Uploader (DFU)" + +/* Module paramaters */ +MODULE_PARM(debug, "i"); +MODULE_PARM_DESC(debug, "Debug enabled or not"); + +/* DFU states */ + +#define STATE_IDLE 0x00 +#define STATE_DETACH 0x01 +#define STATE_DFU_IDLE 0x02 +#define STATE_DFU_DOWNLOAD_SYNC 0x03 +#define STATE_DFU_DOWNLOAD_BUSY 0x04 +#define STATE_DFU_DOWNLOAD_IDLE 0x05 +#define STATE_DFU_MANIFEST_SYNC 0x06 +#define STATE_DFU_MANIFEST 0x07 +#define STATE_DFU_MANIFEST_WAIT_RESET 0x08 +#define STATE_DFU_UPLOAD_IDLE 0x09 +#define STATE_DFU_ERROR 0x0a + +/* DFU commands */ +#define DFU_DETACH 0 +#define DFU_DNLOAD 1 +#define DFU_UPLOAD 2 +#define DFU_GETSTATUS 3 +#define DFU_CLRSTATUS 4 +#define DFU_GETSTATE 5 +#define DFU_ABORT 6 + +struct dfu_status { + unsigned char bStatus; + unsigned char bwPollTimeout[3]; + unsigned char bState; + unsigned char iString; +} __attribute__ ((packed)); + +struct usbdfu_driver { + struct list_head list; + struct usb_driver *driver; + u8 *fw_buf; + u32 fw_buf_len; +}; + +/* driver independent download context */ +struct dfu_ctx { + struct usb_device *udev; + u8 dfu_state; + struct dfu_status dfu_status; + u8 *buf; +}; + +#define KEVENT_FLAG_AGAIN 1 +#define KEVENT_FLAG_REMAP 2 +#define KEVENT_FLAG_RESET 3 + +/* Structure to hold all of our device specific stuff */ +struct usbdfu { + struct usb_device * udev; /* save off the usb device pointer */ + struct usb_interface * interface; /* the interface for this device */ + + struct timer_list timer_reset; + + struct tq_struct kevent; + u32 kevent_flags; + + struct semaphore sem; /* locks this structure */ + + struct usbdfu_driver *drv; + u8 op_mode; +}; + +LIST_HEAD(usbdfu_driver_list); +struct semaphore usbdfu_lock; + +/* local function prototypes */ +static void * usbdfu_probe(struct usb_device *dev, + unsigned int ifnum, const struct usb_device_id *id); +static void usbdfu_disconnect(struct usb_device *dev, void *ptr); + +/* usb specific object needed to register this driver with the usb subsystem */ +static struct usb_driver usbdfu_driver = { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,20) + owner: THIS_MODULE, +#endif + name: "usbdfu", + probe: usbdfu_probe, + disconnect: usbdfu_disconnect, + id_table: NULL, +}; + +/** + * usbdfu_debug_data + */ +static inline void usbdfu_debug_data (const char *function, int size, const unsigned char *data) +{ + int i; + + if (!debug) + return; + + printk (KERN_DEBUG __FILE__": %s - length = %d, data = ", + function, size); + for (i = 0; i < size; ++i) { + printk ("%.2x ", data[i]); + } + printk ("\n"); +} + + +#define USB_SUCCESS(a) (a >= 0) + +#define DFU_PACKETSIZE 1024 + +#define INTERFACE_VENDOR_REQUEST_OUT 0x41 +#define INTERFACE_VENDOR_REQUEST_IN 0xc1 + +#if 0 +static +int dfu_detach(struct usb_device *udev) +{ + int result; + + dbg("dfu_detach"); + + result = usb_control_msg(udev, usb_sndctrlpipe(udev,0), + DFU_DETACH, + USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE, + 1000, /* Value */ + 0, /* Index */ + NULL, /* Buffer */ + 0, /* Size */ + HZ); + + return result; +} +#endif + +static +int dfu_download_block(struct dfu_ctx *ctx, u8 *buffer, + int bytes, int block) +{ + int result; + u8 *tmpbuf = ctx->buf; + struct usb_device *udev = ctx->udev; + + dbg("dfu_download_block(): buffer=%p, bytes=%d, block=%d", buffer, bytes, block); + + if(tmpbuf == NULL) + return -ENOMEM; + + memcpy(tmpbuf, buffer, bytes); + + result = usb_control_msg(udev, usb_sndctrlpipe(udev,0), + DFU_DNLOAD, + USB_TYPE_CLASS | USB_DIR_OUT | USB_RECIP_INTERFACE, + block, /* Value */ + 0, /* Index */ + tmpbuf, /* Buffer */ + bytes, /* Size */ + HZ); + return result; +} + +static +int dfu_get_status(struct dfu_ctx *ctx, struct dfu_status *status) +{ + int result; + struct usb_device *udev = ctx->udev; + +// dbg("dfu_get_status()"); + + result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + DFU_GETSTATUS, + USB_TYPE_CLASS | USB_DIR_IN | USB_RECIP_INTERFACE, + 0, /* Value */ + 0, /* Index */ + status, /* Buffer */ + sizeof(struct dfu_status), /* Size */ + HZ); + + return result; +} + +static +u8 dfu_get_state(struct dfu_ctx *ctx, u8 *state) +{ + int result; + struct usb_device *udev = ctx->udev; + +// dbg("dfu_get_state()"); + + result = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0), + DFU_GETSTATE, /* Request */ + USB_TYPE_CLASS | USB_DIR_IN | USB_RECIP_INTERFACE, + 0, /* Value */ + 0, /* Index */ + state, /* Buffer */ + 1, /* Size */ + HZ); + + return result; +} + +static inline +u32 __get_timeout(struct dfu_status *s) +{ + unsigned long ret = 0; + + ret = (unsigned long) (s->bwPollTimeout[2] << 16); + ret |= (unsigned long) (s->bwPollTimeout[1] << 8); + ret |= (unsigned long) (s->bwPollTimeout[0]); + + return ret; +} + +static +struct dfu_ctx *dfu_alloc_ctx(struct usb_device *udev) +{ + struct dfu_ctx *ctx; + + ctx = kmalloc(sizeof(struct dfu_ctx) + DFU_PACKETSIZE, GFP_KERNEL|GFP_DMA); + if(ctx){ + ctx->udev = udev; + ctx->buf = (u8 *)&(ctx[1]); + } + return ctx; +} + +int dfu_download(struct usb_device *udev, unsigned char *dfu_buffer, + unsigned int dfu_len) +{ + struct dfu_ctx *ctx; + struct dfu_status *dfu_stat_buf; + int status = 0; + int need_dfu_state = 1; + int is_done = 0; + u8 dfu_state = 0; + u32 dfu_timeout = 0; + int dfu_block_bytes = 0, dfu_bytes_left = dfu_len, dfu_buffer_offset = 0; + int dfu_block_cnt = 0; + + if (dfu_len == 0) { + err("FW Buffer length invalid!"); + return -EINVAL; + } + + ctx = dfu_alloc_ctx(udev); + if(ctx == NULL) + return -ENOMEM; + + dfu_stat_buf = &ctx->dfu_status; + + do { + if (need_dfu_state) { + status = dfu_get_state(ctx, &ctx->dfu_state); + if (!USB_SUCCESS(status)) { + err("DFU: Failed to get DFU state: %d", status); + goto exit; + } + dfu_state = ctx->dfu_state; + need_dfu_state = 0; + } + + switch (dfu_state) { + case STATE_DFU_DOWNLOAD_SYNC: + dbg("STATE_DFU_DOWNLOAD_SYNC"); + if (USB_SUCCESS + (status = dfu_get_status(ctx, dfu_stat_buf))) { + dfu_state = dfu_stat_buf->bState; + dfu_timeout = __get_timeout(dfu_stat_buf); + need_dfu_state = 0; + }else + err("dfu_get_status failed with %d", status); + break; + + case STATE_DFU_DOWNLOAD_BUSY: + dbg("STATE_DFU_DOWNLOAD_BUSY"); + need_dfu_state = 1; + + if (dfu_timeout >= 0){ + dbg("DFU: Resetting device"); + set_current_state( TASK_INTERRUPTIBLE ); + schedule_timeout(1+dfu_timeout*HZ/1000); + }else + dbg("DFU: In progress"); + + break; + + case STATE_DFU_DOWNLOAD_IDLE: + dbg("DOWNLOAD..."); + /* fall through */ + case STATE_DFU_IDLE: + dbg("DFU IDLE"); + + if (dfu_bytes_left <= DFU_PACKETSIZE) + dfu_block_bytes = dfu_bytes_left; + else + dfu_block_bytes = DFU_PACKETSIZE; + + dfu_bytes_left -= dfu_block_bytes; + status = dfu_download_block(ctx, + dfu_buffer + + dfu_buffer_offset, + dfu_block_bytes, + dfu_block_cnt); + dfu_buffer_offset += dfu_block_bytes; + dfu_block_cnt++; + + if (!USB_SUCCESS(status)) + err("dfu_download_block failed with %d", status); + need_dfu_state = 1; + break; + + case STATE_DFU_MANIFEST_SYNC: + dbg("STATE_DFU_MANIFEST_SYNC"); + + status = dfu_get_status(ctx, dfu_stat_buf); + + if (USB_SUCCESS(status)) { + dfu_state = dfu_stat_buf->bState; + dfu_timeout = __get_timeout(dfu_stat_buf); + need_dfu_state = 0; + + if (dfu_timeout >= 0){ + dbg("DFU: Resetting device"); + + set_current_state( TASK_INTERRUPTIBLE ); + schedule_timeout(1+dfu_timeout*HZ/1000); + }else + dbg("DFU: In progress"); + } + break; + + case STATE_DFU_MANIFEST: + dbg("STATE_DFU_MANIFEST"); + is_done = 1; + break; + + case STATE_DFU_MANIFEST_WAIT_RESET: + dbg("STATE_DFU_MANIFEST_WAIT_RESET"); +// usb_reset_device(udev); + is_done = 1; + break; + + case STATE_DFU_UPLOAD_IDLE: + dbg("STATE_DFU_UPLOAD_IDLE"); + break; + + case STATE_DFU_ERROR: + dbg("STATE_DFU_ERROR"); +// usb_reset_device(udev); + status = -EPIPE; + break; + + default: + dbg("DFU UNKNOWN STATE (%d)", dfu_state); + status = -EINVAL; + break; + } + } while (!is_done && USB_SUCCESS(status)); + + exit: + kfree(ctx); + return status; +} + +static inline +int remap(struct usbdfu *dev) +{ + struct usb_device *udev = dev->udev; + return usb_control_msg(udev, usb_sndctrlpipe(udev,0), + 0x0a, INTERFACE_VENDOR_REQUEST_OUT, + 0, 0, + NULL, 0, HZ); +} + +static inline +int get_op_mode(struct usbdfu *dev, u8 *op_mode) +{ + struct usb_device *udev = dev->udev; + int ret; + + ret = usb_control_msg(udev, usb_rcvctrlpipe(udev,0), + 0x33, INTERFACE_VENDOR_REQUEST_IN, + 0x01, 0, + op_mode, 1, HZ); + return ret; +} + +static +int usbdfu_download(struct usbdfu *dev, u8 *fw_buf, u32 fw_len) +{ + int ret; + + info("downloading firmware"); + + ret = dfu_download(dev->udev, fw_buf, fw_len); + + if(ret >= 0){ + info("remap"); + ret = remap(dev); + if(ret < 0) + err("remap failed: %d", ret); + } + + return ret; +} + +/* shamelessly copied from usbnet.c (oku) */ +static void defer_kevent (struct usbdfu *dev, int flag) +{ + set_bit (flag, &dev->kevent_flags); + if (!schedule_task (&dev->kevent)) + err ("kevent %d may have been dropped", flag); + else + dbg ("kevent %d scheduled", flag); +} + +static void kevent_timer_reset(unsigned long data) +{ + struct usbdfu *dev = (struct usbdfu *)data; + + defer_kevent(dev, KEVENT_FLAG_RESET); + + del_timer_sync(&dev->timer_reset); +} + +/* TODO: how do we make sure the device hasn't been + plugged out in the meantime? */ + +static void +kevent(void *data) +{ + struct usbdfu *dev = data; + struct usb_driver *driver; + struct usb_device *udev; + struct usbdfu_driver *drv; + struct usb_interface *interface; + + dbg("kevent entered"); + + /* some paranoid checks: */ + if(!dev){ + err("kevent: no dev!"); + return; + } + + down(&dev->sem); + + if(!dev->drv){ + err("kevent: no dev->drv!"); + goto error; + } + driver = dev->drv->driver; + if(!driver){ + err("kevent: no driver!"); + goto error; + } + udev = dev->udev; + if(!udev){ + err("kevent: no device!"); + goto error; + } + drv = dev->drv; + interface = dev->interface; + + up(&dev->sem); + + /* releasing interface, so it can be claimed by our + fellow driver */ + usb_driver_release_interface(&usbdfu_driver, dev->interface); + + info("resetting device"); + usb_reset_device(udev); + + info("scanning unclaimed devices"); + usb_scan_devices(); + + /* we cannot use dev after reset - disconnect may have been + been called, it's gone */ + + return; + error: + up(&dev->sem); + return; +} + +int usbdfu_register(struct usb_driver *driver, u8 *fw_buf, int fw_buf_len) +{ + struct usbdfu_driver *drv = kmalloc(sizeof(struct usbdfu_driver), GFP_KERNEL); + + if(!drv) + return -ENOMEM; + + drv->fw_buf = fw_buf; + drv->fw_buf_len = fw_buf_len; + drv->driver = driver; + + down(&usbdfu_lock); + list_add_tail(&drv->list, &usbdfu_driver_list); + up(&usbdfu_lock); /* before scan, because that calls probe() */ + + /* if the device is not yet plugged in, we are settled. If it already + is, we have to scan for unclaimed devices. This will call our + probe function again. */ + /* I hope this works: */ + usb_scan_devices(); + + return 0; +} + +void usbdfu_deregister(struct usb_driver *driver) +{ + struct list_head *tmp; + struct usbdfu_driver *drv; + + down(&usbdfu_lock); + + for(tmp = usbdfu_driver_list.next; + tmp != &usbdfu_driver_list; + tmp = tmp->next) { + + drv = list_entry(tmp, struct usbdfu_driver, + list); + + if(drv->driver == driver) + break; + } + if(tmp != &usbdfu_driver_list){ + list_del(&drv->list); + kfree(drv); + } + up(&usbdfu_lock); +} + +static inline void usbdfu_delete (struct usbdfu *dev) +{ + kfree (dev); +} + +static void * usbdfu_probe(struct usb_device *udev, unsigned int ifnum, const struct usb_device_id *id) +{ + struct usbdfu *dev = NULL; + struct usb_interface *interface; + struct list_head *tmp; + struct usbdfu_driver *drv = NULL; + int ret; + + dbg("usbdfu_probe entered"); + + if(ifnum != 0){ + info("cannot handle multiple interfaces"); + return NULL; + } + + interface = &udev->actconfig->interface[ifnum]; + + down(&usbdfu_lock); + + dbg("searching driver"); + + for(tmp = usbdfu_driver_list.next; + tmp != &usbdfu_driver_list; + tmp = tmp->next) { + drv = list_entry(tmp, struct usbdfu_driver, + list); + if(usb_match_id(udev, interface, drv->driver->id_table)) + break; + } + + if(tmp == &usbdfu_driver_list) + goto exit; /* not for us */ + + dbg("driver %s found", drv->driver->name); + + /* allocate memory for our device state and intialize it */ + dev = kmalloc (sizeof(struct usbdfu), GFP_KERNEL); + if (dev == NULL) { + err ("out of memory"); + goto exit; + } + memset (dev, 0, sizeof (*dev)); + + init_MUTEX (&dev->sem); + + down(&dev->sem); + + INIT_TQUEUE (&dev->kevent, kevent, dev); + dev->udev = udev; + dev->interface = interface; + dev->drv = drv; + + ret = get_op_mode(dev, &dev->op_mode); + if(ret < 0){ + /* this is not a problem: this happens on some hosts when the + fw is not loaded. */ + err("get_op_mode() failed: %d", ret); + }else{ + info("op_mode = %d", (int)dev->op_mode); + if(dev->op_mode == 4){ + info("firmware already loaded"); + goto error; /* it'fine, but we are not needed */ + } + } + + dbg("going for download"); + /* here our main action takes place: */ + ret = usbdfu_download(dev, drv->fw_buf, drv->fw_buf_len); + if(ret < 0){ + err("download failed"); + goto error; + } + + set_bit(KEVENT_FLAG_AGAIN, &dev->kevent_flags); +// defer_kevent(dev, KEVENT_FLAG_RESET); + + init_timer(&dev->timer_reset); + dev->timer_reset.data = (long) dev; + dev->timer_reset.function = kevent_timer_reset; + + mod_timer(&dev->timer_reset, jiffies + 2*HZ); + + up(&dev->sem); + goto exit; + +error: + up(&dev->sem); + usbdfu_delete (dev); + dev = NULL; + +exit: + up(&usbdfu_lock); + + dbg("usbdfu_probe() exiting"); + return dev; +} + + +static void usbdfu_disconnect(struct usb_device *udev, void *ptr) +{ + struct usbdfu *dev; + + dev = (struct usbdfu *)ptr; + + usbdfu_delete(dev); + + info("USB DFU now disconnected"); +} + +static int __init usbdfu_init(void) +{ + int result; + + info(DRIVER_DESC " " DRIVER_VERSION); + + init_MUTEX(&usbdfu_lock); + + /* register this driver with the USB subsystem */ + result = usb_register(&usbdfu_driver); + if (result < 0) { + err("usb_register failed for the "__FILE__" driver. Error number %d", + result); + return -1; + } + + return 0; +} + +/** + * usbdfu_exit + */ +static void __exit usbdfu_exit(void) +{ + /* deregister this driver with the USB subsystem */ + usb_deregister(&usbdfu_driver); +} + +module_init (usbdfu_init); +module_exit (usbdfu_exit); + +EXPORT_SYMBOL(usbdfu_register); +EXPORT_SYMBOL(usbdfu_deregister); + +MODULE_AUTHOR(DRIVER_AUTHOR); +MODULE_DESCRIPTION(DRIVER_DESC); +MODULE_LICENSE("GPL"); + diff --git a/usbdfu.h b/usbdfu.h new file mode 100644 index 0000000..e4d7fd0 --- /dev/null +++ b/usbdfu.h @@ -0,0 +1,19 @@ +/* -*- linux-c -*- */ +/* + * USB Device Firmware Uploader + * + * Copyright (c) 2003 Oliver Kurth <oku@masqmail.cx> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * + */ + +int usbdfu_register(struct usb_driver *driver, u8 *fw_buf, int fw_buf_len); +void usbdfu_deregister(struct usb_driver *driver); + +int dfu_download(struct usb_device *udev, unsigned char *dfu_buffer, + unsigned int dfu_len); |