From 26205c14c3358160bd8f7ab8932374dae8b4ac63 Mon Sep 17 00:00:00 2001 From: neil Date: Wed, 10 Oct 2012 00:50:16 +0000 Subject: [PATCH] New WPA-capable version of prism2.device. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@45879 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- workbench/devs/networks/prism2/Makefile | 35 + workbench/devs/networks/prism2/Makefile.MOS | 32 + workbench/devs/networks/prism2/Makefile.OS4 | 42 + workbench/devs/networks/prism2/SetPrism2Defaults.c | 331 -- workbench/devs/networks/prism2/aros_device.c | 42 +- workbench/devs/networks/prism2/cybpci.c | 241 ++ .../prism2/{request_protos.h => cybpci_protos.h} | 16 +- workbench/devs/networks/prism2/device.c | 153 +- workbench/devs/networks/prism2/device.h | 132 +- workbench/devs/networks/prism2/encryption.c | 2143 ++++++++++ workbench/devs/networks/prism2/encryption_68k.s | 945 +++++ workbench/devs/networks/prism2/encryption_protos.h | 69 + workbench/devs/networks/prism2/expansion.c | 476 +++ .../{prometheus_protos.h => expansion_protos.h} | 16 +- workbench/devs/networks/prism2/firmware/HermesI | 4069 ++++++++++++++++++ workbench/devs/networks/prism2/firmware/HermesII | 4324 ++++++++++++++++++++ workbench/devs/networks/prism2/firmware/LEGAL | 40 + .../devs/networks/prism2/firmware/mmakefile.src | 10 + workbench/devs/networks/prism2/initializers.h | 2 +- workbench/devs/networks/prism2/mmakefile.src | 10 +- workbench/devs/networks/prism2/mos_device.c | 379 ++ workbench/devs/networks/prism2/openpci.c | 288 ++ .../{prometheus_protos.h => openpci_protos.h} | 16 +- workbench/devs/networks/prism2/os4_device.c | 608 +++ workbench/devs/networks/prism2/pccard.c | 28 +- workbench/devs/networks/prism2/pccard_protos.h | 2 - workbench/devs/networks/prism2/pci.c | 62 +- workbench/devs/networks/prism2/pci.h | 13 +- workbench/devs/networks/prism2/pci_protos.h | 2 - .../devs/networks/prism2/{startup.c => plx9052.h} | 32 +- workbench/devs/networks/prism2/powerpci.c | 232 ++ .../{prometheus_protos.h => powerpci_protos.h} | 16 +- workbench/devs/networks/prism2/prism2.h | 95 +- workbench/devs/networks/prism2/prometheus.c | 109 +- workbench/devs/networks/prism2/prometheus_protos.h | 2 - workbench/devs/networks/prism2/request.c | 258 +- workbench/devs/networks/prism2/request_protos.h | 2 - workbench/devs/networks/prism2/startup.c | 2 - workbench/devs/networks/prism2/{pci.h => timer.c} | 48 +- .../networks/prism2/{startup.c => timer_protos.h} | 24 +- workbench/devs/networks/prism2/unit.c | 2369 +++++++++-- workbench/devs/networks/prism2/unit_protos.h | 13 +- workbench/devs/networks/prism2/wireless.h | 167 +- 43 files changed, 16714 insertions(+), 1181 deletions(-) create mode 100755 workbench/devs/networks/prism2/Makefile create mode 100755 workbench/devs/networks/prism2/Makefile.MOS create mode 100755 workbench/devs/networks/prism2/Makefile.OS4 delete mode 100644 workbench/devs/networks/prism2/SetPrism2Defaults.c create mode 100755 workbench/devs/networks/prism2/cybpci.c copy workbench/devs/networks/prism2/{request_protos.h => cybpci_protos.h} (64%) mode change 100644 => 100755 create mode 100644 workbench/devs/networks/prism2/encryption.c create mode 100644 workbench/devs/networks/prism2/encryption_68k.s create mode 100755 workbench/devs/networks/prism2/encryption_protos.h create mode 100755 workbench/devs/networks/prism2/expansion.c copy workbench/devs/networks/prism2/{prometheus_protos.h => expansion_protos.h} (64%) mode change 100644 => 100755 create mode 100644 workbench/devs/networks/prism2/firmware/HermesI create mode 100644 workbench/devs/networks/prism2/firmware/HermesII create mode 100644 workbench/devs/networks/prism2/firmware/LEGAL create mode 100644 workbench/devs/networks/prism2/firmware/mmakefile.src create mode 100755 workbench/devs/networks/prism2/mos_device.c create mode 100755 workbench/devs/networks/prism2/openpci.c copy workbench/devs/networks/prism2/{prometheus_protos.h => openpci_protos.h} (64%) mode change 100644 => 100755 create mode 100755 workbench/devs/networks/prism2/os4_device.c copy workbench/devs/networks/prism2/{startup.c => plx9052.h} (62%) create mode 100755 workbench/devs/networks/prism2/powerpci.c copy workbench/devs/networks/prism2/{prometheus_protos.h => powerpci_protos.h} (64%) mode change 100644 => 100755 copy workbench/devs/networks/prism2/{pci.h => timer.c} (51%) copy workbench/devs/networks/prism2/{startup.c => timer_protos.h} (75%) mode change 100644 => 100755 rewrite workbench/devs/networks/prism2/wireless.h (65%) diff --git a/workbench/devs/networks/prism2/Makefile b/workbench/devs/networks/prism2/Makefile new file mode 100755 index 0000000000..08e0752d00 --- /dev/null +++ b/workbench/devs/networks/prism2/Makefile @@ -0,0 +1,35 @@ +CFLAGS = -msmall-code -O2 -ansi -Wall -Wno-uninitialized -Wno-parentheses +CC = gcc $(CFLAGS) +MAKEFILE = Makefile +LINKER = ld -e _Main -s +AMIGA_LIB = -lamiga +C_LIB = -lnix/libnix13 + +DEV_NAME = prism2.device +OBJS = device.o unit.o encryption.o encryption_68k.o request.o pci.o\ + prometheus.o powerpci.o pccard.o timer.o +HDRS = device.h wireless.h io.h +OBJS += registration.o + +all: $(DEV_NAME) + +.c.o : + $(CC) -c $< + +$(DEV_NAME): $(MAKEFILE) $(OBJS) + $(LINKER) $(OBJS) $(AMIGA_LIB) $(C_LIB) -o $(DEV_NAME) + Protect "$(DEV_NAME)" "-e" + +$(OBJS) startup.o: $(MAKEFILE) +$(OBJS) startup.o: $(HDRS) +unit.o: prism2.h +pci.o prometheus.o powerpci.o: pci.h + +install: all + Copy "$(DEV_NAME)" "DEVS:networks/" CLONE + Flush "$(DEV_NAME)" + Copy $(CMD_NAME) C: CLONE + +clean: + Delete "$(DEV_NAME)" "#?.o" $(CMD_NAME) + diff --git a/workbench/devs/networks/prism2/Makefile.MOS b/workbench/devs/networks/prism2/Makefile.MOS new file mode 100755 index 0000000000..1fd7190eec --- /dev/null +++ b/workbench/devs/networks/prism2/Makefile.MOS @@ -0,0 +1,32 @@ +CFLAGS = -O2 -Wall -Wno-uninitialized -Wno-parentheses -D__NOLIBBASE__ +CC = gcc $(CFLAGS) +MAKEFILE = Makefile.MOS +LINKER = ld -e Main -s +AMIGA_LIB = -labox + +DEV_NAME = prism2.device +OBJS = mos_device.o device.o unit.o encryption.o request.o pci.o openpci.o\ + pccard.o timer.o +HDRS = device.h wireless.h io.h + +all: $(DEV_NAME) + +.c.o : + $(CC) -c $< + +$(DEV_NAME): $(MAKEFILE) startup.o $(OBJS) + $(LINKER) startup.o $(OBJS) $(AMIGA_LIB) -o $(DEV_NAME) + Protect "$(DEV_NAME)" "-e" + +$(OBJS) startup.o: $(MAKEFILE) $(HDRS) +$(OBJS): $(HDRS) +unit.o: prism2.h +pci.o openpci.o: pci.h + +install: all + Copy "$(DEV_NAME)" "DEVS:networks/" CLONE + Flush "$(DEV_NAME)" + +clean: + Delete "$(DEV_NAME)" "#?.o" + diff --git a/workbench/devs/networks/prism2/Makefile.OS4 b/workbench/devs/networks/prism2/Makefile.OS4 new file mode 100755 index 0000000000..f1b9ccc545 --- /dev/null +++ b/workbench/devs/networks/prism2/Makefile.OS4 @@ -0,0 +1,42 @@ +CFLAGS = -O3 -Wall -Wno-uninitialized -Wno-parentheses -D__USE_INLINE__\ + -D__USE_BASETYPE__ -D__NOLIBBASE__ -D__NOGLOBALIFACE__ +CC = gcc $(CFLAGS) +MAKEFILE = Makefile.OS4 +#LINKER = ld -e Main -s -lauto +LINKER = gcc -nostdlib +AMIGA_LIB = -lamiga +#C_LIB = -lauto + +DEV_NAME = prism2.device +OBJS = os4_device.o device.o unit.o encryption.o request.o pci.o\ + expansion.o pccard.o timer.o +HDRS = device.h wireless.h io.h + +all: $(DEV_NAME) + +.c.o : + $(CC) -c $< + +$(DEV_NAME): $(MAKEFILE) startup.o $(OBJS) + $(LINKER) startup.o $(OBJS) $(AMIGA_LIB) $(C_LIB) -o $(DEV_NAME) + strip $(DEV_NAME) + Protect "$(DEV_NAME)" "-e" + +$(OBJS): $(MAKEFILE) $(HDRS) + +unit.o: prism2.h +pci.o expansion.o: pci.h + +install: all + Copy "$(DEV_NAME)" "DEVS:networks/" CLONE + Avail FLUSH >NIL: + +test: all + NetShutdown + Copy "$(DEV_NAME)" "DEVS:networks/" CLONE + Avail FLUSH >NIL: + AddNetInterface prism2 + +clean: + Delete "$(DEV_NAME)" "#?.o" + diff --git a/workbench/devs/networks/prism2/SetPrism2Defaults.c b/workbench/devs/networks/prism2/SetPrism2Defaults.c deleted file mode 100644 index 73d32c7fa1..0000000000 --- a/workbench/devs/networks/prism2/SetPrism2Defaults.c +++ /dev/null @@ -1,331 +0,0 @@ -/* - -Author: Neil Cafferkey -Copyright (C) 2004,2005 Neil Cafferkey - -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. - -*/ - - -#include -#include -#include - -#include -#include -#include - -#include "wireless.h" - - -#ifndef UPINT -#ifdef __AROS__ -typedef IPTR UPINT; -typedef SIPTR PINT; -#else -typedef ULONG UPINT; -typedef LONG PINT; -#endif -#endif - -#define UTILITY_VERSION 39 -#define DOS_VERSION 36 - -#ifndef __AROS__ -IMPORT struct ExecBase *AbsExecBase; -#endif - -struct ExecBase *SysBase; -struct DosLibrary *DOSBase; -struct UtilityBase *UtilityBase; - -static UPINT ParseHexString(TEXT *str, UBYTE *buffer, UPINT buffer_size); -static UPINT StrLen(const TEXT *s); - -const TEXT template[] = - "SSID/K,KEY/K,TEXTKEY/K,NOKEY/S,MANAGED/S,ADHOC/S,CHANNEL/K/N"; -const TEXT version_string[] = "$VER: SetPrism2Defaults 1.2 (23.7.2005)"; -const TEXT dos_name[] = DOSNAME; -const TEXT utility_name[] = UTILITYNAME; -const TEXT options_name[] = "Prism 2 options"; -static const struct TagItem tag_list_template[] = -{ - {P2OPT_SSID, 0}, - {P2OPT_WEPKey, 0}, - {P2OPT_Encryption, S2ENC_NONE}, - {P2OPT_PortType, S2PORT_MANAGED}, - {P2OPT_Channel, 0}, - {TAG_END, 0} -}; -static const struct TagItem name_tag_list[] = -{ - {ANO_NameSpace, TRUE}, /* Work-around for old MorphOS bug */ - {TAG_END, 0} -}; - - -LONG Main(VOID) -{ - struct RDArgs *read_args; - LONG error = 0, result = RETURN_OK; - UBYTE key_buffer[IEEE802_11_WEP128LEN]; - struct - { - TEXT *ssid; - TEXT *key; - TEXT *textkey; - PINT nokey; - PINT managed; - PINT adhoc; - PINT *channel; - } - args = {NULL, NULL, NULL, FALSE, FALSE, FALSE, NULL}; - struct NamedObject *options; - struct TagItem *tag_list, *tag_item; - TEXT *ssid; - UPINT length; - struct WEPKey *key; - UWORD key_option_count = 0; - - /* Open libraries */ - -#if defined(__mc68000) && !defined(__AROS__) - SysBase = AbsExecBase; -#endif - DOSBase = (struct DosLibrary *)OpenLibrary(dos_name, DOS_VERSION); - if(DOSBase == NULL) - return RETURN_FAIL; - UtilityBase = - (struct UtilityBase *)OpenLibrary(utility_name, UTILITY_VERSION); - - if(UtilityBase == NULL) - error = IoErr(); - - /* Parse arguments */ - - read_args = ReadArgs(template, (PINT *)&args, NULL); - if(read_args == NULL) - error = IoErr(); - else - { - if(args.key != NULL) - key_option_count++; - if(args.textkey != NULL) - key_option_count++; - if(args.nokey) - key_option_count++; - if(key_option_count > 1 || args.managed && args.adhoc) - error = ERROR_TOO_MANY_ARGS; - } - - /* Get pre-existing options object or create a new one */ - - if(error == 0) - { - options = FindNamedObject(NULL, options_name, NULL); - - if(options == NULL) - { - options = AllocNamedObjectA(options_name,(struct TagItem *)name_tag_list); - if(options != NULL) - { - if(AddNamedObject(NULL, options)) - { - tag_list = CloneTagItems(tag_list_template); - if(tag_list != NULL) - { - options->no_Object = tag_list; - ssid = AllocMem(IEEE802_11_MAXIDLEN, - MEMF_PUBLIC | MEMF_CLEAR); - if(ssid == NULL) - error = IoErr(); - key = AllocMem(sizeof(struct WEPKey), - MEMF_PUBLIC | MEMF_CLEAR); - if(key == NULL) - error = IoErr(); - if(error == 0) - { - key->length = IEEE802_11_WEP64LEN; - tag_item = FindTagItem(P2OPT_SSID, tag_list); - tag_item->ti_Data = (UPINT)ssid; - tag_item = FindTagItem(P2OPT_WEPKey, tag_list); - tag_item->ti_Data = (UPINT)key; - } - } - else - error = IoErr(); - } - else - { - error = IoErr(); - FreeNamedObject(options); - } - } - else - error = IoErr(); - } - } - - /* Set new options */ - - if(error == 0) - { - tag_list = (APTR)options->no_Object; - - if(args.ssid != NULL) - { - tag_item = FindTagItem(P2OPT_SSID, tag_list); - length = StrLen(args.ssid); - if(length <= IEEE802_11_MAXIDLEN) - CopyMem(args.ssid, (APTR)tag_item->ti_Data, length); - else - error = IoErr(); - } - - if(args.key != NULL) - { - tag_item = FindTagItem(P2OPT_WEPKey, tag_list); - length = - ParseHexString(args.key, key_buffer, IEEE802_11_WEP128LEN); - if(length == 0) - error = ERROR_BAD_NUMBER; - else if(length != IEEE802_11_WEP64LEN && - length != IEEE802_11_WEP128LEN) - error = ERROR_BAD_NUMBER; - else - { - key = (APTR)tag_item->ti_Data; - key->length = length; - CopyMem(key_buffer, key->key, length); - } - } - - if(args.textkey != NULL) - { - tag_item = FindTagItem(P2OPT_WEPKey, tag_list); - length = StrLen(args.textkey); - if(length == 0) - error = ERROR_INVALID_COMPONENT_NAME; - else if(length != IEEE802_11_WEP64LEN && - length != IEEE802_11_WEP128LEN) - error = ERROR_INVALID_COMPONENT_NAME; - else - { - key = (APTR)tag_item->ti_Data; - key->length = length; - CopyMem(args.textkey, key->key, length); - } - } - } - - if(error == 0) - { - tag_item = FindTagItem(P2OPT_Encryption, tag_list); - if(args.key != NULL || args.textkey != NULL) - tag_item->ti_Data = S2ENC_WEP; - else if(args.nokey) - tag_item->ti_Data = S2ENC_NONE; - - tag_item = FindTagItem(P2OPT_PortType, tag_list); - if(args.managed) - tag_item->ti_Data = S2PORT_MANAGED; - else if(args.adhoc) - tag_item->ti_Data = S2PORT_ADHOC; - - if(args.channel != NULL) - { - tag_item = FindTagItem(P2OPT_Channel, tag_list); - if(*args.channel >= 3 && *args.channel <= 14) - tag_item->ti_Data = *args.channel; - else - error = ERROR_BAD_NUMBER; - } - } - - FreeArgs(read_args); - - /* Print error message */ - -#ifdef USE_HACKS - SetIoErr(error); -#endif - PrintFault(error, NULL); - - if(error != 0) - result = RETURN_FAIL; - - /* Close libraries and exit */ - - CloseLibrary((struct Library *)UtilityBase); - CloseLibrary((struct Library *)DOSBase); - - return result; -} - - - -static UPINT ParseHexString(TEXT *str, UBYTE *buffer, UPINT buffer_size) -{ - BOOL success = TRUE; - UBYTE n = 0, *end; - TEXT ch; - UPINT i = 0; - - end = buffer + buffer_size; - while((ch = *str++) != '\0' && buffer < end) - { - n <<= 4; - - ch = ToUpper(ch); - if(ch != '-' && ch != ':' && ch != ' ') - { - if(ch >= '0' && ch <= '9') - n |= ch - '0'; - else if(ch >= 'A' && ch <= 'F') - n |= ch - 'A' + 10; - else - success = FALSE; - - if((++i & 0x1) == 0) - { - *buffer++ = n; - n = 0; - } - } - } - - if((i & 0x1) != 0) - success = FALSE; - - if(!success) - i = 0; - - return i >> 1; -} - - - -static UPINT StrLen(const TEXT *s) -{ - const TEXT *p; - - for(p = s; *p != '\0'; p++); - return p - s; -} - - - diff --git a/workbench/devs/networks/prism2/aros_device.c b/workbench/devs/networks/prism2/aros_device.c index 26872b157e..78cd37f255 100644 --- a/workbench/devs/networks/prism2/aros_device.c +++ b/workbench/devs/networks/prism2/aros_device.c @@ -1,6 +1,6 @@ /* -Copyright (C) 2011 Neil Cafferkey +Copyright (C) 2011,2012 Neil Cafferkey 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 @@ -35,10 +35,10 @@ MA 02111-1307, USA. /* Private prototypes */ -AROS_LD2(struct DevBase *, AROSDevInit, - AROS_LDA(struct DevBase *, dev_base, D0), - AROS_LDA(struct DevBase *, seg_list, A0), - struct DevBase *, base, 0, S2); +AROS_UFP3(struct DevBase *, AROSDevInit, + AROS_UFPA(struct DevBase *, dev_base, D0), + AROS_UFPA(APTR, seg_list, A0), + AROS_UFPA(struct DevBase *, base, A6)); AROS_LD3(BYTE, AROSDevOpen, AROS_LDA(struct IOSana2Req *, request, A1), AROS_LDA(LONG, unit_num, D0), @@ -86,7 +86,7 @@ static const APTR init_table[] = (APTR)sizeof(struct DevBase), (APTR)vectors, (APTR)&init_data, - (APTR)AROS_SLIB_ENTRY(AROSDevInit, S2, 0), + (APTR)AROSDevInit, }; @@ -106,7 +106,7 @@ const struct Resident aros_rom_tag = -/****i* prism2.device/AROSDevInit ************************************** +/****i* prism2.device/AROSDevInit ****************************************** * * NAME * AROSDevInit @@ -115,10 +115,10 @@ const struct Resident aros_rom_tag = * */ -AROS_LH2(struct DevBase *, AROSDevInit, - AROS_LHA(struct DevBase *, dev_base, D0), - AROS_LHA(struct DevBase *, seg_list, A0), - struct DevBase *, base, 0, S2) +AROS_UFH3(struct DevBase *, AROSDevInit, + AROS_UFHA(struct DevBase *, dev_base, D0), + AROS_UFHA(APTR, seg_list, A0), + AROS_UFHA(struct DevBase *, base, A6)) { AROS_LIBFUNC_INIT @@ -135,7 +135,7 @@ AROS_LH2(struct DevBase *, AROSDevInit, -/****i* prism2.device/AROSDevOpen ************************************** +/****i* prism2.device/AROSDevOpen ****************************************** * * NAME * AROSDevOpen @@ -180,7 +180,7 @@ AROS_LH3(BYTE, AROSDevOpen, -/****i* prism2.device/AROSDevClose ************************************* +/****i* prism2.device/AROSDevClose ***************************************** * * NAME * AROSDevClose @@ -202,7 +202,7 @@ AROS_LH1(APTR, AROSDevClose, -/****i* prism2.device/AROSDevExpunge *********************************** +/****i* prism2.device/AROSDevExpunge *************************************** * * NAME * AROSDevExpunge @@ -223,7 +223,7 @@ AROS_LH0(APTR, AROSDevExpunge, -/****i* prism2.device/AROSDevReserved ********************************** +/****i* prism2.device/AROSDevReserved ************************************** * * NAME * AROSDevReserved @@ -244,7 +244,7 @@ AROS_LH0(APTR, AROSDevReserved, -/****i* prism2.device/AROSDevBeginIO *********************************** +/****i* prism2.device/AROSDevBeginIO *************************************** * * NAME * AROSDevBeginIO @@ -279,7 +279,7 @@ AROS_LH1(VOID, AROSDevBeginIO, -/****i* prism2.device/AROSDevAbortIO *********************************** +/****i* prism2.device/AROSDevAbortIO *************************************** * * NAME * AROSDevAbortIO -- Try to stop a request. @@ -301,7 +301,7 @@ AROS_LH1(VOID, AROSDevAbortIO, -/****i* prism2.device/RXFunction *************************************** +/****i* prism2.device/RXFunction ******************************************* * * NAME * RXFunction @@ -327,7 +327,7 @@ static BOOL RXFunction(struct IOSana2Req *request, APTR buffer, ULONG size) -/****i* prism2.device/TXFunction *************************************** +/****i* prism2.device/TXFunction ******************************************* * * NAME * TXFunction @@ -353,7 +353,7 @@ static BOOL TXFunction(APTR buffer, struct IOSana2Req *request, ULONG size) -/****i* prism2.device/DMATXFunction ************************************ +/****i* prism2.device/DMATXFunction **************************************** * * NAME * DMATXFunction @@ -377,7 +377,7 @@ static UBYTE *DMATXFunction(struct IOSana2Req *request) -/****i* prism2.device/AROSInt ****************************************** +/****i* prism2.device/AROSInt ********************************************** * * NAME * AROSInt diff --git a/workbench/devs/networks/prism2/cybpci.c b/workbench/devs/networks/prism2/cybpci.c new file mode 100755 index 0000000000..8311ca4eb9 --- /dev/null +++ b/workbench/devs/networks/prism2/cybpci.c @@ -0,0 +1,241 @@ +/* + +Copyright (C) 2004-2012 Neil Cafferkey + +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. + +*/ + + +#include +#include + +#include +#include + +#include "pci.h" +#include "plx9052.h" + +#include "pci_protos.h" +#include "cybpci_protos.h" + + +/****i* prism2.device/GetCybPCICount *************************************** +* +* NAME +* GetCybPCICount +* +* SYNOPSIS +* count = GetCybPCICount() +* +* ULONG GetCybPCICount(); +* +**************************************************************************** +* +*/ + +ULONG GetCybPCICount(struct DevBase *base) +{ + ULONG count = 0; + APTR card = NULL; + UWORD vendor_id, product_id; + + while((card = PCIFindBoardTagList(card, NULL)) != NULL) + { + vendor_id = PCIReadConfigWord(card, CYBPCICONFIG_VENDOR); + product_id = PCIReadConfigWord(card, CYBPCICONFIG_DEVICE); + if(IsCardCompatible(vendor_id, product_id, base)) + count++; + } + + return count; +} + + + +/****i* prism2.device/AllocCybPCICard ************************************** +* +* NAME +* AllocCybPCICard -- Create a unit. +* +* SYNOPSIS +* context = AllocCybPCICard(index) +* +* struct BusContext *AllocCybPCICard(ULONG); +* +**************************************************************************** +* +*/ + +struct BusContext *AllocCybPCICard(ULONG index, struct DevBase *base) +{ + BOOL success = TRUE; + struct BusContext *context; + APTR card = NULL; + UWORD i = 0; + UPINT vendor_id, product_id, plx_base; + UBYTE io_range_no; + volatile UBYTE *cor_reg; + ULONG pci_control; + + /* Find a compatible card */ + + context = AllocMem(sizeof(struct BusContext), MEMF_PUBLIC | MEMF_CLEAR); + if(context == NULL) + success = FALSE; + + if(success) + { + while(i <= index) + { + card = PCIFindBoardTagList(card, NULL); + vendor_id = PCIReadConfigWord(card, CYBPCICONFIG_VENDOR); + product_id = PCIReadConfigWord(card, CYBPCICONFIG_DEVICE); + if(IsCardCompatible(vendor_id, product_id, base)) + i++; + } + + context->card = card; + if(card == NULL) + success = FALSE; + } + + if(success) + { + /* Find out what type of Prism II PCI card this is */ + + context->bus_type = GetBusType(product_id, base); + + if(context->bus_type == TMD_BUS) + { + /* Enable the PCCard */ + + cor_reg = (APTR)PCIGetBoardAttr(card, CYBPCITAG_BASEADDRESS1); + BYTEOUT((UPINT)cor_reg, COR_ENABLE); + io_range_no = 2; + } + else if(context->bus_type == PLX_BUS) + { + /* Enable interrupts on the bridge */ + + plx_base = PCIGetBoardAttr(card, CYBPCITAG_BASEADDRESS1); + LELONGOUT(plx_base + PLX9052_INTS, + LELONGIN(plx_base + PLX9052_INTS) | (1 << 6)); + + /* Enable the PCCard */ + + cor_reg = (APTR)PCIGetBoardAttr(card, CYBPCITAG_BASEADDRESS2); + cor_reg += 0x3e0; + *cor_reg = COR_ENABLE; + io_range_no = 3; + } + else + io_range_no = 0; + + /* Get the I/O base of the wireless chip */ + + context->io_base = PCIGetBoardAttr(card, + CYBPCITAG_BASEADDRESS0 + io_range_no); + if(context->io_base == 0) + success = FALSE; + } + + if(!success) + { + FreeCybPCICard(context, base); + context = NULL; + } + + return context; +} + + + +/****i* prism2.device/FreeCybPCICard *************************************** +* +* NAME +* FreeCybPCICard +* +* SYNOPSIS +* FreeCybPCICard(context) +* +* VOID FreeCybPCICard(struct BusContext *); +* +**************************************************************************** +* +*/ + +VOID FreeCybPCICard(struct BusContext *context, struct DevBase *base) +{ + APTR card; + APTR owner; + + if(context != NULL) + FreeMem(context, sizeof(struct BusContext)); + + return; +} + + + +/****i* prism2.device/AddCybPCIIntServer *********************************** +* +* NAME +* AddCybPCIIntServer +* +* SYNOPSIS +* success = AddCybPCIIntServer(card, interrupt) +* +* BOOL AddCybPCIIntServer(APTR, struct Interrupt *); +* +**************************************************************************** +* +*/ + +BOOL AddCybPCIIntServer(APTR card, struct Interrupt *interrupt, + struct DevBase *base) +{ + return (interrupt->is_Data = PCICreateIntObjectTagList(card, + (APTR)interrupt->is_Code, interrupt->is_Data, NULL)) != NULL; +} + + + +/****i* prism2.device/RemCybPCIIntServer *********************************** +* +* NAME +* RemCybPCIIntServer +* +* SYNOPSIS +* RemCybPCIIntServer(card, interrupt) +* +* VOID RemCybPCIIntServer(APTR, struct Interrupt *); +* +**************************************************************************** +* +*/ + +VOID RemCybPCIIntServer(APTR card, struct Interrupt *interrupt, + struct DevBase *base) +{ + if(interrupt->is_Data != NULL) + PCIDeleteIntObject(interrupt->is_Data); + + return; +} + + + diff --git a/workbench/devs/networks/prism2/request_protos.h b/workbench/devs/networks/prism2/cybpci_protos.h old mode 100644 new mode 100755 similarity index 64% copy from workbench/devs/networks/prism2/request_protos.h copy to workbench/devs/networks/prism2/cybpci_protos.h index 11d08d9b05..c6473b8775 --- a/workbench/devs/networks/prism2/request_protos.h +++ b/workbench/devs/networks/prism2/cybpci_protos.h @@ -1,8 +1,6 @@ /* -File: request_protos.h -Author: Neil Cafferkey -Copyright (C) 2002 Neil Cafferkey +Copyright (C) 2011 Neil Cafferkey 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 @@ -21,14 +19,18 @@ MA 02111-1307, USA. */ -#ifndef REQUEST_PROTOS_H -#define REQUEST_PROTOS_H +#ifndef CYBPCI_PROTOS_H +#define CYBPCI_PROTOS_H #include "device.h" -VOID ServiceRequest(struct IOSana2Req *request, struct DevBase *base); -VOID PutRequest(struct MsgPort *port, struct IORequest *request, +ULONG GetCybPCICount(struct DevBase *base); +struct BusContext *AllocCybPCICard(ULONG index, struct DevBase *base); +VOID FreeCybPCICard(struct BusContext *context, struct DevBase *base); +BOOL AddCybPCIIntServer(APTR card, struct Interrupt *interrupt, + struct DevBase *base); +VOID RemCybPCIIntServer(APTR card, struct Interrupt *interrupt, struct DevBase *base); #endif diff --git a/workbench/devs/networks/prism2/device.c b/workbench/devs/networks/prism2/device.c index 49c6a81e9f..78d848bdd2 100644 --- a/workbench/devs/networks/prism2/device.c +++ b/workbench/devs/networks/prism2/device.c @@ -1,8 +1,6 @@ /* -File: device.c -Author: Neil Cafferkey -Copyright (C) 2000-2006 Neil Cafferkey +Copyright (C) 2000-2011 Neil Cafferkey 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 @@ -30,7 +28,7 @@ MA 02111-1307, USA. #include "initializers.h" #include -#include +#include #include #include "device.h" @@ -45,6 +43,7 @@ MA 02111-1307, USA. static VOID DeleteDevice(struct DevBase *base); + /* Return an error immediately if someone tries to run the device */ LONG Main() @@ -56,13 +55,14 @@ LONG Main() const TEXT device_name[] = DEVICE_NAME; const TEXT version_string[] = DEVICE_NAME " " STR(VERSION) "." STR(REVISION) " (" DATE ")\n"; -static const TEXT utility_name[] = UTILITYNAME; +const TEXT utility_name[] = UTILITYNAME; static const TEXT prometheus_name[] = "prometheus.library"; static const TEXT powerpci_name[] = "powerpci.library"; -static const TEXT pccard_name[] = "pccard.library"; -static const TEXT card_name[] = "card.resource"; -static const TEXT dos_name[] = DOSNAME; -static const TEXT timer_name[] = TIMERNAME; +static const TEXT cybpci_name[] = "cybpci.library"; +const TEXT pccard_name[] = "pccard.library"; +const TEXT card_name[] = "card.resource"; +const TEXT dos_name[] = DOSNAME; +const TEXT timer_name[] = TIMERNAME; static const APTR vectors[] = @@ -177,29 +177,23 @@ struct DevBase *DevInit(REG(d0, struct DevBase *dev_base), base->utility_base = (APTR)OpenLibrary(utility_name, UTILITY_VERSION); base->prometheus_base = OpenLibrary(prometheus_name, PROMETHEUS_VERSION); if(base->prometheus_base == NULL) + { base->powerpci_base = OpenLibrary(powerpci_name, POWERPCI_VERSION); -#ifdef __MORPHOS__ - base->openpci_base = OpenLibrary(openpci_name, OPENPCI_VERSION); -#endif + if(base->powerpci_base == NULL) + base->cybpci_base = OpenLibrary(cybpci_name, CYBPCI_VERSION); + } base->pccard_base = OpenLibrary(pccard_name, PCCARD_VERSION); if(base->pccard_base != NULL) base->card_base = OpenResource(card_name); base->dos_base = (APTR)OpenLibrary(dos_name, DOS_VERSION); - if(base->utility_base == NULL || base->prometheus_base == NULL - && base->powerpci_base == NULL && base->openpci_base == NULL - && (base->pccard_base == NULL || base->card_base == NULL) - || base->dos_base == NULL) + if(base->utility_base == NULL || base->dos_base == NULL) success = FALSE; if(OpenDevice(timer_name, UNIT_VBLANK, (APTR)&base->timer_request, 0) != 0) success = FALSE; -#ifdef __MORPHOS__ - base->wrapper_int_code = (APTR)&int_trap; -#endif - if(!success) { DeleteDevice(base); @@ -294,10 +288,10 @@ BYTE DevOpen(REG(a1, struct IOSana2Req *request), opener->tx_function = (APTR)GetTagData(tx_tags[i], (UPINT)opener->tx_function, tag_list); - opener->filter_hook = (APTR)GetTagData(S2_PacketFilter, (IPTR)NULL, + opener->filter_hook = (APTR)GetTagData(S2_PacketFilter, (UPINT)NULL, tag_list); opener->dma_tx_function = - (APTR)GetTagData(S2_DMACopyFromBuff32, (IPTR)NULL, tag_list); + (APTR)GetTagData(S2_DMACopyFromBuff32, (UPINT)NULL, tag_list); Disable(); AddTail((APTR)&unit->openers, (APTR)opener); @@ -307,7 +301,7 @@ BYTE DevOpen(REG(a1, struct IOSana2Req *request), /* Back out if anything went wrong */ if(error != 0) - DevClose(request, base); + CloseUnit(request, base); /* Return */ @@ -334,48 +328,15 @@ BYTE DevOpen(REG(a1, struct IOSana2Req *request), APTR DevClose(REG(a1, struct IOSana2Req *request), REG(BASE_REG, struct DevBase *base)) { - struct DevUnit *unit; - APTR seg_list; - struct Opener *opener; - - /* Free buffer-management resources */ + APTR seg_list = NULL; - opener = (APTR)request->ios2_BufferManagement; - if(opener != NULL) - { - Disable(); - Remove((APTR)opener); - Enable(); - FreeVec(opener); - } + /* Close the unit */ - /* Delete the unit if it's no longer in use */ - - unit = (APTR)request->ios2_Req.io_Unit; - if(unit != NULL) - { - if((--unit->open_count) == 0) - { - Remove((APTR)unit); - switch(unit->bus) - { - case PCI_BUS: - case TMD_BUS: - case PLX_BUS: - DeletePCIUnit(unit, base); - break; - case PCCARD_BUS: - DeletePCCardUnit(unit, base); - break; - } - } - } + CloseUnit(request, base); /* Expunge the device if a delayed expunge is pending */ - seg_list = NULL; - - if((--base->device.dd_Library.lib_OpenCnt) == 0) + if(base->device.dd_Library.lib_OpenCnt == 0) { if((base->device.dd_Library.lib_Flags & LIBF_DELEXP) != 0) seg_list = DevExpunge(base); @@ -489,8 +450,6 @@ VOID DevBeginIO(REG(a1, struct IOSana2Req *request), * **************************************************************************** * -* Disable() used instead of a semaphore because device uses interrupts. -* */ VOID DevAbortIO(REG(a1, struct IOSana2Req *request), @@ -542,6 +501,8 @@ VOID DeleteDevice(struct DevBase *base) CloseLibrary(base->openpci_base); if(base->pccard_base != NULL) CloseLibrary(base->pccard_base); + if(base->cybpci_base != NULL) + CloseLibrary(base->cybpci_base); if(base->powerpci_base != NULL) CloseLibrary(base->powerpci_base); if(base->prometheus_base != NULL) @@ -560,6 +521,64 @@ VOID DeleteDevice(struct DevBase *base) +/****i* prism2.device/CloseUnit ******************************************** +* +* NAME +* CloseUnit +* +* SYNOPSIS +* CloseUnit(request) +* +* VOID CloseUnit(struct IOSana2Req *); +* +**************************************************************************** +* +*/ + +VOID CloseUnit(struct IOSana2Req *request, struct DevBase *base) +{ + struct DevUnit *unit; + struct Opener *opener; + + /* Decrement device usage count and free buffer-management resources */ + + base->device.dd_Library.lib_OpenCnt--; + opener = (APTR)request->ios2_BufferManagement; + if(opener != NULL) + { + Disable(); + Remove((APTR)opener); + Enable(); + FreeVec(opener); + } + + /* Delete the unit if it's no longer in use */ + + unit = (APTR)request->ios2_Req.io_Unit; + if(unit != NULL) + { + if((--unit->open_count) == 0) + { + Remove((APTR)unit); + switch(unit->bus) + { + case PCI_BUS: + case TMD_BUS: + case PLX_BUS: + DeletePCIUnit(unit, base); + break; + case PCCARD_BUS: + DeletePCCardUnit(unit, base); + break; + } + } + } + + return; +} + + + /****i* prism2.device/GetUnit ********************************************** * * NAME @@ -577,8 +596,7 @@ VOID DeleteDevice(struct DevBase *base) struct DevUnit *GetUnit(ULONG unit_num, struct DevBase *base) { struct DevUnit *unit; - ULONG pci_limit; - ULONG pccard_limit; + ULONG pci_limit, pccard_limit; pci_limit = GetPCICount(base); pccard_limit = pci_limit + GetPCCardCount(base); @@ -593,6 +611,8 @@ struct DevUnit *GetUnit(ULONG unit_num, struct DevBase *base) return unit; } + + /****i* prism2.device/WrapInt ********************************************** * * NAME @@ -624,6 +644,8 @@ BOOL WrapInt(struct Interrupt *interrupt, struct DevBase *base) return success; } + + /****i* prism2.device/UnwrapInt ******************************************** * * NAME @@ -692,3 +714,6 @@ VOID UnwrapCardInt(struct Interrupt *interrupt, struct DevBase *base) return; } + + + diff --git a/workbench/devs/networks/prism2/device.h b/workbench/devs/networks/prism2/device.h index 1766877470..348726a856 100644 --- a/workbench/devs/networks/prism2/device.h +++ b/workbench/devs/networks/prism2/device.h @@ -1,6 +1,6 @@ /* -Copyright (C) 2001-2007 Neil Cafferkey +Copyright (C) 2001-2012 Neil Cafferkey 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 @@ -29,6 +29,7 @@ MA 02111-1307, USA. #include #include #include +#include #include #include @@ -36,13 +37,14 @@ MA 02111-1307, USA. #include "io.h" #define DEVICE_NAME "prism2.device" -#define VERSION 1 -#define REVISION 7 -#define DATE "29.10.2007" +#define VERSION 2 +#define REVISION 5 +#define DATE "9.10.2012" #define UTILITY_VERSION 39 #define PROMETHEUS_VERSION 2 #define POWERPCI_VERSION 2 +#define CYBPCI_VERSION 2 #define EXPANSION_VERSION 50 #define OPENPCI_VERSION 1 #define PCCARD_VERSION 1 @@ -74,6 +76,11 @@ typedef LONG PINT; #define USE_HACKS #endif +#if defined(__mc68000) +#define AddResetCallback(callback) TRUE +#define RemResetCallback(callback) +#endif + struct DevBase { @@ -83,6 +90,7 @@ struct DevBase struct UtilityBase *utility_base; struct Library *prometheus_base; struct Library *powerpci_base; + struct Library *cybpci_base; struct Library *openpci_base; struct Library *pccard_base; APTR card_base; @@ -95,6 +103,8 @@ struct DevBase struct ExecIFace *i_exec; struct UtilityIFace *i_utility; struct PCIIFace *i_pci; + struct CardIFace *i_card; + struct PCCardIFace *i_pccard; struct DOSIFace *i_dos; struct TimerIFace *i_timer; #endif @@ -108,6 +118,7 @@ enum WRITE_QUEUE, ADOPT_QUEUE, EVENT_QUEUE, + SCAN_QUEUE, GENERAL_QUEUE, REQUEST_QUEUE_COUNT }; @@ -122,37 +133,91 @@ enum enum { - LUCENT_FIRMWARE, INTERSIL_FIRMWARE, SYMBOL_FIRMWARE, +// AIRONET_FIRMWARE + LUCENT_FIRMWARE, HERMES2_FIRMWARE, - AIRONET_FIRMWARE + HERMES2G_FIRMWARE, }; #define IO_WINDOW_SIZE 0x40 #define ETH_ADDRESSSIZE 6 #define ETH_HEADERSIZE 14 -#define ETH_SNAPHEADERSIZE 22 #define ETH_MTU 1500 -#define ETH_MAXPACKETSIZE ((ETH_HEADERSIZE) + (ETH_MTU)) +#define ETH_MAXPACKETSIZE (ETH_HEADERSIZE + ETH_MTU) #define ETH_PACKET_DEST 0 #define ETH_PACKET_SOURCE 6 #define ETH_PACKET_TYPE 12 #define ETH_PACKET_IEEELEN 12 -#define ETH_PACKET_SNAPTYPE 20 #define ETH_PACKET_DATA 14 +#define SNAP_HEADERSIZE 8 + +#define SNAP_FRM_TYPE 6 + +#define IV_SIZE 4 +#define EIV_SIZE 8 +#define ICV_SIZE 4 +#define MIC_SIZE 8 + +#define ENC_COUNT 4 #define STAT_COUNT 3 +#define RX_BUFFER_COUNT 10 + + +struct KeyUnion +{ + UWORD type; + union + { + struct WEPKey + { + UWORD length; + UBYTE key[13]; + ULONG tx_iv; + } + wep; + struct TKIPKey + { + UWORD key[8]; + ULONG tx_mic_key[2]; + ULONG rx_mic_key[2]; + UWORD tx_iv_low; + ULONG tx_iv_high; + UWORD rx_iv_low; + ULONG rx_iv_high; + UWORD tx_ttak[5]; + BOOL tx_ttak_set; + UWORD rx_ttak[5]; + BOOL rx_ttak_set; + } + tkip; + struct CCMPKey + { + UBYTE key[16]; + BOOL stream_set; + ULONG stream[44]; + UWORD tx_iv_low; + ULONG tx_iv_high; + UWORD rx_iv_low; + ULONG rx_iv_high; + } + ccmp; + } + u; +}; + struct DevUnit { struct MinNode node; ULONG index; ULONG open_count; - UWORD flags; + ULONG flags; UWORD bus; struct Task *task; struct MsgPort *request_ports[REQUEST_QUEUE_COUNT]; @@ -166,13 +231,19 @@ struct DevUnit UWORD (*LEWordIn)(APTR, ULONG); VOID (*LEWordOut)(APTR, ULONG, UWORD); UBYTE *rx_buffer; + UBYTE *rx_buffers; + LONG rx_fragment_nos[RX_BUFFER_COUNT]; UBYTE *tx_buffer; - UBYTE ssid[IEEE802_11_MAXIDLEN]; + UBYTE *rx_descriptor; + UBYTE *tx_descriptor; + UBYTE ssid[WIFI_MAXIDLEN]; ULONG card_removed_signal; ULONG card_inserted_signal; + ULONG scan_complete_signal; ULONG range_count; UBYTE address[ETH_ADDRESSSIZE]; UBYTE default_address[ETH_ADDRESSSIZE]; + UBYTE bssid[ETH_ADDRESSSIZE + 2]; struct MinList openers; struct MinList type_trackers; struct MinList multicast_ranges; @@ -180,19 +251,34 @@ struct DevUnit struct Interrupt rx_int; struct Interrupt tx_int; struct Interrupt info_int; + struct Interrupt reset_handler; struct Sana2DeviceStats stats; ULONG special_stats[STAT_COUNT]; ULONG speed; struct Sana2SignalQuality signal_quality; struct SignalSemaphore access_lock; - UWORD encryption; UWORD tx_frame_id; UWORD mode; UWORD channel; UWORD firmware_type; - UWORD ssid_length; - UWORD key_no; - struct WEPKey keys[IEEE802_11_WEPKEYCOUNT]; + UWORD auth_types; + UWORD ssid_length; // ??? + UWORD tx_key_no; + struct KeyUnion keys[WIFI_KEYCOUNT]; + UWORD iv_sizes[ENC_COUNT]; + VOID (*fragment_encrypt_functions[ENC_COUNT])(struct DevUnit *, UBYTE *, + UBYTE *, UWORD *, UBYTE *, struct DevBase *); + BOOL (*fragment_decrypt_functions[ENC_COUNT])(struct DevUnit *, UBYTE *, + UBYTE *, UWORD *, UBYTE *, struct DevBase *); + UWORD *scan_results_rec; + UBYTE *beacons; + UBYTE *next_beacon; + UBYTE wpa_ie[100]; + UWORD beacon_count; + UWORD ethernet_offset; + UWORD data_offset; + UWORD datalen_offset; + UWORD txcontrol_offset; }; @@ -250,7 +336,15 @@ struct AddressRange #define UNITF_PROM (1 << 5) #define UNITF_WASONLINE (1 << 6) /* card was online at time of removal */ #define UNITF_HASWEP (1 << 7) -#define UNITF_ALLMCAST (1 << 8) +#define UNITF_HASTKIP (1 << 8) +#define UNITF_HARDWEP (1 << 9) +#define UNITF_HARDTKIP (1 << 10) +#define UNITF_ALLMCAST (1 << 11) +#define UNITF_HASADHOC (1 << 12) +#define UNITF_INTADDED (1 << 13) +#define UNITF_RESETADDED (1 << 14) +#define UNITF_HASCCMP (1 << 15) +#define UNITF_ASSOCIATED (1 << 16) /* Endianness macros */ @@ -313,9 +407,6 @@ struct AddressRange /* Library and device bases */ -/* FIXME: Remove these #define xxxBase hacks - Do not use this in new code ! -*/ #define SysBase (base->sys_base) #define CardResource (base->card_base) #define UtilityBase (base->utility_base) @@ -323,6 +414,7 @@ struct AddressRange #define OpenPciBase (base->openpci_base) #define PrometheusBase (base->prometheus_base) #define PowerPCIBase (base->powerpci_base) +#define CybPCIBase (base->cybpci_base) #define PCCardBase (base->pccard_base) #define DOSBase (base->dos_base) #define TimerBase (base->timer_request.tr_node.io_Device) @@ -330,6 +422,8 @@ struct AddressRange #ifdef __amigaos4__ #define IExec (base->i_exec) #define IUtility (base->i_utility) +#define ICard (base->i_card) +#define IPCCard (base->i_pccard) #define IDOS (base->i_dos) #define ITimer (base->i_timer) #endif diff --git a/workbench/devs/networks/prism2/encryption.c b/workbench/devs/networks/prism2/encryption.c new file mode 100644 index 0000000000..b7ca4e0ab7 --- /dev/null +++ b/workbench/devs/networks/prism2/encryption.c @@ -0,0 +1,2143 @@ +/* + +Copyright (C) 2011 Neil Cafferkey + +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. + +*/ + + +#include + +#include "device.h" + +#include "encryption_protos.h" + +static VOID WEPEncrypt(struct DevUnit *unit, const UBYTE *data, UWORD size, + UBYTE *buffer, BOOL iv_only, struct DevBase *base); +static BOOL WEPDecrypt(struct DevUnit *unit, const UBYTE *data, UWORD size, + UBYTE *buffer, struct DevBase *base); +static VOID TKIPEncrypt(struct DevUnit *unit, UBYTE *data, UWORD size, + UBYTE *buffer, BOOL iv_only, struct DevBase *base); +static BOOL TKIPDecrypt(struct DevUnit *unit, UBYTE *data, UWORD size, + UBYTE *buffer, BOOL iv_only, struct DevBase *base); +static VOID CCMPSetIV(struct DevUnit *unit, UBYTE *data, UBYTE *buffer, + struct DevBase *base); +static VOID CCMPEncrypt(struct DevUnit *unit, const UBYTE *header, + const UBYTE *data, UWORD size, UBYTE *buffer, struct DevBase *base); +static BOOL CCMPCheckIV(struct DevUnit *unit, UBYTE *data, UWORD *key_no, + struct DevBase *base); +static BOOL CCMPDecrypt(struct DevUnit *unit, const UBYTE *header, + const UBYTE *data, UWORD size, UBYTE *buffer, UWORD key_no, + struct DevBase *base); +VOID UpdateMIC(ULONG *left, ULONG *right, const ULONG *data, + ULONG count); +static VOID TKIPKeyMix1(UWORD *ttak, const UWORD *tk, const UWORD *ta, + ULONG iv_high, struct DevBase *base); +VOID TKIPKeyMix2(UBYTE *rc4_seed, const UWORD *ttak, const UWORD *tk, + UWORD iv16, struct DevBase *base); +VOID EOREncrypt(const ULONG *data, ULONG *buffer, ULONG *key, + struct DevBase *base); +static VOID AESKeyMix(ULONG *stream, const ULONG *key, + struct DevBase *base); +VOID AESEncrypt(const ULONG *data, ULONG *buffer, ULONG *key, + struct DevBase *base); + + +static const UBYTE mic_padding[] = + {0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; + + +const UWORD sbox[] = +{ + 0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154, + 0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A, + 0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B, + 0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B, + 0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F, + 0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F, + 0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5, + 0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F, + 0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB, + 0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397, + 0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED, + 0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A, + 0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194, + 0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3, + 0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104, + 0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D, + 0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39, + 0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695, + 0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83, + 0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76, + 0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4, + 0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B, + 0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0, + 0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018, + 0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751, + 0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85, + 0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12, + 0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9, + 0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7, + 0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A, + 0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8, + 0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A +}; + + +const ULONG crc32[] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + + +#define SBox(A) \ + ({ \ + UWORD _SBox_A = (A); \ + UBYTE _SBox_low = _SBox_A; \ + UBYTE _SBox_high = _SBox_A >> 8; \ + _SBox_A = sbox[_SBox_low] ^ FlipWord(sbox[_SBox_high]); \ + }) + + +const ULONG te0[] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a +}; + + +const ULONG te1[] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616 +}; + + +const ULONG te2[] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16 +}; + + +const ULONG te3[] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c +}; + + +const ULONG te4[] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616 +}; + + +static const ULONG rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1B000000, 0x36000000 +}; + + + +/****i* prism2.device/WriteClearFragment *********************************** +* +* NAME +* WriteClearFragment -- Install unencrypted fragment data. +* +* SYNOPSIS +* WriteClearFragment(unit, header, data, size, +* buffer) +* +* VOID WriteClearFragment(struct DevUnit *, UBYTE *, UBYTE *, UWORD *, +* UBYTE *); +* +* NOTES +* The input data address may be equal to the output buffer address, +* but they may not overlap in any other way. +* +**************************************************************************** +* +*/ + +VOID WriteClearFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + if(buffer != data) + CopyMem(data, buffer, *size); + + return; +} + + + +/****i* prism2.device/EncryptWEPFragment *********************************** +* +* NAME +* EncryptWEPFragment -- Encrypt a fragment using the WEP cipher. +* +* SYNOPSIS +* EncryptWEPFragment(unit, header, data, size, +* buffer) +* +* VOID EncryptWEPFragment(struct DevUnit *, UBYTE *, UBYTE *, UWORD *, +* UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +* The output buffer must be at least 8 bytes bigger than the input +* data, so that the IV and ICV can be added. +* +**************************************************************************** +* +*/ + +VOID EncryptWEPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + WEPEncrypt(unit, data, *size, buffer, FALSE, base); + *size += IV_SIZE + ICV_SIZE; + + return; +} + + + +/****i* prism2.device/WriteWEPFragment ************************************* +* +* NAME +* WriteWEPFragment -- Prepare a fragment to use the WEP cipher. +* +* SYNOPSIS +* WriteWEPFragment(unit, header, data, size, +* buffer) +* +* VOID WriteWEPFragment(struct DevUnit *, UBYTE *, UBYTE *, UWORD *, +* UBYTE *); +* +* NOTES +* The input data address may be four bytes greater than the output +* buffer address, but they may not overlap in any other way. +* +**************************************************************************** +* +*/ + +VOID WriteWEPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + WEPEncrypt(unit, data, *size, buffer, TRUE, base); + if(buffer + IV_SIZE != data) + CopyMem(data, buffer + IV_SIZE, *size); + *size += IV_SIZE + ICV_SIZE; + + return; +} + + + +/****i* prism2.device/EncryptTKIPFragment ********************************** +* +* NAME +* EncryptTKIPFragment -- Encrypt a fragment using the TKIP cipher. +* +* SYNOPSIS +* EncryptTKIPFragment(unit, header, data, +* size, buffer) +* +* VOID EncryptTKIPFragment(struct DevUnit *, UBYTE *, UBYTE *, +* UWORD *, UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +* The output buffer must be at least 12 bytes bigger than the input +* data, so that the Extended IV and the ICV can be added. +* +**************************************************************************** +* +*/ + +VOID EncryptTKIPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + TKIPEncrypt(unit, data, *size, buffer, FALSE, base); + *size += EIV_SIZE + ICV_SIZE; + + return; +} + + + +/****i* prism2.device/WriteTKIPFragment ************************************ +* +* NAME +* WriteTKIPFragment -- Prepare a fragment to use the TKIP cipher. +* +* SYNOPSIS +* WriteTKIPFragment(unit, header, data, size, +* buffer) +* +* VOID WriteTKIPFragment(struct DevUnit *, UBYTE *, UBYTE *, UWORD *, +* UBYTE *); +* +* NOTES +* The input data address may be eight bytes greater than the output +* buffer address, but they may not overlap in any other way. +* +**************************************************************************** +* +*/ + +VOID WriteTKIPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + TKIPEncrypt(unit, data, *size, buffer, TRUE, base); + if(buffer + EIV_SIZE != data) + CopyMem(data, buffer + EIV_SIZE, *size); + *size += EIV_SIZE + ICV_SIZE; + + return; +} + + + +/****i* prism2.device/EncryptCCMPFragment ********************************** +* +* NAME +* EncryptCCMPFragment -- Encrypt a fragment using the CCMP cipher. +* +* SYNOPSIS +* EncryptCCMPFragment(unit, header, data, +* size, buffer) +* +* VOID EncryptCCMPFragment(struct DevUnit *, UBYTE *, UBYTE *, +* UWORD *, UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +* The output buffer must be at least 16 bytes bigger than the input +* data, so that the Extended IV and the MIC can be added. +* +**************************************************************************** +* +*/ + +VOID EncryptCCMPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + CCMPSetIV(unit, data, buffer, base); + CCMPEncrypt(unit, header, data, *size, buffer + EIV_SIZE, base); + *size += EIV_SIZE + MIC_SIZE; + + return; +} + + + +/****i* prism2.device/WriteCCMPFragment ************************************ +* +* NAME +* WriteCCMPFragment -- Prepare a fragment to use the CCMP cipher. +* +* SYNOPSIS +* WriteCCMPFragment(unit, header, data, size, +* buffer) +* +* VOID WriteCCMPFragment(struct DevUnit *, UBYTE *, UBYTE *, UWORD *, +* UBYTE *); +* +* NOTES +* The input data address may be eight bytes greater than the output +* buffer address, but they may not overlap in any other way. +* +**************************************************************************** +* +*/ + +VOID WriteCCMPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + CCMPSetIV(unit, data, buffer, base); + if(buffer + EIV_SIZE != data) + CopyMem(data, buffer + EIV_SIZE, *size); + *size += EIV_SIZE + MIC_SIZE; + + return; +} + + + +/****i* prism2.device/ReadClearFragment ************************************* +* +* NAME +* ReadClearFragment -- Extract data from an unencrypted fragment. +* +* SYNOPSIS +* success = ReadClearFragment(unit, header, data, size, +* buffer) +* +* BOOL ReadClearFragment(struct DevUnit *, UBYTE *, UBYTE *, UWORD *, +* UBYTE *); +* +**************************************************************************** +* +*/ + +BOOL ReadClearFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + CopyMem(data, buffer, *size); + + return TRUE; +} + + + +/****i* prism2.device/DecryptWEPFragment *********************************** +* +* NAME +* DecryptWEPFragment -- Decrypt a fragment using the WEP cipher. +* +* SYNOPSIS +* success = DecryptWEPFragment(unit, header, data, size, +* buffer) +* +* BOOL DecryptWEPFragment(struct DevUnit *, UBYTE *, UBYTE *, UWORD *, +* UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +**************************************************************************** +* +*/ + +BOOL DecryptWEPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + BOOL success; + + success = WEPDecrypt(unit, data, *size, buffer, base); + *size -= IV_SIZE + ICV_SIZE; + + return success; +} + + + +/****i* prism2.device/ReadWEPFragment ************************************** +* +* NAME +* ReadWEPFragment -- Extract data from a WEP fragment. +* +* SYNOPSIS +* success = ReadWEPFragment(unit, header, data, size, +* buffer) +* +* BOOL ReadWEPFragment(struct DevUnit *, UBYTE *, UBYTE *, UWORD *, +* UBYTE *); +* +**************************************************************************** +* +*/ + +BOOL ReadWEPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + *size -= IV_SIZE + ICV_SIZE; + CopyMem(data + IV_SIZE, buffer, *size); + + return TRUE; +} + + + +/****i* prism2.device/DecryptTKIPFragment ********************************** +* +* NAME +* DecryptTKIPFragment -- Decrypt a fragment using the TKIP cipher. +* +* SYNOPSIS +* success = DecryptTKIPFragment(unit, header, data, +* size, buffer) +* +* BOOL DecryptTKIPFragment(struct DevUnit *, UBYTE *, UBYTE *, +* UWORD *, UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +**************************************************************************** +* +*/ + +BOOL DecryptTKIPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + BOOL success; + + success = TKIPDecrypt(unit, data, *size, buffer, FALSE, + base); + *size -= EIV_SIZE + ICV_SIZE; + + return success; +} + + + +/****i* prism2.device/ReadTKIPFragment ************************************* +* +* NAME +* ReadTKIPFragment -- Extract data from a TKIP fragment. +* +* SYNOPSIS +* success = ReadTKIPFragment(unit, header, data, size, +* buffer) +* +* BOOL ReadTKIPFragment(struct DevUnit *, UBYTE *, UBYTE *, UWORD *, +* UBYTE *); +* +**************************************************************************** +* +*/ + +BOOL ReadTKIPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + BOOL success; + + success = TKIPDecrypt(unit, data, *size, buffer, TRUE, + base); + *size -= EIV_SIZE + ICV_SIZE; + if(success) + CopyMem(data + EIV_SIZE, buffer, *size); + + return success; +} + + + +/****i* prism2.device/DecryptCCMPFragment ********************************** +* +* NAME +* DecryptCCMPFragment -- Decrypt a fragment using the CCMP cipher. +* +* SYNOPSIS +* success = DecryptCCMPFragment(unit, header, data, +* size, buffer) +* +* BOOL DecryptCCMPFragment(struct DevUnit *, UBYTE *, UBYTE *, +* UWORD *, UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +**************************************************************************** +* +*/ + +BOOL DecryptCCMPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + BOOL success = FALSE; + UWORD key_no; + struct CCMPKey *key; + + if(CCMPCheckIV(unit, data, &key_no, base)) + { + *size -= EIV_SIZE; + success = CCMPDecrypt(unit, header, data + EIV_SIZE, *size, buffer, + key_no, base); + *size -= MIC_SIZE; + } + + /* Increment sequence counter */ + + if(success) + { + key = &unit->keys[key_no].u.ccmp; + if(++key->rx_iv_low == 0) + key->rx_iv_high++; + } + + return success; +} + + + +/****i* prism2.device/ReadCCMPFragment ************************************* +* +* NAME +* ReadCCMPFragment -- Extract data from a CCMP fragment. +* +* SYNOPSIS +* success = ReadCCMPFragment(unit, header, data, size, +* buffer) +* +* BOOL ReadCCMPFragment(struct DevUnit *, UBYTE *, UBYTE *, UWORD *, +* UBYTE *); +* +**************************************************************************** +* +*/ + +BOOL ReadCCMPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base) +{ + BOOL success; + UWORD key_no; + struct CCMPKey *key; + + success = CCMPCheckIV(unit, data, &key_no, base); + *size -= EIV_SIZE + MIC_SIZE; + if(success) + CopyMem(data + EIV_SIZE, buffer, *size); + + /* Increment sequence counter */ + + if(success) + { + key = &unit->keys[key_no].u.ccmp; + if(++key->rx_iv_low == 0) + key->rx_iv_high++; + } + + return success; +} + + + +/****i* prism2.device/TKIPEncryptFrame ************************************* +* +* NAME +* TKIPEncryptFrame -- Append the Michael MIC to a frame. +* +* SYNOPSIS +* TKIPEncryptFrame(unit, header, data, size, +* buffer) +* +* VOID TKIPEncryptFrame(struct DevUnit *, UBYTE *, UBYTE *, UWORD, +* UBYTE *); +* +* NOTES +* The input data address may be equal to the output buffer address, +* but they may not overlap in any other way. +* +* The output buffer must be at least 8 bytes bigger than the input +* data, so that the MIC can be added. +* +**************************************************************************** +* +*/ + +VOID TKIPEncryptFrame(struct DevUnit *unit, const UBYTE *header, + UBYTE *data, UWORD size, UBYTE *buffer, struct DevBase *base) +{ + ULONG *mic_key, mic[2]; + ULONG mic_l, mic_r, zero = 0; + struct TKIPKey *key = &unit->keys[unit->tx_key_no].u.tkip; + + /* Calculate MIC and append to packet data */ + + if(data != buffer) + CopyMem(data, buffer, size); + + mic_key = key->tx_mic_key; + mic_l = LELong(mic_key[0]); + mic_r = LELong(mic_key[1]); + UpdateMIC(&mic_l, &mic_r, (ULONG *)header, 3); + UpdateMIC(&mic_l, &mic_r, &zero, 1); + CopyMem(mic_padding, buffer + size, sizeof(mic_padding)); + UpdateMIC(&mic_l, &mic_r, (ULONG *)buffer, size / 4 + 2); + mic[0] = MakeLELong(mic_l); + mic[1] = MakeLELong(mic_r); + CopyMem(mic, buffer + size, sizeof(mic)); + + return; +} + + + +/****i* prism2.device/TKIPDecryptFrame ************************************* +* +* NAME +* TKIPDecryptFrame -- Check that a frame's MIC is correct. +* +* SYNOPSIS +* success = TKIPDecryptFrame(unit, header, data, size, +* buffer, key_no) +* +* BOOL TKIPDecryptFrame(struct DevUnit *, UBYTE *, UBYTE *, UWORD, +* UBYTE *, UWORD); +* +* NOTES +* The input data address may be equal to the output buffer address, +* but they may not overlap in any other way. +* +**************************************************************************** +* +*/ + +BOOL TKIPDecryptFrame(struct DevUnit *unit, const UBYTE *header, + UBYTE *data, UWORD size, UBYTE *buffer, UWORD key_no, + struct DevBase *base) +{ + ULONG *mic_key, mic[2]; + ULONG mic_l, mic_r, zero = 0; + + /* Calculate MIC and compare it with MIC received */ + + size -= sizeof(mic); + CopyMem(buffer + size, mic, sizeof(mic)); + CopyMem(mic_padding, buffer + size, sizeof(mic_padding)); + + mic_key = unit->keys[key_no].u.tkip.rx_mic_key; + mic_l = LELong(mic_key[0]); + mic_r = LELong(mic_key[1]); + UpdateMIC(&mic_l, &mic_r, (ULONG *)header, 3); + UpdateMIC(&mic_l, &mic_r, &zero, 1); + UpdateMIC(&mic_l, &mic_r, (ULONG *)buffer, size / sizeof(ULONG) + 2); + + if(data != buffer) + CopyMem(data, buffer, size); + + return LELong(mic[0]) == mic_l && LELong(mic[1]) == mic_r; +} + + + +/****i* prism2.device/WEPEncrypt ******************************************* +* +* NAME +* WEPEncrypt -- Encrypt a fragment using the WEP cipher. +* +* SYNOPSIS +* WEPEncrypt(unit, data, size, buffer, seed, +* iv_only) +* +* VOID WEPEncrypt(struct DevUnit *, UBYTE *, UWORD, UBYTE *, UBYTE *, +* BOOL); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is at least 4 bytes lower than the input address. +* +**************************************************************************** +* +*/ + +static VOID WEPEncrypt(struct DevUnit *unit, const UBYTE *data, UWORD size, + UBYTE *buffer, BOOL iv_only, struct DevBase *base) +{ + UWORD i; + ULONG iv; + const UBYTE *p; + UBYTE seed[16], *q; + struct WEPKey *key = &unit->keys[unit->tx_key_no].u.wep; + + /* Create RC4 seed from IV and WEP key */ + + iv = MakeBELong(++key->tx_iv); + for(i = 0, p = (UBYTE *)&iv + 1, q = seed; i < 3; i++) + *q++ = *p++; + if(!iv_only) + for(i = 0, p = key->key; i < key->length; i++) + *q++ = *p++; + + /* Preface encrypted data with the IV and key ID */ + + for(i = 0; i < 3; i++) + buffer[i] = seed[i]; + buffer[3] = unit->tx_key_no << 6; + + /* Encrypt data and CRC */ + + if(!iv_only) + RC4Encrypt(unit, data, size, buffer + 4, seed, base); + + return; +} + + + +/****i* prism2.device/WEPDecrypt ******************************************* +* +* NAME +* WEPDecrypt -- Decrypt a fragment using the WEP cipher. +* +* SYNOPSIS +* WEPDecrypt(unit, data, size, buffer) +* +* VOID WEPDecrypt(struct DevUnit *, UBYTE *, UWORD, UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +**************************************************************************** +* +*/ + +static BOOL WEPDecrypt(struct DevUnit *unit, const UBYTE *data, UWORD size, + UBYTE *buffer, struct DevBase *base) +{ + UWORD i; + const UBYTE *p; + UBYTE seed[16], *q; + const struct WEPKey *key = &unit->keys[data[3] >> 6].u.wep; + + /* Create RC4 seed from IV and WEP key */ + + for(i = 0, p = data, q = seed; i < 3; i++) + *q++ = *p++; + for(i = 0, p = key->key; i < key->length; i++) + *q++ = *p++; + + /* Decrypt data */ + + return RC4Decrypt(unit, data + 4, size - 4, buffer, seed, base); +} + + + +/****i* prism2.device/TKIPEncrypt ****************************************** +* +* NAME +* TKIPEncrypt -- Encrypt a fragment using the TKIP cipher. +* +* SYNOPSIS +* TKIPEncrypt(unit, data, size, buffer, iv_only) +* +* VOID TKIPEncrypt(struct DevUnit *, UBYTE *, UWORD, UBYTE *, BOOL); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +* The output buffer must be at least 12 bytes bigger than the input +* data, so that the Extended IV and the ICV can be added. +* +**************************************************************************** +* +*/ + +static VOID TKIPEncrypt(struct DevUnit *unit, UBYTE *data, UWORD size, + UBYTE *buffer, BOOL iv_only, struct DevBase *base) +{ + UBYTE seed[16]; + struct TKIPKey *key = &unit->keys[unit->tx_key_no].u.tkip; + + /* Create RC4 seed from IV, TA and temporal key */ + + if(!iv_only) + { + if(!key->tx_ttak_set) + { + TKIPKeyMix1(key->tx_ttak, (UWORD *)key->key, + (UWORD *)unit->address, key->tx_iv_high, base); + key->tx_ttak_set = TRUE; + } + TKIPKeyMix2(seed, key->tx_ttak, (UWORD *)key->key, key->tx_iv_low, + base); + } + + /* Preface encrypted data with IV, key ID, TKIP flag and extended IV */ + + buffer[0] = key->tx_iv_low >> 8; + buffer[1] = (key->tx_iv_low >> 8 | 0x20) & 0x7f; + buffer[2] = key->tx_iv_low; + buffer[3] = unit->tx_key_no << 6 | 0x20; + buffer += 4; + *(ULONG *)buffer = + MakeLELong(key->tx_iv_high); + buffer += 4; + + /* Encrypt data and CRC */ + + if(!iv_only) + RC4Encrypt(unit, data, size, buffer, seed, base); + + /* Increment 48-bit sequence counter */ + + if((++key->tx_iv_low) == 0) + { + key->tx_iv_high++; + key->tx_ttak_set = FALSE; + } + + return; +} + + + +/****i* prism2.device/TKIPDecrypt ****************************************** +* +* NAME +* TKIPDecrypt -- Decrypt a fragment using the TKIP cipher. +* +* SYNOPSIS +* success = TKIPDecrypt(unit, data, size, buffer, iv_only) +* +* BOOL TKIPDecrypt(struct DevUnit *, UBYTE *, UWORD, UBYTE *, BOOL); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +**************************************************************************** +* +*/ + +static BOOL TKIPDecrypt(struct DevUnit *unit, UBYTE *data, UWORD size, + UBYTE *buffer, BOOL iv_only, struct DevBase *base) +{ + UBYTE seed[16]; + ULONG iv_low, iv_high; + BOOL success = TRUE; + UWORD key_no; + struct TKIPKey *key; + + /* Extract IV, key ID, TKIP flag and extended IV */ + + iv_low = data[0] << 8 | data[2]; + key_no = data[3] >> 6; + data += 4; + iv_high = LELong(*(ULONG *)data); + data += 4; + + /* Check for replay attack */ + + key = &unit->keys[key_no].u.tkip; + if(iv_high < key->rx_iv_high + || iv_high == key->rx_iv_high && iv_low < key->rx_iv_low) + success = FALSE; + + /* TO DO: replay timeout */ + + if(success && !iv_only) + { + /* Create RC4 seed from IV, TA and temporal key */ + + if(iv_high > key->rx_iv_high) + key->rx_ttak_set = FALSE; + if(!key->rx_ttak_set) + { + TKIPKeyMix1(key->rx_ttak, + (UWORD *)unit->keys[key_no].u.tkip.key, + (UWORD *)unit->bssid, iv_high, base); + key->rx_ttak_set = TRUE; + } + TKIPKeyMix2(seed, key->rx_ttak, + (UWORD *)unit->keys[key_no].u.tkip.key, iv_low, base); + + /* Decrypt data and check ICV/CRC */ + + size -= EIV_SIZE; + success = RC4Decrypt(unit, data, size, buffer, seed, base); + } + + /* Increment 48-bit sequence counter */ + + if(success) + { + key->rx_iv_high = iv_high; + key->rx_iv_low = iv_low; + if(++key->rx_iv_low == 0) + { + key->rx_iv_high++; + key->rx_ttak_set = FALSE; + } + } + + return success; +} + + + +/****i* prism2.device/CCMPSetIV ******************************************** +* +* NAME +* CCMPSetIV -- Add CCMP IV to a fragment. +* +* SYNOPSIS +* CCMPSetIV(unit, data, buffer) +* +* VOID CCMPSetIV(struct DevUnit *, UBYTE *, UBYTE *); +* +**************************************************************************** +* +*/ + +static VOID CCMPSetIV(struct DevUnit *unit, UBYTE *data, UBYTE *buffer, + struct DevBase *base) +{ + struct CCMPKey *key = &unit->keys[unit->tx_key_no].u.ccmp; + + /* Increment 48-bit sequence counter */ + + if((++key->tx_iv_low) == 0) + { + key->tx_iv_high++; + } + + /* Preface encrypted data with IV, key ID, CCMP flag and extended IV */ + + buffer[0] = key->tx_iv_low; + buffer[1] = key->tx_iv_low >> 8; + buffer[2] = 0; + buffer[3] = unit->tx_key_no << 6 | 0x20; + *(ULONG *)(buffer + 4) = MakeLELong(key->tx_iv_high); + + return; +} + + + +/****i* prism2.device/CCMPEncrypt ****************************************** +* +* NAME +* CCMPEncrypt -- Encrypt a fragment using the CCMP cipher. +* +* SYNOPSIS +* CCMPEncrypt(unit, header, data, size, buffer, +* iv_only) +* +* VOID CCMPEncrypt(struct DevUnit *, UBYTE *, UBYTE *, UWORD, UBYTE *, +* BOOL); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +* The output buffer must be at least 16 bytes bigger than the input +* data, so that the MIC can be added. +* +* INTERNALS +* For efficiency, the nonce and AAD are not constructed as separate +* entities, but immediately integrated into their corresponding CBC +* blocks. +* +**************************************************************************** +* +*/ + +static VOID CCMPEncrypt(struct DevUnit *unit, const UBYTE *header, + const UBYTE *data, UWORD size, UBYTE *buffer, struct DevBase *base) +{ + struct CCMPKey *key = &unit->keys[unit->tx_key_no].u.ccmp; + UBYTE aad_blocks[16 * 2], nonce_block[16], + *q; + const UBYTE *p; + UWORD i, j, block_count; + ULONG n, data_block[4], mic_block[4], key_block[4]; + + if(!key->stream_set) + { + AESKeyMix(key->stream, (ULONG *)key->key, base); + key->stream_set = TRUE; + } + + /* Construct AAD blocks */ + + aad_blocks[0] = 0; + aad_blocks[1] = 22; + + *(UWORD *)(aad_blocks + 2) = *(UWORD *)(header + WIFI_FRM_CONTROL) + & MakeLEWord(WIFI_FRM_CONTROLF_VERSION | WIFI_FRM_CONTROLF_TYPE + | (1 << 7) | WIFI_FRM_CONTROLF_TODS | WIFI_FRM_CONTROLF_FROMDS + | WIFI_FRM_CONTROLF_MOREFRAGS | WIFI_FRM_CONTROLF_ORDER) + | MakeLEWord(WIFI_FRM_CONTROLF_WEP); + CopyMem(header + WIFI_FRM_ADDRESS1, aad_blocks + 4, ETH_ADDRESSSIZE * 3); + *(UWORD *)(aad_blocks + 22) = + *(UWORD *)(header + WIFI_FRM_SEQCONTROL) & MakeLEWord(0xf); + + *(ULONG *)(aad_blocks + 24) = 0; + *(ULONG *)(aad_blocks + 28) = 0; + + /* Construct nonce block */ + + nonce_block[0] = 0x59; + + nonce_block[1] = 0; + CopyMem(header + WIFI_FRM_ADDRESS2, nonce_block + 2, ETH_ADDRESSSIZE); + + n = MakeBELong(key->tx_iv_high); + for(i = 0, p = (UBYTE *)&n; i < 4; i++) + nonce_block[8 + i] = p[i]; + n = MakeBELong(key->tx_iv_low); + for(i = 0, p = (UBYTE *)&n + 2; i < 2; i++) + nonce_block[12 + i] = p[i]; + + *(UWORD *)(nonce_block + 14) = MakeBEWord(size); + + /* Initialise MIC block from nonce block */ + + AESEncrypt((ULONG *)nonce_block, mic_block, key->stream, base); + + /* Integrate AAD into MIC */ + + for(i = 0, p = aad_blocks; i < 2; i++, p += 16) + { + EOREncrypt((ULONG *)p, mic_block, mic_block, base); + AESEncrypt(mic_block, mic_block, key->stream, + base); + } + + /* Encrypt data and calculate MIC */ + + nonce_block[0] = 0x01; + block_count = (size - 1) / 16 + 1; + + for(i = 1, j = size, p = data, q = buffer; i <= block_count; i++, + p += 16, q += 16, j -= 16) + { + /* Update MIC */ + + if(j < 16) + { + data_block[0] = 0; + data_block[1] = 0; + data_block[2] = 0; + data_block[3] = 0; + CopyMem(p, data_block, j); + } + else + CopyMem(p, data_block, 16); + EOREncrypt(data_block, mic_block, mic_block, base); + AESEncrypt(mic_block, mic_block, key->stream, base); + + /* Encrypt next block */ + + *(UWORD *)(nonce_block + 14) = MakeBEWord(i); + AESEncrypt((ULONG *)nonce_block, key_block, key->stream, base); + EOREncrypt((ULONG *)p, (ULONG *)q, key_block, base); + } + + /* Append MIC */ + + *(UWORD *)(nonce_block + 14) = 0; + AESEncrypt((ULONG *)nonce_block, key_block, key->stream, base); + EOREncrypt(mic_block, mic_block, key_block, base); + CopyMem(mic_block, buffer + size, MIC_SIZE); + + return; +} + + + +/****i* prism2.device/CCMPCheckIV ****************************************** +* +* NAME +* CCMPCheckIV -- Process a CCMP fragment's IV. +* +* SYNOPSIS +* success = CCMPCheckIV(unit, data, key_no) +* +* BOOL CCMPCheckIV(struct DevUnit *, UBYTE *, UWORD); +* +**************************************************************************** +* +*/ + +static BOOL CCMPCheckIV(struct DevUnit *unit, UBYTE *data, UWORD *key_no, + struct DevBase *base) +{ + BOOL success = TRUE; + ULONG iv_low, iv_high; + struct CCMPKey *key; + + /* Extract sequence counter and key ID */ + + iv_low = data[1] << 8 | data[0]; + *key_no = data[3] >> 6; + data += 4; + iv_high = LELong(*(ULONG *)data); + + /* Check for replay attack */ + + key = &unit->keys[*key_no].u.ccmp; + if(iv_high < key->rx_iv_high + || iv_high == key->rx_iv_high && iv_low < key->rx_iv_low) + success = FALSE; + + /* TO DO: replay timeout */ + + /* Store new sequence counter */ + + if(success) + { + key->rx_iv_high = iv_high; + key->rx_iv_low = iv_low; + } + + return success; +} + + + +/****i* prism2.device/CCMPDecrypt ****************************************** +* +* NAME +* CCMPDecrypt -- Decrypt a fragment using the CCMP cipher. +* +* SYNOPSIS +* success = CCMPDecrypt(unit, header, data, size, buffer, +* iv_only) +* +* BOOL CCMPDecrypt(struct DevUnit *, UBYTE *, UBYTE *, UWORD, UBYTE *, +* BOOL); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +**************************************************************************** +* +*/ + +static BOOL CCMPDecrypt(struct DevUnit *unit, const UBYTE *header, + const UBYTE *data, UWORD size, UBYTE *buffer, UWORD key_no, + struct DevBase *base) +{ + struct CCMPKey *key; + UBYTE aad_blocks[16 * 2], nonce_block[16], *q; + const UBYTE *p; + UWORD i, j, block_count; + ULONG n, mic_block[4], key_block[4]; + BOOL success = TRUE; +#ifndef __mc68000 + ULONG data_block[4]; +#endif + + /* Get key */ + + size -= MIC_SIZE; + key = &unit->keys[key_no].u.ccmp; + if(!key->stream_set) + { + AESKeyMix(key->stream, (ULONG *)key->key, base); + key->stream_set = TRUE; + } + + /* Construct AAD blocks */ + + aad_blocks[0] = 0; + aad_blocks[1] = 22; + + *(UWORD *)(aad_blocks + 2) = *(UWORD *)(header + WIFI_FRM_CONTROL) + & MakeLEWord(WIFI_FRM_CONTROLF_VERSION | WIFI_FRM_CONTROLF_TYPE + | (1 << 7) | WIFI_FRM_CONTROLF_TODS | WIFI_FRM_CONTROLF_FROMDS + | WIFI_FRM_CONTROLF_MOREFRAGS | WIFI_FRM_CONTROLF_ORDER) + | MakeLEWord(WIFI_FRM_CONTROLF_WEP); + CopyMem(header + WIFI_FRM_ADDRESS1, aad_blocks + 4, ETH_ADDRESSSIZE * 3); + *(UWORD *)(aad_blocks + 22) = + *(UWORD *)(header + WIFI_FRM_SEQCONTROL) & MakeLEWord(0xf); + + *(ULONG *)(aad_blocks + 24) = 0; + *(ULONG *)(aad_blocks + 28) = 0; + + /* Construct nonce block */ + + nonce_block[0] = 0x59; + + nonce_block[1] = 0; + CopyMem(header + WIFI_FRM_ADDRESS2, nonce_block + 2, ETH_ADDRESSSIZE); + + n = MakeBELong(key->rx_iv_high); + for(i = 0, p = (UBYTE *)&n; i < 4; i++) + nonce_block[8 + i] = p[i]; + n = MakeBELong(key->rx_iv_low); + for(i = 0, p = (UBYTE *)&n + 2; i < 2; i++) + nonce_block[12 + i] = p[i]; + + *(UWORD *)(nonce_block + 14) = MakeBEWord(size); + + /* Initialise MIC block from nonce block */ + + AESEncrypt((ULONG *)nonce_block, mic_block, key->stream, base); + + /* Integrate AAD into MIC */ + + for(i = 0, p = aad_blocks; i < 2; i++, p += 16) + { + EOREncrypt((ULONG *)p, mic_block, mic_block, base); + AESEncrypt(mic_block, mic_block, key->stream, base); + } + + /* Decrypt data and calculate MIC */ + + nonce_block[0] = 0x01; + block_count = (size - 1) / 16 + 1; + + for(i = 1, j = size, p = data, q = buffer; i <= block_count; i++, + p += 16, q += 16, j -= 16) + { + /* Decrypt next block */ + + *(UWORD *)(nonce_block + 14) = MakeBEWord(i); + AESEncrypt((ULONG *)nonce_block, key_block, key->stream, base); + EOREncrypt((ULONG *)p, (ULONG *)q, key_block, base); + + /* Update MIC */ + +#ifndef __mc68000 + if(j < 16) + { + data_block[0] = 0; + data_block[1] = 0; + data_block[2] = 0; + data_block[3] = 0; + CopyMem(q, data_block, j); + } + else + { + CopyMem(q, data_block, 16); + } + EOREncrypt(data_block, mic_block, mic_block, base); + AESEncrypt(mic_block, mic_block, key->stream, base); +#endif + } + + /* Extract and check MIC */ + +#ifndef __mc68000 + *(UWORD *)(nonce_block + 14) = 0; + AESEncrypt((ULONG *)nonce_block, key_block, key->stream, base); + EOREncrypt(mic_block, mic_block, key_block, base); + CopyMem(data + size, mic_block + MIC_SIZE / sizeof(ULONG), MIC_SIZE); + if(mic_block[0] != mic_block[2] || mic_block[1] != mic_block[3]) + success = FALSE; +#endif + + return success; +} + + + +/****i* prism2.device/UpdateMIC ******************************************** +* +* NAME +* UpdateMIC -- Include new data into a Michael MIC value. +* +* SYNOPSIS +* UpdateMIC(left, right, data, count) +* +* VOID UpdateMIC(ULONG *, ULONG *, ULONG *, ULONG); +* +**************************************************************************** +* +*/ + +#if !defined(__mc68000) || defined(__AROS__) +VOID UpdateMIC(ULONG *left, ULONG *right, const ULONG *data, + ULONG count) +{ + ULONG l = *left, r = *right, i; + + for(i = 0; i < count; i++) + { + l ^= LELong(*data++); + r ^= l << 17 | l >> (32 - 17); + l += r; + r ^= ((l & 0x00ff00ff) << 8) | ((l & 0xff00ff00) >> 8); + l += r; + r ^= l << 3 | l >> (32 - 3); + l += r; + r ^= l >> 2 | l << (32 - 2); + l += r; + } + + *left = l; + *right = r; + + return; +} +#endif + + + +/****i* prism2.device/TKIPKeyMix1 ****************************************** +* +* NAME +* TKIPKeyMix1 -- Apply phase 1 of the TKIP key-mixing function. +* +* SYNOPSIS +* TKIPKeyMix1(ttak, tk, ta, iv_high) +* +* VOID TKIPKeyMix1(UWORD *, UWORD *, UWORD *, ULONG); +* +**************************************************************************** +* +*/ + +static VOID TKIPKeyMix1(UWORD *ttak, const UWORD *tk, const UWORD *ta, + ULONG iv_high, struct DevBase *base) +{ + const UWORD *p; + UWORD i, *q, *r, a; + + ttak[0] = iv_high; + ttak[1] = iv_high >> 16; + ttak[2] = LEWord(ta[0]); + ttak[3] = LEWord(ta[1]); + ttak[4] = LEWord(ta[2]); + + for(i = 0; i < 8; i++) + { + p = tk + (i & 1); + q = ttak; + r = ttak + 4; + a = *p++; + *q++ += SBox(*r ^ a); + r = ttak; + *q++ += SBox(*r++ ^ *++p); + p += 2; + *q++ += SBox(*r++ ^ *p++); + *q++ += SBox(*r++ ^ *++p); + *q += SBox(*r++ ^ a) + i; + } + + return; +} + + + +/****i* prism2.device/TKIPKeyMix2 ****************************************** +* +* NAME +* TKIPKeyMix2 -- Apply phase 2 of the TKIP key-mixing function. +* +* SYNOPSIS +* TKIPKeyMix2(rc4_seed, ttak, tk, iv16) +* +* VOID TKIPKeyMix2(UBYTE *, UWORD *, UWORD *, UWORD); +* +**************************************************************************** +* +*/ + +#if !defined(__mc68000) || defined(__AROS__) +VOID TKIPKeyMix2(UBYTE *rc4_seed, const UWORD *ttak, const UWORD *tk, + UWORD iv16, struct DevBase *base) +{ + const UWORD *p = ttak; + UWORD i, temp_key[6], *q = temp_key, *r, a; + + for(i = 0; i < 5; i++) + *q++ = *p++; + a = *q++ = ttak[4] + iv16; + + p = tk; + r = q = temp_key; + *q++ += SBox(a ^ *p++); + *q++ += SBox(*r++ ^ *p++); + *q++ += SBox(*r++ ^ *p++); + *q++ += SBox(*r++ ^ *p++); + *q++ += SBox(*r++ ^ *p++); + *q++ += SBox(*r++ ^ *p++); + + q = temp_key; + a = *r++ ^ *p++; + *q++ += a << 15 | a >> 1; + r = temp_key; + a = *r++ ^ *p++; + *q++ += a << 15 | a >> 1; + a = *r++; + *q++ += a << 15 | a >> 1; + a = *r++; + *q++ += a << 15 | a >> 1; + a = *r++; + *q++ += a << 15 | a >> 1; + a = *r; + *q += a << 15 | a >> 1; + + *rc4_seed++ = iv16 >> 8; + *rc4_seed++ = (iv16 >> 8 | 0x20) & 0x7f; + *rc4_seed++ = iv16; + *rc4_seed++ = (*q ^ tk[0]) >> 1; + q = temp_key; + for(i = 0; i < 6; i++) + { + a = *q++; + *rc4_seed++ = a; + *rc4_seed++ = a >> 8; + } + + return; +} +#endif + + + +/****i* prism2.device/RC4Encrypt ******************************************* +* +* NAME +* RC4Encrypt -- Encrypt data using the RC4 cipher, and append CRC. +* +* SYNOPSIS +* RC4Encrypt(unit, data, size, buffer, seed) +* +* VOID RC4Encrypt(struct DevUnit *, UBYTE *, UWORD, UBYTE *, UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +**************************************************************************** +* +*/ + +#if !defined(__mc68000) || defined(__AROS__) +VOID RC4Encrypt(struct DevUnit *unit, const UBYTE *data, UWORD size, + UBYTE *buffer, UBYTE *seed, struct DevBase *base) +{ + UWORD i, j, k; + ULONG crc = ~0; + const UBYTE *p; + UBYTE s[256], *q, a, b, c; + + /* Initialise RC4 state */ + + for(i = 0; i < 256; i++) + s[i] = i; + for(j = i = 0; i < 256; i++) + { + a = s[i]; + j = j + seed[i & 0xf] + a & 0xff; + s[i] = s[j]; + s[j] = a; + } + + /* Encrypt data and CRC */ + + for(p = data, q = buffer, k = j = i = 0; k < size + 4; k++) + { + if(k == size) + { + *(ULONG *)q = MakeLELong(~crc); + p = q; + } + i = i + 1 & 0xff; + a = s[i]; + j = j + a & 0xff; + s[i] = b = s[j]; + s[j] = a; + c = *p++; + *q++ = c ^ s[a + b & 0xff]; + crc = crc32[(crc ^ c) & 0xff] ^ crc >> 8; + } + + return; +} +#endif + + + +/****i* prism2.device/RC4Decrypt ******************************************* +* +* NAME +* RC4Decrypt -- Decrypt data using the RC4 cipher, and check CRC. +* +* SYNOPSIS +* success = RC4Encrypt(unit, data, size, buffer, seed) +* +* BOOL RC4Decrypt(struct DevUnit *, UBYTE *, UWORD, UBYTE *, UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +* The output buffer must be at least as big as the input data. +* +**************************************************************************** +* +*/ + +#if !defined(__mc68000) || defined(__AROS__) +BOOL RC4Decrypt(struct DevUnit *unit, const UBYTE *data, UWORD size, + UBYTE *buffer, UBYTE *seed, struct DevBase *base) +{ + UWORD i, j, k; + ULONG crc = ~0; + const UBYTE *p; + UBYTE s[256], *q, a, b, c; + + /* Initialise RC4 state */ + + for(i = 0; i < 256; i++) + s[i] = i; + for(j = i = 0; i < 256; i++) + { + a = s[i]; + j = j + seed[i & 0xf] + s[i] & 0xff; + s[i] = s[j]; + s[j] = a; + } + + /* Decrypt data and CRC */ + + for(p = data, q = buffer, k = j = i = 0; k < size; k++) + { + i = i + 1 & 0xff; + a = s[i]; + j = j + a & 0xff; + b = s[j]; + s[j] = a; + s[i] = b; + c = *p++ ^ s[a + b & 0xff]; + if(k < size - 4) + crc = crc32[(crc ^ c) & 0xff] ^ crc >> 8; + *q++ = c; + } + + /* Check CRC */ + + return ~crc == LELong(*(ULONG *)(q - 4)); +} +#endif + + + +/****i* prism2.device/EOREncrypt ******************************************* +* +* NAME +* EOREncrypt -- Apply exclusive-or to a block. +* +* SYNOPSIS +* EOREncrypt(data, buffer, key) +* +* VOID EOREncrypt(UBYTE *, UBYTE *, UBYTE *); +* +* NOTES +*# The input data may overlap the output buffer as long as the output +*# address is not higher than the input address. +* +**************************************************************************** +* +*/ + +VOID EOREncrypt(const ULONG *data, ULONG *buffer, ULONG *key, + struct DevBase *base) +{ + *buffer++ = *data++ ^ *key++; + *buffer++ = *data++ ^ *key++; + *buffer++ = *data++ ^ *key++; + *buffer++ = *data++ ^ *key++; +} + + + +/****i* prism2.device/AESKeyMix ******************************************** +* +* NAME +* AESKeyMix -- Expand an AES key into a key stream. +* +* SYNOPSIS +* AESKeyMix(stream, key) +* +* VOID AESKeyMix(struct DevUnit *, UBYTE *); +* +**************************************************************************** +* +*/ + +static VOID AESKeyMix(ULONG *stream, const ULONG *key, struct DevBase *base) +{ + UWORD i; + ULONG n; + + stream[0] = BELong(key[0]); + stream[1] = BELong(key[1]); + stream[2] = BELong(key[2]); + stream[3] = BELong(key[3]); + + for(i = 0; i < 10; i++) + { + n = stream[3]; + stream[4] = stream[0] ^ (te4[(n >> 16) & 0xff] & 0xff000000) + ^ (te4[(n >> 8) & 0xff] & 0x00ff0000) + ^ (te4[n & 0xff] & 0x0000ff00) + ^ (te4[n >> 24] & 0x000000ff) ^ rcon[i]; + stream[5] = stream[1] ^ stream[4]; + stream[6] = stream[2] ^ stream[5]; + stream[7] = stream[3] ^ stream[6]; + stream += 4; + } +} + + + +/****i* prism2.device/AESEncrypt ******************************************* +* +* NAME +* AESEncrypt -- Encrypt a block using the AES cipher. +* +* SYNOPSIS +* AESEncrypt(data, buffer, key) +* +* VOID AESEncrypt(UBYTE *, UBYTE *, UBYTE *); +* +**************************************************************************** +* +*/ + +#if !defined(__mc68000) || defined(__AROS__) +VOID AESEncrypt(const ULONG *data, ULONG *buffer, ULONG *key, + struct DevBase *base) +{ + UWORD i = 5; + ULONG s0, s1, s2, s3, t0, t1, t2, t3; + + + s0 = BELong(data[0]) ^ key[0]; + s1 = BELong(data[1]) ^ key[1]; + s2 = BELong(data[2]) ^ key[2]; + s3 = BELong(data[3]) ^ key[3]; + + while(TRUE) + { + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] + ^ te3[s3 & 0xff] ^ key[4]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] + ^ te3[s0 & 0xff] ^ key[5]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] + ^ te3[s1 & 0xff] ^ key[6]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] + ^ te3[s2 & 0xff] ^ key[7]; + + key += 8; + if(--i == 0) + break; + + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] + ^ te3[t3 & 0xff] ^ key[0]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] + ^ te3[t0 & 0xff] ^ key[1]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] + ^ te3[t1 & 0xff] ^ key[2]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] + ^ te3[t2 & 0xff] ^ key[3]; + } + + s0 = (te4[t0 >> 24] & 0xff000000) ^ (te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (te4[t3 & 0xff] & 0x000000ff) + ^ key[0]; + buffer[0] = MakeBELong(s0); + s1 = (te4[t1 >> 24] & 0xff000000) ^ (te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (te4[t0 & 0xff] & 0x000000ff) + ^ key[1]; + buffer[1] = MakeBELong(s1); + s2 = (te4[t2 >> 24] & 0xff000000) ^ (te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (te4[t1 & 0xff] & 0x000000ff) + ^ key[2]; + buffer[2] = MakeBELong(s2); + s3 = (te4[t3 >> 24] & 0xff000000) ^ (te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (te4[t2 & 0xff] & 0x000000ff) + ^ key[3]; + buffer[3] = MakeBELong(s3); + + return; +} +#endif + + + diff --git a/workbench/devs/networks/prism2/encryption_68k.s b/workbench/devs/networks/prism2/encryption_68k.s new file mode 100644 index 0000000000..20e9246010 --- /dev/null +++ b/workbench/devs/networks/prism2/encryption_68k.s @@ -0,0 +1,945 @@ +/* + +Copyright (C) 2011 Neil Cafferkey + +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. + +*/ + + +/****i* prism2.device/UpdateMIC ******************************************** +* +* NAME +* UpdateMIC -- Include new data into a Michael MIC value. +* +* SYNOPSIS +* UpdateMIC(left, right, data, count) +* +* VOID UpdateMIC(ULONG *, ULONG *, ULONG *, ULONG); +* +* INTERNALS +* Register assignment relative to C implementation: +* +* d2: l +* d3: r +* d4: count +* a2: left +* a3: right +* a4: data +* +**************************************************************************** +* +*/ + + .globl _UpdateMIC + +_UpdateMIC: + + /* Anchor stack arguments */ + + link a5,#0 + + /* Push registers that should be preserved on to stack */ + + movem.l d2-d7/a2-a4,-(sp) + + /* Apply transformation */ + + movea.l (8,a5),a2 + movea.l (12,a5),a3 + movea.l (16,a5),a4 + move.l (20,a5),d4 + subq.w #1,d4 + + move.l (a2),d2 + move.l (a3),d3 + +mic_loop$: + + move.l (a4)+,d0 + rol.w #8,d0 + swap.w d0 + rol.w #8,d0 + eor.l d0,d2 + + move.l d2,d0 + swap.w d0 + rol.l #1,d0 + eor.l d0,d3 + + add.l d3,d2 + + move.l d2,d0 + rol.w #8,d0 + swap.w d0 + rol.w #8,d0 + swap.w d0 + eor.l d0,d3 + + add.l d3,d2 + + move.l d2,d0 + rol.l #3,d0 + eor.l d0,d3 + + add.l d3,d2 + + move.l d2,d0 + ror.l #2,d0 + eor.l d0,d3 + + add.l d3,d2 + + dbra d4,mic_loop$ + + /* Store new left and right values */ + + move.l d2,(a2) + move.l d3,(a3) + + /* Pop preserved registers off stack and return with original SP */ + + movem.l (sp)+,d2-d7/a2-a4 + unlk a5 + rts + + + + +/****i* prism2.device/TKIPKeyMix2 ****************************************** +* +* NAME +* TKIPKeyMix2 -- Apply phase 2 of the TKIP key-mixing function. +* +* SYNOPSIS +* TKIPKeyMix2(rc4_seed, ttak, tk, iv16) +* +* VOID TKIPKeyMix2(UBYTE *, UWORD *, UWORD *, UWORD); +* +* INTERNALS +* Register assignment relative to C implementation: +* +* d4: iv16 +* a0: temp_key +* a1: sbox +* a2: rc4_seed +* a3: ttak +* a4: tk +* +**************************************************************************** +* +*/ + + .globl _TKIPKeyMix2 + +_TKIPKeyMix2: + + /* Anchor stack arguments */ + + link a5,#0 + + /* Push registers that should be preserved on to stack */ + + movem.l d2-d7/a2-a4,-(sp) + + /* --- */ + + movea.l (12,a5),a3 + + move.l (a3)+,d5 + move.l (a3)+,d6 + move.w (a3)+,d7 + + move.w d7,d1 + move.w (22,a5),d4 + add.w d4,d1 + swap.w d7 + move.w d1,d7 + + movea.l (16,a5),a4 + lea _sbox,a1 + + /* --- */ + + move.w (a4)+,d0 + eor.w d0,d1 + moveq #0,d2 + move.b d1,d2 + lsr.w #8,d1 + lsl.w #1,d2 + move.w (a1,d2:w),d0 + lsl.w #1,d1 + move.w (a1,d1:w),d1 + rol.w #8,d1 + eor.w d0,d1 + swap.w d5 + add.w d1,d5 + + move.w (a4)+,d1 + eor.w d5,d1 + moveq #0,d2 + move.b d1,d2 + lsr.w #8,d1 + lsl.w #1,d2 + move.w (a1,d2:w),d0 + lsl.w #1,d1 + move.w (a1,d1:w),d1 + rol.w #8,d1 + eor.w d0,d1 + swap.w d5 + add.w d1,d5 + + move.w (a4)+,d1 + eor.w d5,d1 + moveq #0,d2 + move.b d1,d2 + lsr.w #8,d1 + lsl.w #1,d2 + move.w (a1,d2:w),d0 + lsl.w #1,d1 + move.w (a1,d1:w),d1 + rol.w #8,d1 + eor.w d0,d1 + swap.w d6 + add.w d1,d6 + + move.w (a4)+,d1 + eor.w d6,d1 + moveq #0,d2 + move.b d1,d2 + lsr.w #8,d1 + lsl.w #1,d2 + move.w (a1,d2:w),d0 + lsl.w #1,d1 + move.w (a1,d1:w),d1 + rol.w #8,d1 + eor.w d0,d1 + swap.w d6 + add.w d1,d6 + + move.w (a4)+,d1 + eor.w d6,d1 + moveq #0,d2 + move.b d1,d2 + lsr.w #8,d1 + lsl.w #1,d2 + move.w (a1,d2:w),d0 + lsl.w #1,d1 + move.w (a1,d1:w),d1 + rol.w #8,d1 + eor.w d0,d1 + swap.w d7 + add.w d1,d7 + + move.w (a4)+,d1 + eor.w d7,d1 + moveq #0,d2 + move.b d1,d2 + lsr.w #8,d1 + lsl.w #1,d2 + move.w (a1,d2:w),d0 + lsl.w #1,d1 + move.w (a1,d1:w),d1 + rol.w #8,d1 + eor.w d0,d1 + swap.w d7 + add.w d1,d7 + + /* --- */ + + move.w (a4)+,d0 + eor.w d7,d0 + ror.w #1,d0 + swap.w d5 + add.w d0,d5 + + move.w (a4)+,d0 + eor.w d5,d0 + ror.w #1,d0 + swap.w d5 + add.w d5,d0 + move.w d0,d5 + + ror.w #1,d0 + swap.w d6 + add.w d6,d0 + move.w d0,d6 + + ror.w #1,d0 + swap.w d6 + add.w d6,d0 + move.w d0,d6 + + ror.w #1,d0 + swap.w d7 + add.w d7,d0 + move.w d0,d7 + + ror.w #1,d0 + swap.w d7 + add.w d7,d0 + move.w d0,d7 + + /* Write RC4 seed */ + + movea.l (8,a5),a2 + + move.w d4,d1 + rol.w #8,d1 + move.b d1,(a2)+ + ori.b #0x20,d1 + andi.b #0x7f,d1 + move.b d1,(a2)+ + move.b d4,(a2)+ + + movea.l (16,a5),a4 + move.w (a4),d1 + eor.w d1,d0 + lsr.w #1,d0 + move.b d0,(a2)+ + + moveq #5,d3 + + rol.w #8,d5 + swap.w d5 + rol.w #8,d5 + swap.w d5 + move.l d5,(a2)+ + + rol.w #8,d6 + swap.w d6 + rol.w #8,d6 + swap.w d6 + move.l d6,(a2)+ + + rol.w #8,d7 + swap.w d7 + rol.w #8,d7 + swap.w d7 + move.l d7,(a2)+ + + /* Pop preserved registers off stack and return with original SP */ + + movem.l (sp)+,d2-d7/a2-a4 + unlk a5 + rts + + + +/****i* prism2.device/RC4Encrypt ******************************************* +* +* NAME +* RC4Encrypt -- Encrypt data using the RC4 cipher, and append CRC. +* +* SYNOPSIS +* RC4Encrypt(unit, data, size, buffer, seed) +* +* VOID RC4Encrypt(struct DevUnit *, UBYTE *, UWORD, UBYTE *, UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +* INTERNALS +* Register assignment relative to C implementation: +* +* d2: n, i +* d3: j +* d4: "k" +* d5: crc +* a0: data +* a1: buffer +* a2: s +* a3: seed, crc32 +* +**************************************************************************** +* +*/ + + .globl _RC4Encrypt + +_RC4Encrypt: + + /* Anchor stack arguments and make space for S table */ + + link a5,#-256 + + /* Push registers that should be preserved on to stack */ + + movem.l d2-d7/a2-a4,-(sp) + + /* Initialise RC4 state */ + + move.l #0x00010203,d2 + lea (-256,a5),a2 + movea.l a2,a0 + +preinit_state$: + + move.l d2,(a0)+ + add.l #0x04040404,d2 + bcc.b preinit_state$ + + moveq #0,d2 + moveq #0,d3 + move.w #255,d4 + movea.l (24,a5),a3 + movea.l a2,a0 + +init_state$: + + move.b (a0),d0 + andi.w #0xf,d2 + add.b (a3,d2:w),d3 + add.b d0,d3 + + move.b (a2,d3:w),(a0)+ + move.b d0,(a2,d3:w) + + addq.b #1,d2 + dbra d4,init_state$ + + /* Encrypt data and calculate CRC */ + + moveq #0,d1 + moveq #0,d2 + moveq #0,d3 + move.w (18,a5),d4 + subq.w #1,d4 + moveq #-1,d5 + moveq #0,d6 + movea.l (12,a5),a0 + movea.l (20,a5),a1 + lea _crc32,a3 + +encrypt$: + + /* Encrypt a byte */ + + addq.b #1,d2 + move.b (a2,d2:w),d0 + add.b d0,d3 + + move.b (a2,d3:w),d1 + move.b d1,(a2,d2:w) + move.b d0,(a2,d3:w) + + add.b d0,d1 + move.b (a0)+,d0 + move.b (a2,d1:w),d1 + eor.b d0,d1 + move.b d1,(a1)+ + + /* Update CRC */ + + eor.l d5,d0 + andi.l #0xff,d0 + lsl.l #2,d0 + move.l (a3,d0:w),d0 + lsr.l #8,d5 + eor.l d0,d5 + + dbra d4,encrypt$ + + /* Check if CRC has been encrypted */ + + tst.b d6 + bne.b crc_done$ + moveq #1,d6 + + /* Copy CRC complement to buffer, then go back and encrypt it */ + + not.l d5 + rol.w #8,d5 + swap.w d5 + rol.w #8,d5 + move.l d5,(a1) + + movea.l a1,a0 + moveq #3,d4 + bra.b encrypt$ + +crc_done$: + + /* Pop preserved registers off stack and return with original SP */ + + movem.l (sp)+,d2-d7/a2-a4 + unlk a5 + rts + + + +/****i* prism2.device/RC4Decrypt ******************************************* +* +* NAME +* RC4Decrypt -- Decrypt data using the RC4 cipher, and check CRC. +* +* SYNOPSIS +* success = RC4Encrypt(unit, data, size, buffer, seed) +* +* BOOL RC4Decrypt(struct DevUnit *, UBYTE *, UWORD, UBYTE *, UBYTE *); +* +* NOTES +* The input data may overlap the output buffer as long as the output +* address is not higher than the input address. +* +* The output buffer must be at least as big as the input data. +* +* INTERNALS +* This implementation skips the CRC/ICV check in order to gain speed. +* +* Register assignment relative to C implementation: +* +* d2: n, i +* d3: j +* a0: data +* a1: buffer +* a2: s +* a3: seed +* +**************************************************************************** +* +*/ + + .globl _RC4Decrypt + +_RC4Decrypt: + + /* Anchor stack arguments and make space for S table */ + + link a5,#-256 + + /* Push registers that should be preserved on to stack */ + + movem.l d2-d7/a2-a4,-(sp) + + /* Initialise RC4 state */ + + move.l #0x00010203,d2 + lea (-256,a5),a2 + movea.l a2,a0 + +preinit_state2$: + + move.l d2,(a0)+ + add.l #0x04040404,d2 + bcc.b preinit_state2$ + + moveq #0,d2 + moveq #0,d3 + move.w #255,d4 + movea.l (24,a5),a3 + movea.l a2,a0 + +init_state2$: + + move.b (a0),d0 + andi.w #0xf,d2 + add.b (a3,d2:w),d3 + add.b d0,d3 + + move.b (a2,d3:w),(a0)+ + move.b d0,(a2,d3:w) + + addq.b #1,d2 + dbra d4,init_state2$ + + /* Decrypt data and calculate CRC */ + + moveq #0,d1 + moveq #0,d2 + moveq #0,d3 + move.w (18,a5),d4 + subq.w #5,d4 + movea.l (12,a5),a0 + movea.l (20,a5),a1 + +decrypt$: + + /* Decrypt a byte */ + + addq.b #1,d2 + move.b (a2,d2:w),d0 + add.b d0,d3 + + move.b (a2,d3:w),d1 + move.b d1,(a2,d2:w) + move.b d0,(a2,d3:w) + + add.b d0,d1 + move.b (a0)+,d0 + move.b (a2,d1:w),d1 + eor.b d1,d0 + move.b d0,(a1)+ + + dbra d4,decrypt$ + + /* Assume a good CRC */ + + moveq #-1,d0 + + + /* Pop preserved registers off stack and return with original SP */ + + movem.l (sp)+,d2-d7/a2-a4 + unlk a5 + rts + + + +/****i* prism2.device/AESEncrypt ******************************************* +* +* NAME +* AESEncrypt -- Encrypt a block using the AES cipher. +* +* SYNOPSIS +* AESEncrypt(data, buffer, key) +* +* VOID AESEncrypt(UBYTE *, UBYTE *, UBYTE *); +* +* INTERNALS +* Register assignment relative to C implementation: +* +* d0: s0 +* d1: s1 +* d2: s2 +* d3: s3 +* d4: i +* a0: s0, data +* a1: s1 +* a2: s2 +* a3: s3 +* a4: s3, key, buffer +* a5: te0 +* +**************************************************************************** +* +*/ + + .globl _AESEncrypt + +_AESEncrypt: + + /* Anchor stack arguments */ + + link a5,#0 + + /* Push registers that should be preserved on to stack */ + + movem.l d2-d7/a2-a4,-(sp) + + /* Initialise AES state */ + + movea.l (8,a5),a0 + movea.l (16,a5),a4 + move.l a5,d5 + + move.l (a0)+,d0 + move.l (a4)+,d7 + eor.l d7,d0 + move.l (a0)+,d1 + move.l (a4)+,d7 + eor.l d7,d1 + move.l (a0)+,d2 + move.l (a4)+,d7 + eor.l d7,d2 + move.l (a0)+,d3 + move.l (a4)+,d7 + eor.l d7,d3 + + /* Save s values in address registers */ + + movea.l d0,a0 + movea.l d1,a1 + movea.l d2,a2 + movea.l d3,a3 + + /* Apply first 9 rounds */ + + lea _te0,a5 + moveq #8,d4 + +aes_loop$: + + /* Initialise new state from key */ + + move.l (a4)+,d0 + move.l (a4)+,d1 + move.l (a4)+,d2 + move.l (a4)+,d3 + + /* Inject s0-based data */ + + move.l a0,d6 + + moveq #0,d7 + move.b d6,d7 + move.l (0x300*4:w,a5,d7:w*4),d7 + eor.l d7,d1 + + lsr.w #8,d6 + move.l (0x200*4:w,a5,d6:w*4),d7 + eor.l d7,d2 + + swap.w d6 + moveq #0,d7 + move.b d6,d7 + move.l (0x100*4:w,a5,d7:w*4),d7 + eor.l d7,d3 + + lsr.w #8,d6 + move.l (a5,d6:w*4),d7 + eor.l d7,d0 + + /* Inject s1-based data */ + + move.l a1,d6 + + moveq #0,d7 + move.b d6,d7 + move.l (0x300*4:w,a5,d7:w*4),d7 + eor.l d7,d2 + + lsr.w #8,d6 + move.l (0x200*4:w,a5,d6:w*4),d7 + eor.l d7,d3 + + swap.w d6 + moveq #0,d7 + move.b d6,d7 + move.l (0x100*4:w,a5,d7:w*4),d7 + eor.l d7,d0 + + lsr.w #8,d6 + move.l (a5,d6:w*4),d7 + eor.l d7,d1 + + /* Inject s2-based data */ + + move.l a2,d6 + + moveq #0,d7 + move.b d6,d7 + move.l (0x300*4:w,a5,d7:w*4),d7 + eor.l d7,d3 + + lsr.w #8,d6 + move.l (0x200*4:w,a5,d6:w*4),d7 + eor.l d7,d0 + + swap.w d6 + moveq #0,d7 + move.b d6,d7 + move.l (0x100*4:w:w,a5,d7:w*4),d7 + eor.l d7,d1 + + lsr.w #8,d6 + move.l (a5,d6:w*4),d7 + eor.l d7,d2 + + /* Inject s3-based data */ + + move.l a3,d6 + + moveq #0,d7 + move.b d6,d7 + move.l (0x300*4:w,a5,d7:w*4),d7 + eor.l d7,d0 + + lsr.w #8,d6 + move.l (0x200*4:w,a5,d6:w*4),d7 + eor.l d7,d1 + + swap.w d6 + moveq #0,d7 + move.b d6,d7 + move.l (0x100*4:w,a5,d7:w*4),d7 + eor.l d7,d2 + + lsr.w #8,d6 + move.l (a5,d6:w*4),d7 + eor.l d7,d3 + + /* Save state values in address registers */ + + movea.l d0,a0 + movea.l d1,a1 + movea.l d2,a2 + movea.l d3,a3 + + dbra d4,aes_loop$ + + /* Apply final round */ + + lea _te4,a5 + + /* Initialise new state from key */ + + move.l (a4)+,d0 + move.l (a4)+,d1 + move.l (a4)+,d2 + move.l (a4)+,d3 + + /* Inject s0-based data */ + + move.l a0,d6 + + move.w d6,d7 + andi.w #0xff,d7 + lsl.w #2,d7 + move.l (a5,d7:w),d7 + andi.l #0x000000ff,d7 + eor.l d7,d1 + + lsr.w #6,d6 + move.w d6,d7 + andi.w #0x3fc,d7 + move.l (a5,d7:w),d7 + andi.l #0x0000ff00,d7 + eor.l d7,d2 + + swap.w d6 + move.w d6,d7 + andi.w #0xff,d7 + lsl.w #2,d7 + move.l (a5,d7:w),d7 + andi.l #0x00ff0000,d7 + eor.l d7,d3 + + lsr.w #6,d6 + move.w d6,d7 + andi.w #0x3fc,d7 + move.l (a5,d7:w),d7 + andi.l #0xff000000,d7 + eor.l d7,d0 + + /* Inject s1-based data */ + + move.l a1,d6 + + move.w d6,d7 + andi.w #0xff,d7 + lsl.w #2,d7 + move.l (a5,d7:w),d7 + andi.l #0x000000ff,d7 + eor.l d7,d2 + + lsr.w #6,d6 + move.w d6,d7 + andi.w #0x3fc,d7 + move.l (a5,d7:w),d7 + andi.l #0x0000ff00,d7 + eor.l d7,d3 + + swap.w d6 + move.w d6,d7 + andi.w #0xff,d7 + lsl.w #2,d7 + move.l (a5,d7:w),d7 + andi.l #0x00ff0000,d7 + eor.l d7,d0 + + lsr.w #6,d6 + move.w d6,d7 + andi.w #0x3fc,d7 + move.l (a5,d7:w),d7 + andi.l #0xff000000,d7 + eor.l d7,d1 + + /* Inject s2-based data */ + + move.l a2,d6 + + move.w d6,d7 + andi.w #0xff,d7 + lsl.w #2,d7 + move.l (a5,d7:w),d7 + andi.l #0x000000ff,d7 + eor.l d7,d3 + + lsr.w #6,d6 + move.l d6,d7 + andi.w #0x3fc,d7 + move.l (a5,d7:w),d7 + andi.l #0x0000ff00,d7 + eor.l d7,d0 + + swap.w d6 + move.w d6,d7 + andi.w #0xff,d7 + lsl.w #2,d7 + move.l (a5,d7:w),d7 + andi.l #0x00ff0000,d7 + eor.l d7,d1 + + lsr.w #6,d6 + move.w d6,d7 + andi.w #0x3fc,d7 + move.l (a5,d7:w),d7 + andi.l #0xff000000,d7 + eor.l d7,d2 + + /* Inject s3-based data */ + + move.l a3,d6 + + move.w d6,d7 + andi.w #0xff,d7 + lsl.w #2,d7 + move.l (a5,d7:w),d7 + andi.l #0x000000ff,d7 + eor.l d7,d0 + + lsr.w #6,d6 + move.w d6,d7 + andi.w #0x3fc,d7 + move.l (a5,d7:w),d7 + andi.l #0x0000ff00,d7 + eor.l d7,d1 + + swap.w d6 + move.w d6,d7 + andi.w #0xff,d7 + lsl.w #2,d7 + move.l (a5,d7:w),d7 + andi.l #0x00ff0000,d7 + eor.l d7,d2 + + lsr.w #6,d6 + move.w d6,d7 + andi.w #0x3fc,d7 + move.l (a5,d7:w),d7 + andi.l #0xff000000,d7 + eor.l d7,d3 + + /* Write final state to buffer */ + + movea.l d5,a5 + movea.l (12,a5),a4 + + move.l d0,(a4)+ + move.l d1,(a4)+ + move.l d2,(a4)+ + move.l d3,(a4)+ + + /* Pop preserved registers off stack and return with original SP */ + + movem.l (sp)+,d2-d7/a2-a4 + unlk a5 + rts + + + diff --git a/workbench/devs/networks/prism2/encryption_protos.h b/workbench/devs/networks/prism2/encryption_protos.h new file mode 100755 index 0000000000..2035ab9ee1 --- /dev/null +++ b/workbench/devs/networks/prism2/encryption_protos.h @@ -0,0 +1,69 @@ +/* + +Copyright (C) 2010 Neil Cafferkey + +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. + +*/ + +#ifndef ENCRYPTION_PROTOS_H +#define ENCRYPTION_PROTOS_H + + +#include "device.h" + +VOID WriteClearFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +VOID EncryptWEPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +VOID WriteWEPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +VOID EncryptTKIPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +VOID WriteTKIPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +VOID EncryptCCMPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +VOID WriteCCMPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +BOOL ReadClearFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +BOOL DecryptWEPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +BOOL ReadWEPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +BOOL DecryptTKIPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +BOOL ReadTKIPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +BOOL DecryptCCMPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +BOOL ReadCCMPFragment(struct DevUnit *unit, UBYTE *header, UBYTE *data, + UWORD *size, UBYTE *buffer, struct DevBase *base); +VOID TKIPEncryptFrame(struct DevUnit *unit, const UBYTE *header, + UBYTE *data, UWORD size, UBYTE *buffer, struct DevBase *base); +BOOL TKIPDecryptFrame(struct DevUnit *unit, const UBYTE *header, + UBYTE *data, UWORD size, UBYTE *buffer, UWORD key_no, + struct DevBase *base); +VOID RC4Encrypt(struct DevUnit *unit, const UBYTE *data, UWORD size, + UBYTE *buffer, UBYTE *seed, struct DevBase *base); +BOOL RC4Decrypt(struct DevUnit *unit, const UBYTE *data, UWORD size, + UBYTE *buffer, UBYTE *seed, struct DevBase *base); + + +#endif + + diff --git a/workbench/devs/networks/prism2/expansion.c b/workbench/devs/networks/prism2/expansion.c new file mode 100755 index 0000000000..6a9214fe21 --- /dev/null +++ b/workbench/devs/networks/prism2/expansion.c @@ -0,0 +1,476 @@ +/* + +Copyright (C) 2004-2012 Neil Cafferkey + +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. + +*/ + + +#include +#include + +#include +#include + +#include "pci.h" +#include "plx9052.h" +#include "prism2.h" + +#include "pci_protos.h" +#include "expansion_protos.h" +#include "timer_protos.h" + + +/* Private prototypes */ + +static VOID WordsInIOHook(struct BusContext *context, ULONG offset, + UWORD *buffer, ULONG count); +static VOID WordsOutIOHook(struct BusContext *context, ULONG offset, + const UWORD *buffer, ULONG count); +static VOID BEWordOutIOHook(struct BusContext *context, ULONG offset, + UWORD value); +static UWORD LEWordInIOHook(struct BusContext *context, ULONG offset); +static VOID LEWordOutIOHook(struct BusContext *context, ULONG offset, + UWORD value); + + +IMPORT const UWORD product_codes[]; + + +static const struct TagItem bridge_unit_tags[] = +{ + {IOTAG_WordsIn, (UPINT)WordsInIOHook}, + {IOTAG_WordsOut, (UPINT)WordsOutIOHook}, + {IOTAG_BEWordOut, (UPINT)BEWordOutIOHook}, + {IOTAG_LEWordIn, (UPINT)LEWordInIOHook}, + {IOTAG_LEWordOut, (UPINT)LEWordOutIOHook}, + {TAG_END, 0} +}; + + +/****i* prism2.device/GetExpansionCount ************************************ +* +* NAME +* GetExpansionCount -- Get the number of compatible PCI Cards. +* +* SYNOPSIS +* count = GetExpansionCount() +* +* ULONG GetExpansionCount(); +* +**************************************************************************** +* +*/ + +ULONG GetExpansionCount(struct DevBase *base) +{ + ULONG count = 0; + struct PCIDevice *card; + + if(base->i_pci != NULL) + { + while((card = + base->i_pci->FindDeviceTags(FDT_CandidateList, product_codes, + FDT_Index, count, TAG_END)) != NULL) + { + base->i_pci->FreeDevice(card); + count++; + } + } + + return count; +} + + + +/****i* prism2.device/AllocExpansionCard *********************************** +* +* NAME +* AllocExpansionCard +* +* SYNOPSIS +* context = AllocExpansionCard(index) +* +* struct BusContext *AllocExpansionCard(ULONG); +* +**************************************************************************** +* +*/ + +struct BusContext *AllocExpansionCard(ULONG index, struct DevBase *base) +{ + BOOL success = TRUE; + struct BusContext *context; + struct PCIDevice *card = NULL; + struct PCIResourceRange *io_range = NULL; + UBYTE io_range_no; + ULONG value; + UPINT int_reg; + volatile UBYTE *cor_reg; + + /* Find a compatible card */ + + context = AllocMem(sizeof(struct BusContext), MEMF_PUBLIC | MEMF_CLEAR); + if(context == NULL) + success = FALSE; + + if(success) + { + context->card = card = + base->i_pci->FindDeviceTags(FDT_CandidateList, product_codes, + FDT_Index, index, TAG_END); + if(card == NULL) + success = FALSE; + } + + /* Lock card */ + + if(success) + success = card->Lock(PCI_LOCK_EXCLUSIVE); + + if(success) + { + /* Find out what type of Prism II PCI card this is */ + + card->SetEndian(PCI_MODE_BIG_ENDIAN); + context->bus_type = GetBusType(card->ReadConfigWord(PCI_DEVICE_ID), + base); + + if(context->bus_type == TMD_BUS) + { + /* Reset and enable the PCCard */ + + io_range = card->GetResourceRange(1); + card->OutByte(io_range->BaseAddress, COR_RESET); + BusyMilliDelay(RESET_DELAY, base); + card->OutByte(io_range->BaseAddress, COR_ENABLE); + BusyMilliDelay(RESET_DELAY, base); + card->FreeResourceRange(io_range); + io_range_no = 2; + context->unit_tags = bridge_unit_tags; + } + else if(context->bus_type == PLX_BUS) + { + /* Reset and enable the PCCard */ + + io_range = card->GetResourceRange(2); + cor_reg = (volatile UBYTE *)io_range->BaseAddress + 0x3e0; + *cor_reg = COR_ENABLE; + BusyMilliDelay(RESET_DELAY, base); + card->FreeResourceRange(io_range); + + /* Enable interrupts on the bridge */ + + io_range = card->GetResourceRange(1); + int_reg = io_range->BaseAddress + PLX9052_INTS; + card->FreeResourceRange(io_range); + value = card->InLong(int_reg); + card->OutLong(int_reg, value | (1 << 6)); + if((card->InLong(int_reg) & (1 << 6)) == 0) + success = FALSE; + io_range_no = 3; + context->unit_tags = bridge_unit_tags; + } + else + { + card->WriteConfigWord(PCI_COMMAND, PCI_COMMAND_MEMORY); + /* For PegII */ + io_range_no = 0; + } + + /* Get the I/O base of the wireless chip */ + + context->have_card = TRUE; + card->SetEndian(PCI_MODE_LITTLE_ENDIAN); + io_range = card->GetResourceRange(io_range_no); + context->io_base = io_range->BaseAddress; + card->FreeResourceRange(io_range); + + if(context->bus_type == PCI_BUS) + { + /* Reset and enable the card */ + + cor_reg = (volatile UBYTE *)context->io_base + (P2_REG_PCICOR * 2); + *cor_reg = COR_RESET; + BusyMilliDelay(250, base); + *cor_reg = 0; + BusyMilliDelay(500, base); + } + } + + if(!success) + { + FreeExpansionCard(context, base); + context = NULL; + } + + return context; +} + + + +/****i* prism2.device/FreeExpansionCard ************************************ +* +* NAME +* FreeExpansionCard +* +* SYNOPSIS +* FreeExpansionCard(context) +* +* VOID FreeExpansionCard(struct BusContext *); +* +**************************************************************************** +* +*/ + +VOID FreeExpansionCard(struct BusContext *context, struct DevBase *base) +{ + struct PCIDevice *card; + struct PCIResourceRange *io_range = NULL; + ULONG value; + UPINT int_reg; + volatile UBYTE *cor_reg; + + if(context != NULL) + { + card = context->card; + if(card != NULL) + { + if(context->bus_type == TMD_BUS) + { + /* Disable the PCCard */ + + io_range = card->GetResourceRange(1); + card->OutByte(io_range->BaseAddress, 0); + card->FreeResourceRange(io_range); + } + else if(context->bus_type == PLX_BUS) + { + /* Disable interrupts on the bridge */ + + io_range = card->GetResourceRange(1); + int_reg = io_range->BaseAddress + PLX9052_INTS; + card->FreeResourceRange(io_range); + value = card->InLong(int_reg); + card->OutLong(int_reg, value & ~(1 << 6)); + + /* Disable the PCCard */ + + io_range = card->GetResourceRange(2); + cor_reg = (volatile UBYTE *)io_range->BaseAddress + 0x3e0; + *cor_reg = COR_RESET; + BusyMilliDelay(250, base); + *cor_reg = 0; + + card->FreeResourceRange(io_range); + } + + if(context->have_card) + card->Unlock(); + base->i_pci->FreeDevice(card); + FreeMem(context, sizeof(struct BusContext)); + } + } + + return; +} + + + +/****i* prism2.device/AddExpansionIntServer ******************************** +* +* NAME +* AddExpansionIntServer +* +* SYNOPSIS +* success = AddExpansionIntServer(card, interrupt) +* +* BOOL AddExpansionIntServer(APTR, struct Interrupt *); +* +**************************************************************************** +* +*/ + +BOOL AddExpansionIntServer(APTR card, struct Interrupt *interrupt, + struct DevBase *base) +{ + return AddIntServer(((struct PCIDevice *)card)->MapInterrupt(), + interrupt); +} + + + +/****i* prism2.device/RemExpansionIntServer ******************************** +* +* NAME +* RemExpansionIntServer +* +* SYNOPSIS +* RemExpansionIntServer(card, interrupt) +* +* VOID RemExpansionIntServer(APTR, struct Interrupt *); +* +**************************************************************************** +* +*/ + +VOID RemExpansionIntServer(APTR card, struct Interrupt *interrupt, + struct DevBase *base) +{ + RemIntServer(((struct PCIDevice *)card)->MapInterrupt(), interrupt); + + return; +} + + + +/****i* prism2.device/WordsInIOHook **************************************** +* +* NAME +* WordsInIOHook +* +* SYNOPSIS +* WordsInIOHook(context, offset, buffer, count) +* +* VOID WordsInIOHook(struct BusContext *, ULONG, UWORD *, ULONG); +* +**************************************************************************** +* +*/ + +static VOID WordsInIOHook(struct BusContext *context, ULONG offset, + UWORD *buffer, ULONG count) +{ + struct PCIDevice *card; + + card = context->card; + while(count-- > 0) + *buffer++ = card->InWord(context->io_base + offset); + + return; +} + + + +/****i* prism2.device/WordsOutIOHook *************************************** +* +* NAME +* WordsOutIOHook +* +* SYNOPSIS +* WordsOutIOHook(context, offset, buffer, +* count) +* +* VOID WordsOutIOHook(struct BusContext *, ULONG, const UWORD *, +* ULONG); +* +**************************************************************************** +* +*/ + +static VOID WordsOutIOHook(struct BusContext *context, ULONG offset, + const UWORD *buffer, ULONG count) +{ + struct PCIDevice *card; + + card = context->card; + while(count-- > 0) + card->OutWord(context->io_base + offset, *buffer++); + + return; +} + + + +/****i* prism2.device/BEWordOutIOHook ************************************** +* +* NAME +* BEWordOutIOHook +* +* SYNOPSIS +* BEWordOutIOHook(context, offset, value) +* +* VOID BEWordOutIOHook(struct BusContext *, ULONG, UWORD); +* +**************************************************************************** +* +*/ + +static VOID BEWordOutIOHook(struct BusContext *context, ULONG offset, + UWORD value) +{ + struct PCIDevice *card; + + card = context->card; + card->OutWord(context->io_base + offset, MakeBEWord(value)); + + return; +} + + + +/****i* prism2.device/LEWordInIOHook *************************************** +* +* NAME +* LEWordInIOHook +* +* SYNOPSIS +* value = LEWordInIOHook(context, offset) +* +* UWORD LEWordInIOHook(struct BusContext *, ULONG); +* +**************************************************************************** +* +*/ + +static UWORD LEWordInIOHook(struct BusContext *context, ULONG offset) +{ + struct PCIDevice *card; + + card = context->card; + return LEWord(card->InWord(context->io_base + offset)); +} + + + +/****i* prism2.device/LEWordOutIOHook ************************************** +* +* NAME +* LEWordOutIOHook +* +* SYNOPSIS +* LEWordOutIOHook(context, offset, value) +* +* VOID LEWordOutIOHook(struct BusContext *, ULONG, UWORD); +* +**************************************************************************** +* +*/ + +static VOID LEWordOutIOHook(struct BusContext *context, ULONG offset, + UWORD value) +{ + struct PCIDevice *card; + + card = context->card; + card->OutWord(context->io_base + offset, MakeLEWord(value)); + + return; +} + + + diff --git a/workbench/devs/networks/prism2/prometheus_protos.h b/workbench/devs/networks/prism2/expansion_protos.h old mode 100644 new mode 100755 similarity index 64% copy from workbench/devs/networks/prism2/prometheus_protos.h copy to workbench/devs/networks/prism2/expansion_protos.h index 62eb6b7e44..5471998d0b --- a/workbench/devs/networks/prism2/prometheus_protos.h +++ b/workbench/devs/networks/prism2/expansion_protos.h @@ -1,7 +1,5 @@ /* -File: prometheus_protos.h -Author: Neil Cafferkey Copyright (C) 2005 Neil Cafferkey This program is free software; you can redistribute it and/or modify @@ -21,18 +19,18 @@ MA 02111-1307, USA. */ -#ifndef PROMETHEUS_PROTOS_H -#define PROMETHEUS_PROTOS_H +#ifndef EXPANSION_PROTOS_H +#define EXPANSION_PROTOS_H #include "device.h" -ULONG GetPrometheusCount(struct DevBase *base); -struct BusContext *AllocPrometheusCard(ULONG index, struct DevBase *base); -VOID FreePrometheusCard(struct BusContext *context, struct DevBase *base); -BOOL AddPrometheusIntServer(APTR card, struct Interrupt *interrupt, +ULONG GetExpansionCount(struct DevBase *base); +struct BusContext *AllocExpansionCard(ULONG index, struct DevBase *base); +VOID FreeExpansionCard(struct BusContext *context, struct DevBase *base); +BOOL AddExpansionIntServer(APTR card, struct Interrupt *interrupt, struct DevBase *base); -VOID RemPrometheusIntServer(APTR card, struct Interrupt *interrupt, +VOID RemExpansionIntServer(APTR card, struct Interrupt *interrupt, struct DevBase *base); #endif diff --git a/workbench/devs/networks/prism2/firmware/HermesI b/workbench/devs/networks/prism2/firmware/HermesI new file mode 100644 index 0000000000..186882c102 --- /dev/null +++ b/workbench/devs/networks/prism2/firmware/HermesI @@ -0,0 +1,4069 @@ +S311FF00000005000000DEC21F000A000000FF +S311FF00000008000000BCC21F0008000000FF +S311FF0000000700000036C31F000A000000FF +S311FF00000006000000E8C21F000A000000FF +S311FF000000100100004EDF1F001C000000FF +S311FF0000002001000032DF1F001C000000FF +S311FF000000300100006ADF1F001C000000FF +S311FF0000004001000020DE1F0004000000FF +S311FF000000500100001ADE1F0002000000FF +S311FF000000600100002AE11F001C000000FF +S311FF0000000101000012E21F0006000000FF +S311FF0000000301000096C31F000C000000FF +S311FF0000000401000078C51F0002000000FF +S311FF000000050100001EE21F0002000000FF +S311FF00000005010000BAC51F0002000000FF +S311FF00000005010000BEE31F0002000000FF +S311FF00000007010000A2C31F0002000000FF +S311FF00000009010000C0E31F000A000000FF +S311FF0000006101000032DE1F0000010000FF +S311FF000000FFFFFFFFF4C31F000E000000FF +S311FF000000F2FF00005AC41F0002000000FF +S311FF000000F1FF000060C41F0002000000FF +S311FF000000F9FF000046011F0004000000FF +S311FF000000F9FF000014AA1F0004000000FF +S311FF000000F9FF0000C2AA1F0004000000FF +S311FF000000F7FF0000DC021F0004000000FF +S311FF000000F8FF000062001F0004000000FF +S311FF000000FFFFFFFF6AFF1E000E000000FF +S311FF00000000FD0000A0C21F0006000000FF +S311FF00000001FD0000A6C21F000A000000FF +S311FF00000002FD0000C4C21F000C000000FF +S311FF00000003FD0000D0C21F000E000000FF +S311FF00000004FD0000F2C21F0044000000FF +S311FF000000FFFF000040C31F0012000000FF +S311FF000000FDFF000056C41F0006000000FF +S311FF000000FCFF00005CC41F0006000000FF +S315001F00000F60FC633E600065EF60FE613C6000664A +S315001F0010EF60FE64464B58D0654659D82B46FB1FEA +S315001F002080601378FFFF00640160FE630360FE615A +S315001F003070600066FE600065A5D2DA8559DB6047F1 +S315001F004059DBFA1F88E23E600066C3603E62A2D299 +S315001F005000656041013614003E600066C4605A6246 +S315001F0060A2D0FF60FA64A083FCA1026000650104B0 +S315001F0070B783434599FF435498FFFFFFFFFF016571 +S315001F0080455F00ECECEDE2EE00EF806008EC80606F +S315001F009018ED806002EE806000EFC0605BECC06010 +S315001F00A01BEDC0601FEEC06000EF99FFBF653C44AB +S315001F00B0604701BC249C98FF01609C6300604C61F3 +S315001F00C03E600066C460466458D059D9FD1F216042 +S315001F00D0A8630760FE613E600066C560E46458D091 +S315001F00E059D9FD1F08EEFFFF00EE3F4000361500F1 +S315001F00F0254430FB016599FF349498FF00603663F1 +S315001F0100FF60FE613E600066C460006458D059D926 +S315001F0110FD1F99FF055498FF0B0000600C630060DC +S315001F01203E613E600066C460386458D059D9FD1FD1 +S315001F0130116003E8476007E63F40003A040000E607 +S315001F01407560A2640400076003E65560A26499FF08 +S315001F0150405798FFABFB0FEC806008EC10674052CE +S315001F01603E600066C260F06201600065A2D23F4336 +S315001F017001A802A811030B0303A802600065070369 +S315001F0180007F04A812600065020322600065379F86 +S315001F01900160006532443492006030E2006050E234 +S315001F01A0006079E2006090E288E20160D0E20160BF +S315001F01B0F0E226643BFB016030640AA43CFB604509 +S315001F01C00060F8640AA43DFB3BF10A64C4843EFB4D +S315001F01D0C0840AA43FFB09602A64BDFB82FF92FF0D +S315001F01E098FF32453E600066C260EC62A2D0006492 +S315001F01F06440FF264067BFF1B485644020278067AF +S315001F02003492006440414046404700E14053F86045 +S315001F0210296308609064A0DD006010663C6401FAE3 +S315001F02200A6420FA87FF97FFBEF3FFFF01BCBEFBE0 +S315001F023008608264405A06A4405B006440544055DF +S315001F0240405E405181605378FFFFAEF3ADF36043CC +S315001F02506345CB81DC84E084605CE084E084E084D9 +S315001F0260C09CE084C084E0830064CB8359DBFE1FFF +S315001F027059856543ADF36465DC818067404AC78451 +S315001F0280BDDB2A44A3DB5C8A0EA30164A3DB02A3A6 +S315001F029014600264A3DBCD8152A3F102006457DB15 +S315001F02A0C7832E58FFFF006433F1F8608F64A08563 +S315001F02B03F40003A04000160006499FF11003E6050 +S315001F02C00066C260F062A2D230F36040013680BC85 +S315001F02D002BC99FF4054FFFFFFFFFFFF0060006451 +S315001F02E0B48434FB405098FF246038620E64324059 +S315001F02F0802BA2D3A2DB83FB2960AA64AEFB6043DB +S315001F03001E60E462A2DD8160584E2578FFFF7FA341 +S315001F0310E387007FAFFB3E600066C3603E62A2D2EA +S315001F03208061FBA061440104E084C0A4E084E084F2 +S315001F0330E084CC84B0FBB0F1AFF37C63B2FB6046C4 +S315001F034001FCDC84D08000FAFA04B3FB604600642B +S315001F035000FA6344807F01FAB0F3AFF1DC84D084E6 +S315001F0360B1FB03602A61FE60584D3C78FFFF66446F +S315001F03702DFB0064405063FF66FF65FF64FF61FF4E +S315001F038062FF04652560DA6444D37DFB604100A8E3 +S315001F039060451F0300630864E981CC840224DF8360 +S315001F03A0FB022560E464A0DD65412560E6630B6002 +S315001F03B0E264E98158D1FD04A3D90B0358D1E98121 +S315001F03C06045FC04A3D16447B084BDDB00B9654416 +S315001F03D0F0021F6072650C64A5DB8160F464A5FBE7 +S315001F03E02DFF8360EF78FFFF2444FFB404FB1075D5 +S315001F03F00A61414B09603C61FE60584D3C78FFFF26 +S315001F0400F0670EFA1F6054621F603864A2DB6644F1 +S315001F04105ADB02645ADBFFFF2BFF2B414D8BFFFF7D +S315001F0420E9020A61414B09603C61FE60584D3C7808 +S315001F0430FFFF1F6054621F602C64A2DB66445ADBF9 +S315001F044002645ADBFFFF2BFF2B414D8BFFFFEB0295 +S315001F04503F4400366B0099FF00EA00EB506003EA49 +S315001F0460516003EA526013EA536030EA546040EA6F +S315001F0470556052EA56606DEA576071EA58608BEA1A +S315001F0480596047EA5A60A0EA5B60B2EA5C60C6EA56 +S315001F04905D60D1EA5E60E7EA5F60FBEA5F60A0EA43 +S315001F04A0506036EB516036EB526037EB5360FCEB16 +S315001F04B05460E4EB556034EB566058EB576048EBDD +S315001F04C05860D0EB5960C3EB5A60FCEB5B6034EBB2 +S315001F04D05C60F0EB5D6058EB5E60C0EB5F60D0EB7D +S315001F04E05F6091EB00EA00EBE06002EAE06003EB7D +S315001F04F000EBA06000EBB06000EB99FF3B40403B78 +S315001F05000100FC0000EB036002626244A2DB0F6481 +S315001F051047F300EA334002360F7E99FF405A98FF91 +S315001F0520606000EAA16000EAD16000EABCFED76005 +S315001F0530EB78FFFFA1FFFFFFFD0098FF304402A8E5 +S315001F054000E1090262FF63FF64FF65FF66FFBCFEF1 +S315001F0550BFFEA1FFFFFF82FF91FF99FF88FF6C403F +S315001F056041FFC4E243FF404908E1F8600378FFFFFB +S315001F0570304402A800E10202A1FFFFFF82FF92FFA3 +S315001F058098FF88FF48E23140082A01706B446A448D +S315001F05906040012A12000160036B01E1BBFF674E39 +S315001F05A0A1FF674CA1FF674EA1FF674CA1FF6B44DC +S315001F05B0674CA1FFFFFFBCFF00E1D3F1006B645640 +S315001F05C09FFE020564446054CDE2C2643ADBBCFF61 +S315001F05D0B5FF016003E8116003E8214400BCFFFF7B +S315001F05E030033240012A0A00604676640FFA264419 +S315001F05F0FDB4404600644041CBFE210085FF2A45DD +S315001F060082FF3D5CD480D080010319022644FDB4CD +S315001F0610404600EB00EAA06000EAB06000EA00EB8B +S315001F062047F300EA334002360F7E99FF405A98FF80 +S315001F0630606000EAA16000EAD16000EA1DFF26445F +S315001F064002B440463C4400BCFFFF06032740262257 +S315001F06500300026436FBC0FE2744202A0F0000EB6E +S315001F066047F300EA334002360F7E99FF405A98FF40 +S315001F0670606000EAA16000EAD16000EA0064404DB4 +S315001F0680274418B4404700E10864404C10EE016847 +S315001F0690FF6A6C4044E2C4E246FF47FFB7FFB4FF60 +S315001F06A037F10829090064400722060043FF274443 +S315001F06B010BC4047006437FB84602D7D0C60006BC7 +S315001F06C008609064A0D7FFFFFFFF98FF00E130404E +S315001F06D00236A1FFFFFF83FF8DFF006440444043A6 +S315001F06E040424041FF603364404E1F603264404DBC +S315001F06F0E3E1ACFFADFFC660A978FFFF98FF30446A +S315001F070002A800E1040228E240FFA1FFFFFF84FFC9 +S315001F071088FF98FFD16071644042C860FB64404007 +S315001F0720C2F384FB0B60BC63CFF3BDDB0060A66422 +S315001F0730BDDB0264BDDB0464A3DB0A64404E0164B7 +S315001F074090FB006492FB91FB405C016039E2046000 +S315001F0750007AC860FB78FFFF98FF304400E102A8CB +S315001F076085FF040240FF45FFA1FFFFFF88FF21E130 +S315001F077000644040D160A878FFFFA2FF98FF304475 +S315001F078002A800E10202A1FFFFFF86FF88FF0064A7 +S315001F079040464049BA60584F8978FFFF9760584FC7 +S315001F07A0CC78FFFF9960584FEE78FFFFAA60584F2D +S315001F07B0D478FFFFAC60584FE478FFFFBF60584FF7 +S315001F07C01D78FFFFC560584F1C78FFFFB560584F57 +S315001F07D0B978FFFF13E1A3FF8E60F078FFFF03E1F7 +S315001F07E0A3FF0064C8813C6359DBFE1F407600608F +S315001F07F000640AFB1E60CA6317FDAEFFD760EB7865 +S315001F0800FFFF874C674CA1FF1CF33040082543FFB1 +S315001F0810CC84A2DB01021DFF674CA1FFD3F3BCFFF3 +S315001F08200AA4605404E1A1FF0D60696B674CBBFF0E +S315001F0830C874CDE2294408BC404905E1016440FB68 +S315001F0840A1FF0661CD8104253B00674CA1FFFA027B +S315001F0850F360A06404253400604CA1FF98FF306448 +S315001F08603ADB99FF04252C000460006525443736C2 +S315001F0870B4846E36B484604EA1FF24410425200043 +S315001F0880614C46A16154A1FF294404251900224643 +S315001F089029F09CFE03046440042AB302674EFEB48B +S315001F08A0404907641CFB0C654551454C1AFFF8600F +S315001F08B00378FFFFFC0041FF98FF40643ADB0E0000 +S315001F08C0C4E22744202A070098FF42643ADB3F40D0 +S315001F08D0003A674C030098FF41643ADB99FF30F1F9 +S315001F08E0E0646440012A030008F108FB9EF962FFD9 +S315001F08F008E1725200644049327B4DE2D80044FF42 +S315001F090008E1D500D400D300D2002944FBB44049E6 +S315001F09107244E884E884E884E884E884E8846045CF +S315001F0920B9F3FFFFFFB7E084E084B4857344D48432 +S315001F0930FFFF1065D480FFFF0A04BDFE08E1BEF36A +S315001F0940FFFF6040012A020012EE010002EEF8606E +S315001F09500D78FFFF00604674CDE204E1A1FF98FF0A +S315001F096043643ADB3F4499FF013A05008F600AE66C +S315001F0970806018ED04008F6015E6806019EDC06079 +S315001F09801BED18EDA8F398FF60413F4499FF202BFC +S315001F099067006140402B0D0005638660584F36780F +S315001F09A0FFFF1463FFFFFF1F01638660584F3678F2 +S315001F09B0FFFFFFB1CD81E1852360286444D1FFFF8E +S315001F09C064438660584F3678FFFF00600063866079 +S315001F09D0584F3678FFFF2360446145D1CE64624588 +S315001F09E0645FE8838660584F3678FFFFA7F3CDE232 +S315001F09F06054A1FFFFFF3869FFFF6844802BFD008D +S315001F0A00012A26000360807CA38363BB8660584F40 +S315001F0A103678FFFFE3833869FFFF6841802BFD00AF +S315001F0A2063476140012A0300003ACC840200073A5B +S315001F0A30DC84FFB4A5DB6047E8846765B483866002 +S315001F0A40584F3678FFFFA7F3CDE26054A1FFFFFF93 +S315001F0A50A8F3FFFFFFFF802B4B0086600978FFFF7F +S315001F0A60FFB1CD81E185C581E1852260806298FF56 +S315001F0A703F40102302002260D46299FF46D15AD10B +S315001F0A8064415AD1644564428660584F5678FFFFC9 +S315001F0A90A7F3CDE2605498FF3F4499FF1023160039 +S315001F0AA00161536581628660584F5678FFFF146354 +S315001F0AB00A61FF1F966582628660584F5678FFFF50 +S315001F0AC014630061FF1F006583620E000165656286 +S315001F0AD08660584F5678FFFF016198FF04653240C4 +S315001F0AE0402B006599FF01628660584F5678FFFFBD +S315001F0AF098FFA8F3FFFFCC84E08521604C6444D3A4 +S315001F0B00FFFF604161476148604480BCFFB4604A93 +S315001F0B10FFFF6840802BFD002160686444D3FFFF00 +S315001F0B20604161476148604480BCFFB4604AFFFF73 +S315001F0B306840802BFD002160846444D3FFFF604121 +S315001F0B4061476148604480BCFFB4604AFFFF68404C +S315001F0B50802BFD002160A0643F40022B0200226013 +S315001F0B60106444D3FFFF604161476148604480BC05 +S315001F0B70FFB4604AFFFF6840802BFD002160BC6404 +S315001F0B803F40022B020022602C6444D3FFFF6041CA +S315001F0B9061476148604480BCFFB4604AFFFF6840FC +S315001F0BA0802BFD002160D8643F40022B020022608B +S315001F0BB0486444D3FFFF604161476148604480BC7D +S315001F0BC0FFB4604AFFFF6840802BFD002160F4647C +S315001F0BD03F40022B02002260646444D3FFFF604142 +S315001F0BE061476148604480BCFFB4604AFFFF6840AC +S315001F0BF0802BFD0098FF3F4499FF20270A000761BD +S315001F0C004165A762584F6D001761E0651762584F1F +S315001F0C106800327B4DE2C4E230F1E0646440012A91 +S315001F0C20030008F108FB9EF962FF00634349A1FF19 +S315001F0C30A7FD327B4DE2BFFEC4E241FF43FF30F109 +S315001F0C40E0646440012A040008F108FB9EF9FFFFD7 +S315001F0C50A9F362FF4349604005362DFF0736D5FECF +S315001F0C6008E188608571F8600378FFFFAA60007944 +S315001F0C70806010ED6342FFB2634703B4FFFFFFB40A +S315001F0C806059FFFF7940802BFD006244FFB4605915 +S315001F0C90FFFF7940802BFD00806018ED806019ED05 +S315001F0CA0806018EDA86000792F58FFFFAC600079AF +S315001F0CB06144FFB46059FFFF7940802BFD006544F6 +S315001F0CC0FFB46059FFFF7940802BFD006244FFB4DB +S315001F0CD06059FFFF7940802BFD00A86000792F58CF +S315001F0CE0FFFFAA60007998FF3F4499FF0036E00096 +S315001F0CF0806010ED6144FFB46059FFFF7940802B7F +S315001F0D00FD006544FFB46059FFFF7940802BFD004D +S315001F0D106244FFB46059FFFF7940802BFD00A86035 +S315001F0D200079806018ED806019ED806018ED2F58EE +S315001F0D30FFFF2146B5FF016003E8116003E8BCFF12 +S315001F0D4046FFB7FFB4FF84602D7D0C60006B264302 +S315001F0D50042A13003240012610002844E4360200FC +S315001F0D60F43A0B000A646050404B3144FF60F7654C +S315001F0D7031442491F8601C78FFFF254406FA2A4463 +S315001F0D80DC8023FA204408240164E8800064404084 +S315001F0D90B9F305047245DC84B9FB6055655224FA24 +S315001F0DA0BAF30204DC84BAFB27FABBF30204DC8421 +S315001F0DB0BBFB28FA264304261400274407220500F6 +S315001F0DC0F8B44047066436FBC0FE0FF2FDB3FFFFC3 +S315001F0DD0012B7F0004BB0FFC4346015D05FF1DFF72 +S315001F0DE0780043462D40012A0D00264402BC40468A +S315001F0DF0274407220500F8B44047066436FBC0FEA9 +S315001F0E0035F17A00FCB30FF03240012A06000ABB07 +S315001F0E100FFCCBFEF8602978FFFF2D440C262A0015 +S315001F0E20B3830FFC015D05FFF5F32840803A2200CE +S315001F0E306040033A1F006263BDD285F1BDD2D080E8 +S315001F0E4086F11802D080BDD287F11402D0803C44AF +S315001F0E501102AC86BBFE0E0329F2214684FF6040B9 +S315001F0E60803A0800016436FBC0FE006437FBD16080 +S315001F0E707164404282FF35F1274405222D00FAB4E2 +S315001F0E8040472D44142A2100314008260E002B44CA +S315001F0E90D080704502286444C484FFFF042400B434 +S315001F0EA060500828010020296DE216602E6321F08C +S315001F0EB0C064C084A3D1E884E884E884E884E88415 +S315001F0EC0C084A3DB88604678FFFF026436FBC0FE42 +S315001F0ED00A00F8601C78FFFF022A0500FDB4404790 +S315001F0EE0066436FBC0FE05643ADB2844A43A0400B8 +S315001F0EF03DF125440A363CF1314008260F002B44AC +S315001F0F006440D080704504246444C484FFFF0424D5 +S315001F0F1000B460500828010020296DE2DA003BF377 +S315001F0F200865C494D600F8602978FFFF2744052278 +S315001F0F300700BAB440473C46026436FBC0FEF300C6 +S315001F0F402744022A0600FDB44047066436FBC0FE4E +S315001F0F50EA00060A314008260300016460506DE26C +S315001F0F60E2007245DC84B9FB60556552006440405F +S315001F0F7011643ADBBAF30604DC84BAFBBBF3020442 +S315001F0F80DC84BBFBF8603778FFFF614438FB1264D3 +S315001F0F903ADB18608063BDD37245448A0224DD8123 +S315001F0FA00224DD81BDD3B9F16145C08400610224ED +S315001F0FB001B9C48460552A52B9FB022401B9BDD3B5 +S315001F0FC0BAF16145C0840061022401B9C484BAFB29 +S315001F0FD0022401B9BDD3BBF16145C084C484BBFBE8 +S315001F0FE037F3FFFF6045F860AD78FFFF016090742F +S315001F0FF0CDE2B5FF016003E8116003E8BCFFB7FF50 +S315001F1000B4FF01643ADB84602D7D0C60006B47FFE3 +S315001F1010016457FB87E10065264402260B003E4606 +S315001F102009F2FFFF00BC1E410503405E264402BCB9 +S315001F1030404687E1A1FFFFFF01250B0004250500A0 +S315001F104047FF3274F8602978FFFFC4E28A60B678DA +S315001F1050FFFF4C4E3274CDE2F960C978006104641B +S315001F10603ADBB5FF016003E8116003E8BCFF46FFEA +S315001F107047FFB7FFB4FF0A64404C19FF84602D7DFC +S315001F10800C60006B43E1A1FFFFFFD13F06643ADB13 +S315001F1090224629F0046403FA00F204FA016436FBBF +S315001F10A0C0FE6444402B6B003340023A680009605F +S315001F10B0846280FF265CA2D9275C5AD9285C5AD93C +S315001F10C0295C5AD92A5C5AD92B5C5AD92D5C5AD914 +S315001F10D02F5C5AD942F382FF04A4A0D3FFFFDC84FE +S315001F10E0A2DB4AD31304DC83A2DD4AD30604DC84C5 +S315001F10F0A2DB03043341E181699344F3FFFF60439D +S315001F110080FF8C60584F8F78FFFF82FF44F3FFFFED +S315001F1110604380FF8D60584F1178FFFF096084621E +S315001F1120A2D35AD1404644475AD35AD1404844497C +S315001F11305AD35AD1404A444B5AD35AD1404D444FA1 +S315001F114082FF096074660360FE610E6359D3A6D1E0 +S315001F1150DA86645FA1DB644759D3605C645FA1DBF9 +S315001F1160F51F47F300EA334002360F7E99FF405AB8 +S315001F117098FF606000EAA16000EAD16000EAD160D2 +S315001F11804478FFFFB43A0B00274407220500F8B442 +S315001F11904047026436FBC0FE8960F878FFFF28448B +S315001F11A0D43A490048E21C42224629F0F760FF6400 +S315001F11B0A084A2DA6040402B3F003340023A3C0035 +S315001F11C013F20F656047404514F234F2A49CA484C1 +S315001F11D021F0D084604002361FF042F3444404A439 +S315001F11E044F1A0D36443DC84A2DB80FF8D60584F9B +S315001F11F01178FFFF82FF09607464404D0360FE6132 +S315001F12000E6359D32DD15A8D645FA1DB644759D321 +S315001F1210605C645FA1DBF51F47F300EA33400236CB +S315001F12200F7E99FF405A98FF606000EAA16000EAAE +S315001F1230D16000EA010033002744FBB44047D7F3CF +S315001F12403AFB0BF2FFFF7FB40CF00402644600F07A +S315001F12500464224603FA6041644601F2FCA161451B +S315001F1260D484FFFF080200F00463644601F222469D +S315001F12701DFA03FC020022461DFA34F204F8DC8430 +S315001F128034FA14F20FB50FB4CC8494800460006551 +S315001F129029F20102948429FA006415FA0600C43A59 +S315001F12A007002744FDB4404748E2F860D478FFFFA3 +S315001F12B02844042A0B003244042A080037F3FFFF90 +S315001F12C0FFFF022A03008A604378FFFF04260500FA +S315001F12D0683A0300324400270300F8602978FFFFAD +S315001F12E00A643ADBF8602978FFFF01260E0029F011 +S315001F12F001656440A43A0465274434873EF3B4FF6E +S315001F1300605B4DE288602F78FFFFB5FF016003E841 +S315001F1310116003E8BCFF47FFB7FFB4FF84602D7D54 +S315001F13200C60006B88604678FFFF0E643ADB006036 +S315001F1330106646423C462BF22CF060432DF22246A5 +S315001F13402BFC2CF82DFA3C462EF22FF0604330F280 +S315001F135022462EFC2FF830FA106000653C4629F213 +S315001F136013F02246A484B4BC29FA404880F164478E +S315001F1370FFB46045D0807061010664440A3670640C +S315001F138014363864323617643736156450360E6491 +S315001F13906E360B64404EA0630A6465400A3603002E +S315001F13A038611464EB83404543443C4602605E65E6 +S315001F13B029F22AF26040042B04002E45D485C584E9 +S315001F13C005001FF0C584C0842E45C48422462AFA10 +S315001F13D000644043FC60584F5178FFFF274402BC0E +S315001F13E040473EF3B4FF605B4DE288602F78FFFFF6 +S315001F13F00F643ADB006010664642C46429FA214630 +S315001F14002EF22FF0604330F222462BFC2CF82DFAD9 +S315001F14102146706320F2CA6540450A367064143649 +S315001F1420386432361764373A0300047F4045156423 +S315001F143050360E646E3A0300847F40450B64404469 +S315001F14402AF2C485D4830061414322462AFCFC60EC +S315001F1450584F5178FFFFB5FF016003E8116003E89D +S315001F1460BCFF47FFB7FFB4FF84602D7D0C60006B88 +S315001F14702744012A0500FEB4404788604678FFFFCF +S315001F1480F8601C78FFFF10643ADB00601066464266 +S315001F1490FC60584F5178FFFFF8602978FFFFBCF1B9 +S315001F14A023608064A0D3FFFFDC84DC80D08004032C +S315001F14B0A2DB0824C6FE04008AFF2060007588FF91 +S315001F14C02A643ADB4AF30463CC844AFB0E024AFDC4 +S315001F14D01F603862A2D5006366450100040309F246 +S315001F14E00FFCAC86FB006546455E434687E1A1FFC0 +S315001F14F06C40020029643ADB0864404C19FF87E1FF +S315001F1500A1FF6C40130023609264A0D3FFFFDC840D +S315001F1510FFFF0828A2DBF0000864404C19FF216476 +S315001F15203ADB04000864404C6C4019FF3274406378 +S315001F15306840802BFD1F016801110900A76A2264FC +S315001F15403ADB01605E63011102006C40FC1F6C40B8 +S315001F1550B5FF016003E8116003E86C40BCFF6C40F7 +S315001F1560B7FFB4FF84602D7D0C60006B030AF86023 +S315001F15702978FFFF016457FB274406220600F9B4AA +S315001F15804047026436FBC0FE48E227643ADBF3E1BC +S315001F1590A1FFFFFFD13F314008260C003FF32B452B +S315001F15A0D480FFFF02286544605099FF304420BC59 +S315001F15B0405198FF3BF17444C0943240022A1100F7 +S315001F15C02844A43604000CB4FFFF04360A00264440 +S315001F15D0FDB404BC4046012A3700284740BF404897 +S315001F15E0330024643ADB48E2274406220500F9B497 +S315001F15F04047026436FBC0FE2640102A250025F20E +S315001F1600FFFF6047FFB4C0A0FFFF1E0EBCF12360A3 +S315001F16107E64A0D3FFFFDC84DC80D0800403A2DBC2 +S315001F16200824C6FE04008AFF2060007588FF0C0090 +S315001F1630A1FF3BF126446454CDE284BC2D400C220D +S315001F1640FDB4404623643ADB86609978FFFF046445 +S315001F165040D35AD340425AD340434044E384E084A4 +S315001F1660E084E084404524A4C084404C39F25AD219 +S315001F1670404040410960B46500610860F47C254420 +S315001F1680C09CE9800064F084F084C083BDD3245CD1 +S315001F1690909C6447007FE08444D16444007FE084CB +S315001F16A044D16447909C20444080DB83BDD3205C9B +S315001F16B0909C6447007FE08444D16444007FE084AB +S315001F16C044D16447909C21444081DB83BDD3215C78 +S315001F16D0909C6447007FE08444D16444007FE0848B +S315001F16E044D16447909C22444082DB83BDD3225C55 +S315001F16F0909C6447007FE08444D16444007FE0846B +S315001F170044D16447909C23444083F2A3BDD3235CFA +S315001F1710909C6447007FE08444D16444007FE0844A +S315001F172044D16447909C2444C09C4184DD81082A8F +S315001F1730A4002C422044A2DB21445ADB22445ADB5C +S315001F174023445ADB24445ADB2E58FFFF07F0E38459 +S315001F1750E084E084E08424A440D35AD1404044412D +S315001F17605AD35AD140425AD144431AF044441BF229 +S315001F1770FFFF645F245C4085E383E383E383E383A6 +S315001F17800860F47CC383434C0960B465BDD3255CF4 +S315001F1790909C6447007FE08444D16444007FE084CA +S315001F17A044D16447909C20444080BDD3205C909CCC +S315001F17B06447007FE08444D16444007FE08444D1C1 +S315001F17C06447909C21444081BDD3215C909C644713 +S315001F17D0007FE08444D16444007FE08444D16447A1 +S315001F17E0909C22444082BDD3225C909C6447007F1C +S315001F17F0E08444D16444007FE08444D16447909CD4 +S315001F180023444083BDD3235C909C6447007FE084C0 +S315001F181044D16444007FE08444D16447909C2444AF +S315001F18204084BDD3245C909C6447007FE08444D1F0 +S315001F18306444007FE08444D16447909C25444085DE +S315001F1840056000611AF0A1D3FFFF645FA1DB644747 +S315001F185059D3605C645FA1DB1BF059D3FFFF645F44 +S315001F1860A1DBD981BDD3255C9084E880F884205CF8 +S315001F187059D34080205FA1DB204759D3605C645F4A +S315001F1880A1DBBDD3205C9084E880F884215C59D30A +S315001F18904081215FA1DB214759D3605C645FA1DBD7 +S315001F18A02144E880F884225C59D34082225FA1DB61 +S315001F18B0224759D3605C645FA1DB2244E880F88429 +S315001F18C0235C59D34083235FA1DB234759D3605C35 +S315001F18D0645FA1DB2344E880F884245C59D34084E9 +S315001F18E0245FA1DB244759D3605C645FA1DB2444DA +S315001F18F0E880F884255C59D34085255FA1DB254701 +S315001F190059D3605C645FA1DB056006612CD3255C3F +S315001F1910A1D39081E981615FA2DB2E58FFFF096089 +S315001F1920347CDAF35AD340485AD34049404AE384B9 +S315001F1930E084E084E084404BC084404D09603E61F2 +S315001F19402B4545D35AD3404740460960B4650061CD +S315001F19500860F47C2B44C09CE9800064F084F0840A +S315001F1960C083BDD32A5C909C6447007FE08444D12A +S315001F19706444007FE08444D16447909C264440869B +S315001F1980DB83BDD3265C909C6447007FE08444D1F3 +S315001F19906444007FE08444D16447909C2744408779 +S315001F19A0DB83BDD3275C909C6447007FE08444D1D2 +S315001F19B06444007FE08444D16447909C2844408857 +S315001F19C0DB83BDD3285C909C6447007FE08444D1B1 +S315001F19D06444007FE08444D16447909C2944408935 +S315001F19E0F2A3BDD3295C909C6447007FE08444D159 +S315001F19F06444007FE08444D16447909C2A44C09C81 +S315001F1A00418ADD81082AA4002D422644A2DB2744F1 +S315001F1A105ADB28445ADB29445ADB2A445ADB2F58FF +S315001F1A20FFFF0960347C09607461E384E084E0840D +S315001F1A30E084604340D35AD1404644475AD35AD1D3 +S315001F1A4040485AD1444906A2A2D3444A408B605CFF +S315001F1A506447FFB4605F20BC802680AC6047A1DB73 +S315001F1A60644459DB0860F47CC3830960B465BDD345 +S315001F1A702B5C909C404D6447007FE08444D16444B6 +S315001F1A80007FE08444D16447909C26444086BDD3A2 +S315001F1A90265C909C6447007FE08444D16444007FA9 +S315001F1AA0E08444D16447909C27444087BDD3275C7C +S315001F1AB0909C6447007FE08444D16444007FE084A7 +S315001F1AC044D16447909C28444088BDD3285C909C91 +S315001F1AD06447007FE08444D16444007FE08444D19E +S315001F1AE06447909C29444089BDD3295C909C6447D8 +S315001F1AF0007FE08444D16444007FE08444D164477E +S315001F1B00909C2A44408ABDD32A5C909C6447007FE0 +S315001F1B10E08444D16444007FE08444D16447909CB0 +S315001F1B202B44408BBDD32B5C9084E880F884265CC5 +S315001F1B30C08459DBBDD3605C9084E880F884275C41 +S315001F1B40C08459DBE880F884285CC08459DBE880B0 +S315001F1B50F884295CC08459DBE880F8842A5CC08439 +S315001F1B6059DBE880F8842B5CC08459DB2D5C90849C +S315001F1B70F4A1A1D1E884645F6047A1DB2F58FFFF62 +S315001F1B8008E1A1FFFFFF43FF0864404C19FF27F33D +S315001F1B9046FF47FF07375D00053B0500FF0A00604C +S315001F1BA040E1A1FFFFFF28F546FF29F338F000BCEF +S315001F1BB0464201020164605B4DE2B5FF6C4002E1E3 +S315001F1BC0A1FF6443F360A06501E13F44003A674CFF +S315001F1BD00160006B00F4674CBBFF01F2FFFF604121 +S315001F1BE00462E2D2A1FF604CDA82D480C981F90275 +S315001F1BF00864040000F401F004626441E2D0A1FF0E +S315001F1C00DA82C884C9810202644E0100644CF61C44 +S315001F1C10F1035AD2031EA1FFFFFF604D3F4000365E +S315001F1C200A00A1FF874D674CA1FFFFFFFFFFFFFFC4 +S315001F1C30FFFFBCFF0500147B4DE202E1A1FFBCFFC5 +S315001F1C4000E1664422460CFA63440BFAD5FEA1FF57 +S315001F1C50FFFF006440466041B5FFB7FFB4FF28F59C +S315001F1C60FFFF38F023F24443404400F4F360A065BD +S315001F1C70DA825AD2D981D480FFFFFB026145244400 +S315001F1C80D484E084E084E084FDA584600064C49D60 +S315001F1C900D60006B2444C083BBFF28F501E100F4EF +S315001F1CA001F2FFFF60410462A1FFFFFF01101D004B +S315001F1CB0264401260E002444C884404403036C4571 +S315001F1CC01408F2000315016405FA17006C450D0888 +S315001F1CD0EB002344C884404303036C450608E40015 +S315001F1CE00064011501646C4505FBE2D2DA82C981E5 +S315001F1CF0604CDA1CD403BCFFD70000E1D5FEA1FF60 +S315001F1D00FFFF08E1A1FF3F44003A674C43FF99FFDD +S315001F1D103C4740BC007F405C98FF01E10160696B56 +S315001F1D20A560C464604CBBFFA1FFFFFF604CA1FF11 +S315001F1D30FFFF604CFC0029F128F3644100656040F9 +S315001F1D4001261065006360400226406349FD49F184 +S315001F1D5002E1614399FF00646541635B4DE2908434 +S315001F1D60405C9581415EA1FFFFFFF700C360506590 +S315001F1D7002E1655B4DE2A1FFFFFF0260EE6383F3A5 +S315001F1D80A7FDA8FB0264A9FBDFFE19FFF200BF60D7 +S315001F1D901378FFFF0B60F262A2D180600064B084EB +S315001F1DA0A2DBCFFE1D003140012A1A000B60F46230 +S315001F1DB0A2D100600464B084A2DBCFFE0C6018625F +S315001F1DC0A2D100608064B084A2DBCFFE09000800A8 +S315001F1DD0A9FEE905ABFE0705A8FED905AAFEDA0589 +S315001F1DE0A1FFFFFFD53F1F603862A2D3FFFF00A8E8 +S315001F1DF0604603028E60F078FFFF2645D4800FF001 +S315001F1E002903644470B0702A140023609E64A0D313 +S315001F1E10FFFFDC84FFFF0828A2DBA2FFB4F322F03A +S315001F1E20CC84FEA0B4FB0107D1FEA3FF9460BB7850 +S315001F1E30FFFF644002261A00664509F40FF0664448 +S315001F1E4000A86444030300A86546DF0265460064D4 +S315001F1E504046C6008067B0840FFA23609C64A0D3F7 +S315001F1E60FFFFDC84FFFF0828A2DBC40066440FF0D7 +S315001F1E704067B0840FFAA2FFB4F34646CC84FEA097 +S315001F1E80B4FB0107D1FEA3FF0FF0FFFF64448026BA +S315001F1E902200BCF123607E64A0D3FFFFDC84DC80BC +S315001F1EA0D0800403A2DB0824C6FE04008AFF20603C +S315001F1EB0007588FF3244012A03000760016404008D +S315001F1EC0022A06000060016422FA9460CB78FFFFA5 +S315001F1ED09460BB78FFFF08263F0029F25E636040CF +S315001F1EE0022B6463BED287F1A3D2D08086F118027B +S315001F1EF0BFD2D08085F11402D080FFFF1102BCF142 +S315001F1F0023608A64A0D3FFFFDC84DC80D0800403B7 +S315001F1F10A2DB0824C6FE04008AFF2060007588FF26 +S315001F1F203244012A0300076002640400022A0600E5 +S315001F1F300060026422FA9460CB78FFFF29F2FFFF4C +S315001F1F406040B03A06000060026422FA906027786B +S315001F1F50FFFF9460BB78FFFF3244012A4A002460CA +S315001F1F60D063BFD30065B481DB833D03BFD3A3D347 +S315001F1F704048BED3404A2DF0404CD0802CF008027A +S315001F1F802A44D0802BF004022844D080FFFF2B0365 +S315001F1F9030F02C44D0802FF008022A44D0802EF037 +S315001F1FA004022844D080FFFF1E0333F02C44D08048 +S315001F1FB032F008022A44D08031F004022844D0802F +S315001F1FC0FFFF110337F02C44D08036F008022A4455 +S315001F1FD0D08035F004022844D080FFFF0403FAA105 +S315001F1FE006A3B703C3000760006422FA9460CB7888 +S315001F1FF0FFFF29F20FF06045A43608000CB4043623 +S315001F200002000C3A06009460BB78FFFF9160F778D8 +S315001F2010FFFF0FF06540402B1A00324008261700BD +S315001F20202BF2FFFF604001261100BCF12360846480 +S315001F2030A0D3FFFFDC84DC80D0800403A2DB08244E +S315001F2040C6FE04008AFF2060007588FF10006440EA +S315001F2050602603009160C978FFFF29F23240042AE7 +S315001F206009006040403A030091602678FFFF9460A4 +S315001F2070BB78FFFF5C636040403A0C00F5F3FFFF3F +S315001F208007B4033A010003009060CB78FFFF90600E +S315001F2090CE78FFFF022B6263BDD285F1BDD2D08001 +S315001F20A086F10702D080BDD287F10302D080FFFFE1 +S315001F20B07503F5F329F207B0033A4D0000F480A823 +S315001F20C002F2070207F2FFFF02B0FFFF440308F206 +S315001F20D0FFFF6047003A3F00604100361500DA8572 +S315001F20E02560F864A0D1FFFFD180FFFF3402256071 +S315001F20F0FA6350FE6140FE220F00BDD3A5D0DA85DC +S315001F2100D080C981F7012700264629F200F4006016 +S315001F211040A8FFFF20021C00614000360900A3D320 +S315001F2120A5D0007F60456444007FD480FFFF130263 +S315001F21300B60F061A1D3FFFF604001360900016506 +S315001F2140BC60584E4378FFFF0B60F0610164A1DB52 +S315001F2150016507F20100006526466540012A1B003E +S315001F21601A6090610264A1DB1A6098610064A1DBAA +S315001F2170B360584EB878FFFF18608664A0D3FFFF80 +S315001F21806040802708000C600C62A2D100600464C6 +S315001F2190B084A2DBCFFE9460BB78FFFFF5F329F274 +S315001F21A007B0033A4D0000F480A802F2070207F2B7 +S315001F21B0FFFF02B0FFFF440308F2FFFF6047003A2C +S315001F21C03F00604100361500DA852560F864A0D10E +S315001F21D0FFFFD180FFFF34022560FA6350FE614086 +S315001F21E0FE220F00BDD3A5D0DA85D080C981F701A5 +S315001F21F02700264629F200F4006040A8FFFF2002B0 +S315001F22001C00614000360900A3D3A5D0007F60459E +S315001F22106444007FD480FFFF13020B60F061A1D3DB +S315001F2220FFFF6040013609000165BC60584E4378C8 +S315001F2230FFFF0B60F0610164A1DB016507F201007E +S315001F224000652646B460584FC178FFFFBCF1236076 +S315001F22507864A0D3FFFFDC84DC80D0800403A2DB7C +S315001F22600824C6FE04008AFF2060007588FF26F238 +S315001F2270FFFF6040013B1200BCF123608664A0D3C0 +S315001F2280FFFFDC84DC80D0800403A2DB0824C6FEAB +S315001F229004008AFF2060007588FF1300023B1100AF +S315001F22A0BCF123608864A0D3FFFFDC84DC80D08070 +S315001F22B00403A2DB0824C6FE04008AFF2060007503 +S315001F22C088FF29F2FFFF604040366A00082A2B006C +S315001F22D0BCF123607664A0D3FFFFDC84DC80D08052 +S315001F22E00403A2DB0824C6FE04008AFF20600075D3 +S315001F22F088FF1FF2FFFF6045BCF123607C64A0D3FB +S315001F2300FFFFD880C4840B030705DC80D08004033D +S315001F2310A2DB0904C6FE07000064B884A2DB8AFF9D +S315001F23202060007588FF0FF2FFFF604040262800DF +S315001F2330324402262500102B29002460D063BFD308 +S315001F23402BF000A860410D0350FEBDD32CF0D080AA +S315001F2350BDD32DF0D080BDD32BF0D080FAA11001B4 +S315001F2360F30250FE60600164D0802CF01D64D080A3 +S315001F23702DF00164D080FFFF03019460BB78FFFF3F +S315001F23803240402A030095609478FFFF9460AA7834 +S315001F2390FFFF32404026F70029F0FFFF6440082A5E +S315001F23A02600F5F3FFFF07B403A8FFFF0303324020 +S315001F23B0022A1D000367A08400376263604002374C +S315001F23C05C63604001375663604003370D00BDD222 +S315001F23D085F1BDD2D08086F10702D080BDD287F1AC +S315001F23E00302D080FFFF03039460BB78FFFFB46036 +S315001F23F0584FC178FFFF2040102B03009460AA7826 +S315001F2400FFFFAEF330F064A406A460436445206169 +S315001F24102FF0BED3A3D3D480D0800D02BFD32EF00E +S315001F24200502D080AEF30202FAA30B002FF0CD8176 +S315001F243064A3EF020300CD8164A3EB02AEF3FFFF9B +S315001F244060434348324002266600F5F3FFFF07B498 +S315001F245003A829F25F02007FC0A043485C02F5F380 +S315001F246029F207B0033A4D0000F480A802F20702D2 +S315001F247007F2FFFF02B0FFFF440308F2FFFF6047AA +S315001F2480003A3F00604100361500DA852560F86482 +S315001F2490A0D1FFFFD180FFFF34022560FA6350FEF3 +S315001F24A06140FE220F00BDD3A5D0DA85D080C98139 +S315001F24B0F7012700264629F200F4006040A8FFFF17 +S315001F24C020021C00614000360900A3D3A5D0007F5F +S315001F24D060456444007FD480FFFF13020B60F061E8 +S315001F24E0A1D3FFFF6040013609000165BC60584E4D +S315001F24F04378FFFF0B60F0610164A1DB016507F202 +S315001F250001000065264628436540012604009460A5 +S315001F2510BB78FFFF6300AEF12843D380FFFF5E0247 +S315001F25209460584FFC78FFFF3240022A0500634132 +S315001F25301465026445DB52003240082A05006341D8 +S315001F254014658060026445DBF0F36345106145D175 +S315001F25506040013606000236040004360200053AC2 +S315001F25600200006401000164A1DB7DF37EF1FFFF21 +S315001F2570A084654302027DF3FFFF60410B60D065B7 +S315001F2580F0F3FFFFE08444D36145A480FFFF0402FC +S315001F2590E884A480FFFFFC03A4847FFB6345604798 +S315001F25A0106145D1FFFF9084A1DB604760458064C1 +S315001F25B0E884A480FFFFFC03A4846345186145D10A +S315001F25C0A1DB0061E884FFFF0205DD81FB00E181DD +S315001F25D00B60C46545D31261634545DB07FC02FEEC +S315001F25E021F016602E62C064C084A2D1E884E884FC +S315001F25F0E884E884E884C084A2DB29F263450CB42E +S315001F2600083A0900F5F3146307B4FDA047D3030383 +S315001F26106040022A0D0029F234F00A636040A43696 +S315001F26200A00082B0B0047D3FFFFD080FFFF0602CF +S315001F26309460BB78FFFF9460AA78FFFF0C6347D3B3 +S315001F26404548424A444C0F26170000BC40450A0322 +S315001F265000642ADBA2FFFF60584E1078FFFFA3FF1E +S315001F26602845264629F02C446440042705000A63A2 +S315001F267047DB9360FD78FFFF38F202FAA2FF16F2DE +S315001F268016F001B4C09CB8F329F2DC83B8FD06F43A +S315001F269001F826466040402B180064440065FFB4CD +S315001F26A0FCA406F0030364460C0D0265264600F2E1 +S315001F26B0FFFFD080FFFF02036046F90001F2FFFF14 +S315001F26C0D48401FA6644264606FA006306F400F22D +S315001F26D000FC4045A2FFFF60584E1078FFFFA3FF86 +S315001F26E0284526460A632C440F260E0047DB664400 +S315001F26F02ADB1F604E620064A2DB26445ADB02649B +S315001F27005ADBFFFF2BFF600047D36045DC84D48074 +S315001F2710A2DB5F022AD329F000BC00F20102590096 +S315001F2720444C38F060432AD50960006538F22646C6 +S315001F2730C084D48060454D07006400FA1FF206F27C +S315001F274060412AD51FF006F0C18106FA05FA6144D9 +S315001F27501FFA654438FA644600FC06451F604E6240 +S315001F27600064A2DB25445ADB02645ADBFFFF2BFF02 +S315001F277000F2A2FF00BE01F00B037867A080F86786 +S315001F27800703C08401FA2546006400FA254405FAAA +S315001F2790FF60584E1078FFFFD1FEA3FF2C4404277D +S315001F27A013002AD500642ADB464638F22C436047BD +S315001F27B03FFA29FC06F4006400FA01F08060006409 +S315001F27C0B08401FA26461900006646468E60F378E5 +S315001F27D0FFFF2AD1006333852ADD0B034AD30F651A +S315001F27E0A485D484A2DBA2FFFF60584E1078FFFF9A +S315001F27F0A3FF26469460BB78FFFF29F231F06040A5 +S315001F2800403A03009460AA78FFFF082A5C00012B58 +S315001F28102F006440012A2C00BCF123607664A0D3EC +S315001F2820FFFFDC84DC80D0800403A2DB0824C6FE05 +S315001F283004008AFF2060007588FF1FF2FFFF6045B6 +S315001F2840BCF123607C64A0D3FFFFD880C4840B0334 +S315001F28500705DC80D0800403A2DB0904C6FE07003F +S315001F28600064B884A2DB8AFF2060007588FF2B00F6 +S315001F2870BCF123607464A0D3FFFFDC84DC80D080AE +S315001F28800403A2DB0824C6FE04008AFF206000752D +S315001F289088FF1FF2FFFF6045BCF123607A64A0D357 +S315001F28A0FFFFD880C4840B030705DC80D080040398 +S315001F28B0A2DB0904C6FE07000064B884A2DB8AFFF8 +S315001F28C02060007588FF07F00A6343D3FFFF0FB42C +S315001F28D0DC85BCF123607864A0D3FFFFD880C48455 +S315001F28E00B030705DC80D0800403A2DB0904C6FEA8 +S315001F28F007000064B884A2DB8AFF2060007588FF8A +S315001F290026F2FFFF6040013B1200BCF12360866484 +S315001F2910A0D3FFFFDC84DC80D0800403A2DB082465 +S315001F2920C6FE04008AFF2060007588FF1300023B65 +S315001F29301100BCF123608864A0D3FFFFDC84DC8018 +S315001F2940D0800403A2DB0824C6FE04008AFF206091 +S315001F2950007588FF0FF02067B0840FFA96606978BC +S315001F2960FFFF664400A80FF003031067B0840FFA39 +S315001F29708E60F378FFFF0FF00867B0840FFA1F60B1 +S315001F29804E64404BD660584D5878FFFF006646464A +S315001F29908E60F378FFFF0FF00467B0840FFA1F6095 +S315001F29A04E621F603264A2DB66445ADB02645ADB46 +S315001F29B0FFFF2BFFD2FE006646468E60F378FFFFB1 +S315001F29C029F25663604701276263BDD039F8BDD02F +S315001F29D0FFFF3AF8BDD03BF802B05C6304036263A5 +S315001F29E003B0023A6A63BDD03CF8BDD0FFFF3DF885 +S315001F29F0BDD03EF82F58FFFFAEF3FFFFA0D3FFFF5A +S315001F2A0000A030F02F0316603C656447007FAEF1CF +S315001F2A10E08444D3FFFF00A864430503A0D3FFFF50 +S315001F2A2000A8FFFFFB026241A3D3A1DBFFFFA0D1DA +S315001F2A30A3D90063A0DD0EA56143A5DD6043186021 +S315001F2A403E6118608065A1D3FFFFD480FFFF070397 +S315001F2A50A0DDDA84A1DB49D3FFFFDC84A1DB95600F +S315001F2A608378FFFF00602065B9F3FFFFFFB4D480B2 +S315001F2A70FFFF0204D484FB00DC84E084E08460450D +S315001F2A80E084E084E084C485E084AEF3C485C48317 +S315001F2A90AEF3FFFF64A5D780FFFFE40363440EA5D3 +S315001F2AA0A5D1A3D3A4DB00A80EA40828A0D9AEF3F2 +S315001F2AB06345A0D36041D48000A80107FA02A3DBB7 +S315001F2AC01464A1DD44D3FFFF007EA2DB30F0166045 +S315001F2AD03C656447007FAEF1E08444D3FFFF00A846 +S315001F2AE064430503A0D3FFFF00A8FFFFFB0262415B +S315001F2AF0A3D3A1DBFFFFA0D1A3D90063A0DD0EA541 +S315001F2B006143A5DD60436345146347D30463007EB9 +S315001F2B10A2DB2EF02FF2FFFF47D930F05BDBFFFF62 +S315001F2B205BD965432F58FFFF29F285F160400826C0 +S315001F2B301900803A140031F232F2D08086F10F026A +S315001F2B40D08033F287F10B02D080FFFF0802B460FA +S315001F2B50584FED78FFFFB260584F4278FFFF9660DF +S315001F2B605378FFFF00F4AA60AA6502F203F0D4802F +S315001F2B7003641202D0801D6060650E0204F2FFFF1F +S315001F2B80D48001600065080205F2FFFFD480264647 +S315001F2B90030296605378FFFF0160B465A5D15AD131 +S315001F2BA044485AD1444A264638F200F401F260439B +S315001F2BB0444CFFB4D881DB836865D780FFFF730E53 +S315001F2BC00000584F79009C800165020200650200D3 +S315001F2BD0FF3BF700584F70009C804542ED02584F4F +S315001F2BE06B009C80FFFFE802584F66009C80FFFF2A +S315001F2BF0030200654542F800FF3A29006047FFB50A +S315001F2C002844FFB49480FFFFD702604528472A5FF8 +S315001F2C1040482A472C5F404A2C47655F404C10644A +S315001F2C20404228450500584F4700948028452602F4 +S315001F2C30584F420094802A452102584F3D009480E8 +S315001F2C40FFFF1C0222444C822C453103EC00106509 +S315001F2C504542284594802A452102584F2D009480CD +S315001F2C602C451C02584F28009480FFFF1702224450 +S315001F2C704C8228451C03584F1F00EC00404B284729 +S315001F2C8040482A47404A2C4760452A5E404C2A4402 +S315001F2C90285E404A2844655E40482B446865D780B5 +S315001F2CA0FFFF010E900026469460BB78FFFFBAFF18 +S315001F2CB026469460BB78FFFFC981CB83071C011D85 +S315001F2CC0F20000F401F2FFFFFFB4D8815AD22F5849 +S315001F2CD0FFFF29F2FFFF60400826030097604D782B +S315001F2CE0FFFF38F03240102A20002BF0644160406D +S315001F2CF040271B00CD81DD81180317036440012681 +S315001F2D00140001611300BCF123608C64A0D3FFFF84 +S315001F2D10DC84DC80D0800403A2DB0824C6FE04000A +S315001F2D208AFF2060007588FF230000616040183607 +S315001F2D301F009460584FE078FFFF0FF0DAF16444EC +S315001F2D4060221900F5F3FFFF07B4FDA029F2030265 +S315001F2D5008B0FFFF100231F232F2D080DBF10B0216 +S315001F2D60D08033F20802DCF1FFFFD0800FF00302A0 +S315001F2D709760BF78FFFF00F4AA60AA6502F203F00E +S315001F2D80D48003644D02D080006404F04902644578 +S315001F2D90D480F87F080205F02646644522F0206796 +S315001F2DA0B084A2DA0B00D4801D606064160205F0A1 +S315001F2DB02646644522F04067B084A2DA6544883A05 +S315001F2DC0070077370800783706008E37040028007B +S315001F2DD0813A2600803700612300D4800160006499 +S315001F2DE005F01E02D08006F01B02264664477FB4FC +S315001F2DF0FDA009031507324002264A0022F060672C +S315001F2E00B084A2DA45000FF2324002264100016467 +S315001F2E1040FBBE60584F4178FFFF9760C978FFFFA0 +S315001F2E2026466140012A1400BCF123608C64A0D39E +S315001F2E30FFFFDC84DC80D0800403A2DB0824C6FEEF +S315001F2E4004008AFF2060007588FF9760BF78FFFF28 +S315001F2E500FF285F129F26040202A11005C63604061 +S315001F2E60022B6263BDD2BDD2D08086F10E02D08006 +S315001F2E70A3D287F10A02D080FFFF0702090029F2B9 +S315001F2E80FFFFFFFF4836010003009760BF78FFFF73 +S315001F2E90016440FB97609778FFFF264629F2FFFFE4 +S315001F2EA0FFFF0C26F200B036150010361300303621 +S315001F2EB01100C0360200A03A140085F131F232F239 +S315001F2EC0D08086F15C02D08033F287F15802D08021 +S315001F2ED0FFFF5502A960584FD178FFFF9760BB7857 +S315001F2EE0FFFF503A0500C260584F5978FFFF430055 +S315001F2EF0403A0500BB60584F7878FFFF3C00803A88 +S315001F2F00150085F131F232F2D08086F13802D08079 +S315001F2F1033F287F13402D080FFFF3102B460584F7D +S315001F2F20ED78FFFFB260584F4278FFFF280029F265 +S315001F2F301BF06040402B1200C06000646440202BD1 +S315001F2F400D00A084E884E884E88422F210BDB49CB6 +S315001F2F5038F222F8F8A438FA60473FFA1F604E622B +S315001F2F601F603264A2DB26445ADB02645ADBFFFF72 +S315001F2F702BFFD2FE0C00664400A8FFFF0A0326465D +S315001F2F801F604E64404BD660584D5878FFFF006651 +S315001F2F9046469460B178FFFF0064404000606C6154 +S315001F2FA0FE60584D4D78FFFF664466FB00606C61FE +S315001F2FB0FE60584D4D78FFFF664465FB0C60366218 +S315001F2FC099602564A2DB2F58FFFF00643B425ADB42 +S315001F2FD00164F5FBBEF3FFFFFEB4BEFBFFFF0C60F3 +S315001F2FE012620064A2DB006014630160B261246098 +S315001F2FF02A6458D159D9FD1F006088632360A061D8 +S315001F30002460426458D159D9FD1F106000653244AF +S315001F30109485455224602A62A2D110676440012616 +S315001F30203492FF60E7653241A5812560DC62A2D13B +S315001F303024601A62A2D36440012A12000865604008 +S315001F3040013605000236030003360100090024601D +S315001F30501E62A2D3B58110656040012A0100B581A9 +S315001F3060415224601A64A0D3006560400136016591 +S315001F30706040023602656040033602654553246090 +S315001F30801C632460BE62A2D3A3DB0C606463BFF320 +S315001F30900E6160456544E8850564CD81022800649C +S315001F30A0BDDBF8022560F6612360A264206358D158 +S315001F30B059D9FD1FC2F184F900601A6301600861C6 +S315001F30C0006459DBFE1F4040E0F383FB0C60126275 +S315001F30D00064A2DBDEFE0B040C6014624060006419 +S315001F30E0A2DB986066645ADBCFFE2F58FFFF83F181 +S315001F30F01F606E62A2D908644ADBFFFF2DFF0C60BA +S315001F3100146220600064A2DB986092645ADBCFFED3 +S315001F31100960EEF32A65D480076401070764D5FBAF +S315001F31202F58FFFF0C6012620064A2DBBEFE0B600D +S315001F3130F262A2D140600064B084A2DBCFFEC5FE5E +S315001F314001643B425ADBE4F3FFFF6040053A03008C +S315001F3150C360E6611100043A0300C360DA610C0024 +S315001F3160033A0300C360CE610700023A0300C3603F +S315001F3170C2610200C360B6613E6000660160C8643A +S315001F31800A6359D058D9FD1F0160CE61E3F300666B +S315001F319000A804650103A1DB18608A6355D3FFFFEE +S315001F31A0207FBDDB59D3FFFF217FBDDB59D3FFFF37 +S315001F31B0227FA3DB0C6012620064A2DBDEFE0B041F +S315001F31C00C60146240600064A2DB9860DA645ADB0C +S315001F31D0CFFE2F58FFFF1F606E6218608864A2DB48 +S315001F31E020644ADBFFFF2DFF0C6014622060006421 +S315001F31F0A2DB9860FF645ADBCFFE2F58FFFFBEFE8F +S315001F32000B60F262A2D140600064B084A2DBCFFEE5 +S315001F32102040202A08000C601E62A2D100600464B0 +S315001F3220B084A2DBCFFE0C600C62A2D100600264E8 +S315001F3230B084A2DBCFFE0C6012620064A2DB5ADBF5 +S315001F32400E643B425ADB2F58FFFF0F643B425ADB8B +S315001F32500C6012620064A2DB02648FFBFFFFC1FEDB +S315001F32600C602A62A2D10060DF64B084A2DBCFFEAD +S315001F32701F607C630164BDDBFFFF04FF0C601262ED +S315001F3280A2D100600864B084A2DBCFFE0C6014627A +S315001F329000600864A2DB996051645ADBCFFE2F5889 +S315001F32A0FFFF08643B425ADB0C601262A2D17F60AB +S315001F32B0FF64A084A2DB8FF30065D480FFFF0B039E +S315001F32C00C60146280600064A2DB996051645ADB53 +S315001F32D0CFFE2F58FFFFDEFE0E040C601462206027 +S315001F32E00064A2DB99607B645ADBCFFE09643B4214 +S315001F32F05ADB2F58FFFF0A643B425ADB1F606E6280 +S315001F330006644ADBFFFF2DFF0C6012620064A2DB1E +S315001F33105ADBBEFEDAFE1F600E619960584ECD78ED +S315001F3320FFFF1E60FC619960584ECD78FFFF1F603E +S315001F333002619960584ECD78FFFF1F602661996024 +S315001F3340584ECD78FFFF1F6032619960584ECD7879 +S315001F3350FFFF1F6020619960584ECD78FFFF1F60E9 +S315001F336008619960584ECD78FFFFA2FF09603C6542 +S315001F33701F602664B5F1A0D36443AC8602F2050331 +S315001F3380D48009F2FA02DF83F800B5FDC5FEA3FF5C +S315001F33900E643B425ADB2F58FFFFA1D30E5719006D +S315001F33A00EF2444C80B010B00B031F604E620064D7 +S315001F33B0A2DB66445ADB02645ADBFFFF2BFF0800C1 +S315001F33C007021F604E64404BD660584D5878FFFF6A +S315001F33D02C44AC8609F0E4023758FFFF14606A6379 +S315001F33E00064A3DB06A30C605664BDDBBDDB06646D +S315001F33F0A3DB0C6054629E601A64A2DB0C6034620D +S315001F34009D60EA64A2DB0C600E6200600264A2DBB0 +S315001F34109A6062645ADBCFFE2F58FFFFC360AA6112 +S315001F34203E6000660160C8640A6359D058D9FD1F03 +S315001F34300160CE61E3F3006600A804650103A1DB0A +S315001F344018608A6355D3FFFF207FBDDB59D3FFFF6B +S315001F3450217FBDDB59D3FFFF227FA3DB0C600C62EC +S315001F34600064A2DBDEFE0B040C600E62406000648B +S315001F3470A2DB9A602E645ADBCFFE2F58FFFF1F6018 +S315001F34806E6218608864A2DB20644ADBFFFF2DFF93 +S315001F34900C600E6220600064A2DB9A6053645ADBE4 +S315001F34A0CFFE2F58FFFF0C600C620064A2DBBEFE2E +S315001F34B00B60F262A2D140600064B084A2DBCFFE33 +S315001F34C02E58FFFF10643B425ADB0C600C620064EF +S315001F34D0A2DBBAFE2360A262A2D3FFFF03A802A843 +S315001F34E0040306029D60BF78FFFF9D600D78FFFFF6 +S315001F34F00360E86314603C64A0DD11643B425ADB41 +S315001F35000C600C620064A2DBBAFE0264F5FBBEF31C +S315001F3510FFFF01BCBEFBFFFF4460446485FB86FBC7 +S315001F352087FB2040042B19009BFE0904BBFE0B6082 +S315001F3530F262A2D180600064B084A2DBCFFE126467 +S315001F35403B425ADB0C600E6280600064A2DB9A600D +S315001F355091645ADBCFFE2F58FFFF08600065204499 +S315001F356034800D6459FB256092645CFB13643B42F7 +S315001F35705ADB0B60F061A1D10260006520443480E4 +S315001F35806440012A07000064A1DB0265BC60584E37 +S315001F35904378FFFF9A60584E0E78FFFF0F4EBF60AD +S315001F35A0584F5E78FFFF0E4F0C600E62106000646E +S315001F35B0A2DB9A60DF645ADBCFFE2F58FFFF14642D +S315001F35C03B425ADBFD60FF65204424800B60F2629C +S315001F35D0A2D180600064B084A2DBCFFE0C600C62B7 +S315001F35E00064A2DBDCF3DBF16041724542F333403A +S315001F35F0023A0500007CA0D958D958D9110060FE9F +S315001F3600A0D35AD320FE6444615E948460FE4ADBD5 +S315001F361060475ADB614794847FB45ADBFFFF20FE65 +S315001F362000EB47F300EA334002360F7E99FF405AFC +S315001F363098FF606000EAA16000EAD16000EA8CF1A1 +S315001F364013608263D3802044050310BC40409D60F5 +S315001F36500678FFFF8DF3FFFFD08020441D0310BCAB +S315001F3660404064425AD10663A4D1C38383F9BDD1B6 +S315001F367085F9BDD1FFFF86F9BDD187F904A3BDD159 +S315001F36802560F8646441DD81FEB1A0D90403BDD174 +S315001F3690C98158D9FC022100ECF3E0F300A883FB93 +S315001F36A0530325609261A1D3FFFF00A82560F8632D +S315001F36B002022360A461A1D3BDDBDC84FEB459D111 +S315001F36C0C884BDD9FC02DCF37245DBF3948387FD06 +S315001F36D0948386FD655F026485FB0C600C62006443 +S315001F36E0A2DBDEFE0B040C600E6240600064A2DBF0 +S315001F36F09B606D645ADBCFFE2F58FFFF18643B4259 +S315001F37005ADB83F11F606E62A2D91E644ADBFFFF7C +S315001F37102DFF0C600E6220600064A2DB9B60946428 +S315001F37205ADBCFFE2F58FFFF0C600C620064A2DB32 +S315001F3730BEFE0B60F262A2D140600064B084A2DBC1 +S315001F3740CFFE9B60F778FFFF16643B425ADBFF6094 +S315001F3750EF65204424800264F5FBBEF3FFFF01BC26 +S315001F3760BEFBFFFF9A60584E0E78FFFF17643B4261 +S315001F37705ADB0264F5FBBEF3FFFF01BCBEFBFFFF76 +S315001F3780F760FF65204424800B60F262A2D180603F +S315001F37900064B084A2DBCFFE0C600C620064A2DB67 +S315001F37A0DAFEC1FE14603C62A2D114606E62A2D919 +S315001F37B01F607E6214606A64A2DB02644ADBFFFF3D +S315001F37C004FF0C600E6200600464A2DB9A607D64D5 +S315001F37D05ADBCFFE14603C64A0D3C3F1E083D380D1 +S315001F37E014603C6401046443A0DD2F58FFFF7DF382 +S315001F37F07EFB1A6090620064A2DBFF60DF652044D7 +S315001F38002480C4F114606E62A2D91F607E621460A8 +S315001F38106A64A2DB02644ADBFFFF04FFF760FF65F1 +S315001F38202044248010265E00C2F184F9FFFFE1F1D7 +S315001F38308AF92460C262A2D3FFFF01A8FFFF080214 +S315001F38400160E062A2D3FFFF01A8FFFF010302642C +S315001F385060412560E464A0D12560E663A3D3644577 +S315001F3860CD8180BF0E0380BFBDDB6544C884FFFFCB +S315001F38700B036045CD81A3D30703CD8180BF010311 +S315001F388080BC6047BDDB006564412560E663BDD330 +S315001F3890FFFF80B0FFFF01036045604780B0FFFF59 +S315001F38A001036045C981FFFFF20265447FB4023AF6 +S315001F38B002000A641500043A0200146411000A3A51 +S315001F38C0020032640D000B3A020037640900103AF9 +S315001F38D0020050640500163A02006E64010014646B +S315001F38E080FB28000C600C620064A2DB0C600E6279 +S315001F38F000608464A2DB9C6081645ADBCFFE2F5874 +S315001F3900FFFF0C600C62A2D100608064A0809C84C3 +S315001F39100D03A084A2DB0C600C62A2D1FF607F6145 +S315001F3920A1845AD14ADBA1845ADB0400BBFE9A60EC +S315001F39307D78FFFFAEF33241604508B11461130372 +S315001F394025609062A2D345D1E084E084E084E084C0 +S315001F395080BFB084A1DB64A1A1D1FFFFB084A1DB2E +S315001F3960324410BC40521A6090620164A2DB0F4EB3 +S315001F3970BA60584FAD78FFFF0E4F0C600C62A2D194 +S315001F3980FF60FB64A084A2DB0C600E62006004640F +S315001F3990A2DB9A607D645ADBCFFE1F607E621460D5 +S315001F39A06A64A2DB02644ADBFFFF04FFBBFE2044FE +S315001F39B00427120010260200DBFE16000B60F061C2 +S315001F39C0A1D3FFFF6040013607000164A1DB01653B +S315001F39D0BC60584E4378FFFF0B60F262A2D1806035 +S315001F39E00064B084A2DBCFFE016490FBFF60EF652D +S315001F39F0204424800364F5FBBEF3FFFFFEB4BEFB29 +S315001F3A00FFFF1E643B425ADB2F58FFFF15643B42E4 +S315001F3A105ADBBBFE9E60D678FFFF7DF1AEF37EF9C3 +S315001F3A2064A4F0F36045106145D16040013606007D +S315001F3A300236040004360200053A02000064010043 +S315001F3A400164A1DB7DF37EF1FFFFA08465430202C3 +S315001F3A507DF3FFFF60410B60D065F0F3FFFFE0844D +S315001F3A6044D36145A480FFFF0402E884A480FFFFBE +S315001F3A70FC03A4847FFB63456047106145D1FFFFAC +S315001F3A809084A1DB604760458064E884A480FFFFC3 +S315001F3A90FC03A4846345186145D1A1DB0061E8845A +S315001F3AA0FFFF0205DD81FB00E1810B60C46545D385 +S315001F3AB01261634545DBAEF16464C0851461324013 +S315001F3AC0082A100025609062A2D345D1E084E084C5 +S315001F3AD0E084E08480BFB083A1DD9CA1A1D1FFFF5C +S315001F3AE0B084A1DB1D643B425ADB0B64F5FBBEF3BE +S315001F3AF0FFFFFEB4BEFBFFFF0165BC60584E437857 +S315001F3B00FFFFE0F183F90C600C620064A2DBDEFEAE +S315001F3B100B040C600E6240600064A2DB9D60836430 +S315001F3B205ADBCFFE2F58FFFF83F11F606E62A2D9AB +S315001F3B301E644ADBFFFF2DFF0C600E6220600064CF +S315001F3B40A2DB9D60A7645ADBCFFE2F58FFFF0C60D8 +S315001F3B500C620064A2DBBEFE0B60F262A2D1406063 +S315001F3B600064B084A2DBCFFE016490FBFF60DF65BB +S315001F3B70204424801E643B425ADB2F58FFFF1C64DF +S315001F3B803B425ADB0664F5FBBEF3FFFFFEB4BEFBEA +S315001F3B90FFFFE0F183F90C600C620064A2DB016495 +S315001F3BA090FBFF60DF6520442480AEF178610264DC +S315001F3BB041DB0463EEA10160B86458D159D9FD1FDA +S315001F3BC00165BC60584E4378FFFF1E643B425ADBBB +S315001F3BD02F58FFFF1F643B425ADB00646DFB6EFBD1 +S315001F3BE0AEF1786440D1FF60FC64A084A2DBF5F3DC +S315001F3BF0FFFF04A80B60F0610703A1D1FFFF64401C +S315001F3C00012A0200007CA1D90164F5FBBEF3FFFF68 +S315001F3C10FEB4BEFBFFFF0C600C620064A2DB0C60EF +S315001F3C200E6200600264A2DB9A6062645ADBCFFEFA +S315001F3C302F58FFFF0C600C62A2D100600464B08491 +S315001F3C40A2DBCFFE2F58FFFF24602864A0D300F409 +S315001F3C506040013A3E000A65226118609063A5D054 +S315001F3C60DA856444007FCD81BDDB05036447007F91 +S315001F3C70CD81BDDBF40218609063BDD3BDD301A80F +S315001F3C80E0852702C783BDD3BDD381A80DA8210216 +S315001F3C902002BDD3BDD300A860A81B02BDD3190245 +S315001F3CA01DA8A3D11602E4F90160C86463410A6323 +S315001F3CB059D158D9FD1F59D159D3FFFF6047645EAB +S315001F3CC0EEFB59D124602464A0D92460C664A0D910 +S315001F3CD0230024604064A0D3E4FB6040053A030040 +S315001F3CE0C360E6611100043A0300C360DA610C0089 +S315001F3CF0033A0300C360CE610700023A0300C360A4 +S315001F3D00C2610200C360B6613E6000660160C8649E +S315001F3D100A6359D058D9FD1F0160CE61E3F30066CF +S315001F3D2000A804650103A1DB18608A6355D3FFFF52 +S315001F3D30207FBDDB59D3FFFF217FBDDB59D3FFFF9B +S315001F3D40227FA3DB0C600C620064A2DBDEFE0B0489 +S315001F3D500C600E6240600064A2DB9E60A2645ADBA8 +S315001F3D60CFFE2F58FFFF1F606E6218608864A2DBAC +S315001F3D7020644ADBFFFF2DFF0C600E62206000648B +S315001F3D80A2DB9E60C7645ADBCFFE2F58FFFF0C6075 +S315001F3D900C620064A2DBBEFE0B60F262A2D1406021 +S315001F3DA00064B084A2DBCFFE2E58FFFF40643B4267 +S315001F3DB05ADBC1F114606E62A2D966F5DAF1FFFF14 +S315001F3DC02EF8DBF12FF8FFFFDCF130F8C1F1F860B8 +S315001F3DD0806419F80EFA0060086428FAAEF107F835 +S315001F3DE00060DA6313608064A3DB4460446485FB70 +S315001F3DF086FB87FB3144F9B440510060DA630160EA +S315001F3E001865A3D3A5D104A4A3DBD080A0D10A062D +S315001F3E1041643B425ADB0C600C620064A2DB9B6070 +S315001F3E20A478FFFF44470E6141D3324008260300A2 +S315001F3E3010B0FFFFDA0242643B425ADB0C600C6291 +S315001F3E400064A2DBDEFE0B040C600E6240600064A1 +S315001F3E50A2DB9F601E645ADBCFFE2F58FFFF27D1C0 +S315001F3E6083F91F606E62A2D91E644ADBFFFF2DFF16 +S315001F3E700C600E6220600064A2DB9F6043645ADB05 +S315001F3E80CFFE2F58FFFF0C600C620064A2DBBEFE44 +S315001F3E900B60F262A2D140600064B084A2DBCFFE49 +S315001F3EA014606E620760D064A2DB1F607E621460BE +S315001F3EB06A64A2DB02644ADBFFFF04FF274306A3F3 +S315001F3EC0BDD385FBBDD3FFFF86FBA3D387FB0C604A +S315001F3ED00C620064A2DB0C600E6201600464A2DB4C +S315001F3EE09F6076645ADBCFFE2F58FFFFC1F1146027 +S315001F3EF06E62A2D90C600C62A2D1FE60FF61A18422 +S315001F3F005AD14ADBA1845ADB0C600C62A2D1006035 +S315001F3F100464A0809C840503A084A2DB9E60F578C0 +S315001F3F20FFFF006008652044348065F5DAF12EF83E +S315001F3F30FFFFDBF12FF8DCF1FFFF30F8C1F119F8B5 +S315001F3F40807EF87F0EFA0060086428FAAEF107F843 +S315001F3F5000642AFAB06429FA274306A3BDD12BF8B9 +S315001F3F6031F8FFFFBDD12CF832F8FFFFA3D12DF892 +S315001F3F7033F8066338FC1A609261F5F3A1D303A8E0 +S315001F3F80AC830F020E031A609461A1D1664500F43B +S315001F3F9002FC01645ADA5AD81A6092610064A1DBE6 +S315001F3FA01A0024601C64A0D36645FFA000F40D030D +S315001F3FB0FDA0FFFF0303A0609A78FFFF806402FA4B +S315001F3FC001635ADC00645ADA0600006402FA0163D0 +S315001F3FD05ADC00645ADA1F604E621F600264A2DB5D +S315001F3FE065445ADB02645ADBFFFF2BFF0066F5F3BD +S315001F3FF04646FDA0C1FE02022F58FFFF01646EFB5D +S315001F400043643B425ADB14604062A2D3FFFF64A4A1 +S315001F4010A2DB14604062A2D114606E62A2D91F6037 +S315001F40207E6214606A64A2DB02644ADBFFFF04FF40 +S315001F40300C600E6200600C64A2DBA06023645ADB76 +S315001F4040CFFE2F58FFFF0C600C62A2D100600864E0 +S315001F4050A0809C845C03A084A2DB1F607E62146028 +S315001F40606A64A2DB03644ADBFFFF04FF00646EFB86 +S315001F40700C600C620064A2DB264600F402F203F217 +S315001F408000A804F202A8160200A81A021902264660 +S315001F40901F604E64404BD660584D5878FFFF006630 +S315001F40A046462040082A0300A160D878FFFFA76074 +S315001F40B04378FFFF02F203F280A804F202A8E4038A +S315001F40C044643B425ADB04F226464059186090610D +S315001F40D02EF2A1DB2FF2415859DB30F259DB26466F +S315001F40E01F604E64404BD660584D5878FFFF0066E0 +S315001F40F046460365BC60584E1678FFFF2040082AC7 +S315001F410003009E60F578FFFFA560B778FFFFFF608D +S315001F4110FB64A084A2DB00646EFB0C600C6200646F +S315001F4120A2DB2040082A03009E60F578FFFFA560EA +S315001F4130B778FFFF016302FC3240082603009F6029 +S315001F4140E578FFFF01645ADA00645ADA01646EFBF0 +S315001F41500C600C620064A2DB1F604E621F6002646B +S315001F4160A2DB65445ADB02645ADBFFFF2BFF0066A6 +S315001F4170F5F34646FDA0C1FE02022F58FFFF1F6042 +S315001F41807E6214606A64A2DB02644ADBFFFF04FFDF +S315001F41900C600E6200600C64A2DBA060D3645ADB65 +S315001F41A0CFFE2F58FFFF0C600C62A2D1006008647F +S315001F41B0A0809C843D03A084A2DB1F607E621460E6 +S315001F41C06A64A2DB03644ADBFFFF04FF00646EFB25 +S315001F41D0264600F402F203F201A804F202A8040222 +S315001F41E000A8020201022F0004F226464059186059 +S315001F41F090612EF2A1DB2FF2415859DB30F259DBC9 +S315001F420026461F604E64404BD660584D5878FFFFB8 +S315001F4210006646460365BC60584E1678FFFF204071 +S315001F4220082A03009E60F578FFFFA560B778FFFF99 +S315001F423000646EFB2040082A03009E60F578FFFF8E +S315001F4240A560B778FFFF26464060006529F22EF06D +S315001F4250B48429FA2BF831F8FFFF2FF22CFA32FA21 +S315001F4260FFFF30F22DFA33FAFFFFDAF32EFADBF3F4 +S315001F4270FFFF2FFADCF330FAFFFFD1F119F820F018 +S315001F42800060086413F828FA00F4036403FA006454 +S315001F42905ADA01636EFD0C600C620064A2DB1F60BC +S315001F42A04E621F600264A2DB26445ADB02645ADB9D +S315001F42B0FFFF2BFF0066F5F34646FDA0C1FE020277 +S315001F42C02F58FFFF1F607E6214606A64A2DB0264C0 +S315001F42D04ADBFFFF04FF0C600E6200600C64A2DB6A +S315001F42E0A16076645ADBCFFE2F58FFFF0C600C626D +S315001F42F0A2D100600864A0809C844F03A084A2DB27 +S315001F43001F607E6214606A64A2DB03644ADBFFFFE0 +S315001F431004FF00646EFB264600F402F203F201A8B6 +S315001F432004F204A8160200A81402130226461F60F0 +S315001F43304E64404BD660584D5878FFFF0066464680 +S315001F43402040082A0300A160D878FFFFA7604378A2 +S315001F4350FFFF04F226464059186090612EF2A1DB3A +S315001F43602FF2415859DB30F259DB26461F604E6447 +S315001F4370404BD660584D5878FFFF0066464603658A +S315001F4380BC60584E1678FFFF2040082A03009E6027 +S315001F4390F578FFFFA560B778FFFF00646EFB20402E +S315001F43A0082A03009E60F578FFFFA560B778FFFF18 +S315001F43B045643B425ADB66F500642AFA006429FA13 +S315001F43C0274306A3BDD12BF831F8FFFFBDD12CF82B +S315001F43D032F8FFFFA3D12DF833F8FFFF00F4016475 +S315001F43E03240082610BC02FA27420CA22360EE6355 +S315001F43F0A2D3A3D300BD0163AC8109030803D16017 +S315001F4400584D8678FFFF00B8016308286043146083 +S315001F44103A64A0DD046159DC186090630064BDDB5B +S315001F442025609261A1D3FFFF00B8FFFF030227415A +S315001F443010A1A1D302A16145BDDB6041A5D1DA85DB +S315001F44406444007FCD81BDDB05036447007FCD81BA +S315001F4450BDDBF4020164BDDB2560E461A1D102A1CD +S315001F44606145BDD96441A5D1DA856444007FCD81FC +S315001F4470BDDB05036447007FCD81BDDBF402274109 +S315001F448032A1A1D3FFFF7FA8414B3903DD64BDDBFA +S315001F449002A1A1D1166464400236FFFFBDDB006492 +S315001F44A0BDDB5064BDDBF264BDDB0164BDDB0164B3 +S315001F44B0BDDB0064BDDB0064BDDB5064BDDBF264A5 +S315001F44C0BDDB2B41A1D3BDDB0164BDDB0064BDDBBE +S315001F44D00064BDDB5064BDDBF264BDDB2B44D881B9 +S315001F44E0A1D3BDDB0164BDDB0064BDDB0064BDDBA6 +S315001F44F05064BDDBF264BDDBD981A1D3BDDB634153 +S315001F4500186090636345D581E981414B0865BDD32A +S315001F4510BDD16047B087A5DAC981DA85F80766F588 +S315001F45202B4304A326601C6138FCA1DD434B266088 +S315001F45301E610064A1DB00F42B436340012601A327 +S315001F4540CB8326601E61026458D059D9FD1F3344A0 +S315001F4550E084689366F51F604E621F600264A2DBEB +S315001F456066445ADB02645ADBFFFF2BFF0066464692 +S315001F4570C1FE06646EFB46643B425ADB1F607E62C9 +S315001F458014606A64A2DB02644ADBFFFF04FF0C604F +S315001F45900E6200601C64A2DBA260D2645ADBCFFEEF +S315001F45A02F58FFFF0C600C62A2D100600864A08028 +S315001F45B09C842603A084A2DB1F607E6214606A644B +S315001F45C0A2DB03644ADBFFFF04FF0C600C6200647E +S315001F45D0A2DB264600F403F2006300A86EFD460325 +S315001F45E026461F604E64404BD660584D5878FFFFD5 +S315001F45F00066464647643B425ADB9E60F578FFFFDE +S315001F460000601064A0809C842103A084A2DB1F602D +S315001F46107E6214606A64A2DB03644ADBFFFF04FF49 +S315001F462026461F604E64404BD660584D5878FFFF94 +S315001F46300066464600646EFB0C600C620064A2DBDB +S315001F464049643B425ADB9F609178FFFFFF60FB6422 +S315001F4650A084A2DB00646EFB0C600C620064A2DB0C +S315001F46604A643B425ADB9E60F578FFFF48643B4233 +S315001F46705ADB04F2FFFF07B401610303CC84E18117 +S315001F4680FD0261449AFB2745026246D35AD1604711 +S315001F46905BFB64475AFB006462FB0C6246D384FBD8 +S315001F46A004F00F60FF64A08489FB264631F085F96C +S315001F46B032F00E63C78186F933F087F920632560D0 +S315001F46C0F66459D158D9FD1F14603A62A2D38BFBE9 +S315001F46D0FFFFAEF330F064A406A460436445206177 +S315001F46E02FF0BED3A3D3D480D0800D02BFD32EF01C +S315001F46F00502D080AEF30202FAA30B002FF0CD8184 +S315001F470064A3EF020300CD8164A3EB02AEF3FFFFA8 +S315001F47106043AEF1FFFFD38030F21D026041166089 +S315001F47203C656147007FAEF1E08444D3FFFF00A8DC +S315001F473064430503A0D3FFFF00A8FFFFFB026241EE +S315001F4740A3D3A1DBFFFFA0D1A3D90063A0DD0EA5D4 +S315001F47506143A5DD6043434700F40A650C61186099 +S315001F47609063A5D0DA856444007FCD81BDDB050348 +S315001F47706447007FCD81BDDBF40218609261A1D32F +S315001F47800065604359D3FFFF7FB4023A02000164FC +S315001F47901500043A0200026411000A3A020004647A +S315001F47A00D000B3A020008640900103A020010645B +S315001F47B00500163A0200206401000064CF83B48509 +S315001F47C0E10265447EFB18609261A1D300656043D8 +S315001F47D059D3FFFF80B0FFFF01036045CF836544B8 +S315001F47E0F7027FB4023A02000A641500043A020077 +S315001F47F0146411000A3A020032640D000B3A0200DB +S315001F480037640900103A020050640500163A020088 +S315001F48106E640100146480FB2744F0F36045106149 +S315001F482045D16040013606000236040004360200F8 +S315001F4830053A0200006401000164A1DB7DF37EF1ED +S315001F4840FFFFA084654302027DF3FFFF60410B60FB +S315001F4850D065F0F3FFFFE08444D36145A480FFFFDA +S315001F48600402E884A480FFFFFC03A4847FFB634546 +S315001F48706047106145D1FFFF9084A1DB604760450B +S315001F48808064E884A480FFFFFC03A4846345186149 +S315001F489045D1A1DB0061E884FFFF0205DD81FB0036 +S315001F48A0E1810B60C46545D31261634545DB8060BA +S315001F48B00365AEF33240082A036564A414A4A0D18D +S315001F48C07F60FF64A084B484A2DBAEF3264664A493 +S315001F48D0404B04A42EF0A0D92FF0FFFF58D930F07B +S315001F48E058D93E632B5C2264C08200645ADBFE1FCC +S315001F48F02B5C80FF00638B60584E2778FFFF86FF77 +S315001F49002B5C80FF01638B60584E2778FFFF86FF65 +S315001F49102B5C80FF02638B60584E2778FFFF86FF54 +S315001F49202B5C80FF03638B60584E2778FFFF86FF43 +S315001F49309E60584E2478FFFF26461F604E64404BEC +S315001F4940D660584D5878FFFF00664646016490FBB7 +S315001F495024602662A2D3204100BC20B90103414036 +S315001F49601A6090610064A1DB0464C1FEF5FBBEF30F +S315001F4970FFFFFEB4BEFBFFFF0165BC60584E4378C8 +S315001F4980FFFF0B60FA62A2D100600264B084A2DB53 +S315001F4990CFFE0C646EFB0C600E6200603064A2DBFF +S315001F49A0A460D6645ADBCFFE2F58FFFF0C600C6243 +S315001F49B0A2D100601064A0809C846403A084A2DB43 +S315001F49C0AEF3FFFF78A5A5D1FF60FC64A084A2DB30 +S315001F49D04B643B425ADB0C600C620064A2DB016035 +S315001F49E03662A2D3FFFF10B0FFFF13030C600E62E7 +S315001F49F004600064A2DBA56009645ADBCFFE0C606D +S315001F4A001862A2D101600064B084A2DBCFFE2F58CA +S315001F4A10FFFF6FF3FFFF01B0FFFF13030B60FA6287 +S315001F4A20A2D100600464B084A2DBCFFE0C600E62CC +S315001F4A3002600064A2DBA56021645ADBCFFE2F58FB +S315001F4A40FFFF0C600C620064A2DB00646EFBA560B6 +S315001F4A50584E5078FFFF026490FB0264C1FEF5FBBF +S315001F4A60BEF3FFFF01BCBEFBFFFF0265BC60584ED5 +S315001F4A704378FFFF0360E86314603C64A0DD9B601E +S315001F4A80A478FFFF00602064A0809C848D03A0840F +S315001F4A90A2DB00636EFD0C600C620064A2DB1500D6 +S315001F4AA01F607E6214606A64A2DB03644ADBFFFF39 +S315001F4AB004FF00646EFB0C600C620064A2DB0164E1 +S315001F4AC090FBFFFFC1FE2E58FFFF50643B425ADB8F +S315001F4AD00C600C620064A2DB01603662A2D3FFFF8A +S315001F4AE010B0FFFF13030C600E6204600064A2DBAC +S315001F4AF0A56068645ADBCFFE0C601862A2D1016004 +S315001F4B000064B084A2DBCFFE2F58FFFFC1F11460F3 +S315001F4B106E62A2D983F182F9026490FBFFFFC1FE88 +S315001F4B2090F30065D480FFFF0F030C600E62806058 +S315001F4B300064A2DBA5608C645ADBCFFE0C600C629E +S315001F4B400064A2DB2F58FFFF0C600C620064A2DB1F +S315001F4B5051643B425ADB136080646DFB14604263F1 +S315001F4B6085F3BDDB86F3FFFFBDDB87F3A3DB0160A8 +S315001F4B7018656DF3A5D104A46DFBD080A0D31F07C4 +S315001F4B80404760410E6545D332400826030010B0EA +S315001F4B90FFFFED02274406A46041A1D185F3FFFF65 +S315001F4BA0D08086F159D30802D08087F359D10402E9 +S315001F4BB0D080FFFF01020300A6607378FFFF146019 +S315001F4BC04263BDD385FBBDD3FFFF86FBA3D387FB04 +S315001F4BD053643B425ADB0C600C620064A2DBDEFEB0 +S315001F4BE00B040C600E6240600064A2DBA560DF64EC +S315001F4BF05ADBCFFE2F58FFFF82F183F91F606E62CB +S315001F4C00A2D91E644ADBFFFF2DFF0C600E622060D7 +S315001F4C100064A2DBA66010645ADBCFFE2F58FFFF8D +S315001F4C200C600C620064A2DBBEFE0B60F262A2D1B6 +S315001F4C3040600064B084A2DBCFFE016390FD0B6071 +S315001F4C40FA62A2D100600264B084A2DBCFFEC1FE6D +S315001F4C5054643B425ADB3144F9B440510160CA6186 +S315001F4C6018608A63A1D3FFFF207FBDDB59D3FFFFE7 +S315001F4C70217FBDDB59D3FFFF227FA3DB0C600C62B4 +S315001F4C800064A2DBDEFE0B040C600E624060006453 +S315001F4C90A2DBA6603E645ADBCFFE2F58FFFF1F60C4 +S315001F4CA06E6218608864A2DB20644ADBFFFF2DFF5B +S315001F4CB00C600E6220600064A2DBA66063645ADB90 +S315001F4CC0CFFE2F58FFFF0C600C620064A2DBBEFEF6 +S315001F4CD00B60F262A2D140600064B084A2DBCFFEFB +S315001F4CE0A460C978FFFF27432560F865A5D36541F2 +S315001F4CF010A301A4FEB4C485FEA1BDD359D1FFFFE5 +S315001F4D00D080D58002020403F800A560B778FFFFA4 +S315001F4D1055643B425ADB0C600C620064A2DBDEFE6C +S315001F4D200B040C600E6240600064A2DBA6608B64FD +S315001F4D305ADBCFFE2F58FFFF27D183F91F606E6204 +S315001F4D40A2D91E644ADBFFFF2DFF0C600E62206096 +S315001F4D500064A2DBA660B0645ADBCFFE2F58FFFFAC +S315001F4D600C600C620064A2DBBEFE0B60F262A2D175 +S315001F4D7040600064B084A2DBCFFE0160CA61186088 +S315001F4D808A63A1D3FFFF207FBDDB21603264BDDBB9 +S315001F4D9004A1A1D3FFFF227FA3DB0C600C6200647A +S315001F4DA0A2DBDEFE0B040C600E6240600064A2DB19 +S315001F4DB0A660CD645ADBCFFE2F58FFFF1F606E62C1 +S315001F4DC018608864A2DB20644ADBFFFF2DFF0C609E +S315001F4DD00E6220600064A2DBA660F2645ADBCFFE7F +S315001F4DE02F58FFFF0C600C620064A2DBBEFE0B6037 +S315001F4DF0F262A2D140600064B084A2DBCFFE1460D1 +S315001F4E006E620760D064A2DB1F607E6214606A64F4 +S315001F4E10A2DB02644ADBFFFF04FF274306A3BDD3C1 +S315001F4E2085FBBDD3FFFF86FBA3D387FB3144F9B4B4 +S315001F4E3040510C600C620064A2DB0C600E620160C4 +S315001F4E400464A2DBA76028645ADBCFFE2F58FFFF3E +S315001F4E50C1F114606E62A2D90C600C62A2D1FE6011 +S315001F4E60FF61A1845AD14ADBA1845ADB0C600C6214 +S315001F4E70A2D100600464A0809C840503A084A2DBE9 +S315001F4E80A560B778FFFF27420CA22360EE63A2D36B +S315001F4E90A3D300BD0163AC8109030803D160584D3C +S315001F4EA08678FFFF00B801630828604314603A64E0 +S315001F4EB0A0DD66F500642AFA206429FA274306A3B3 +S315001F4EC0BDD12BF831F8FFFFBDD12CF832F8FFFF0B +S315001F4ED0A3D12DF833F8FFFFDAF12EF8DBF1FFFF30 +S315001F4EE02FF8DCF130F8FFFFC1F119F8F860806484 +S315001F4EF00EFA00F401633240082610BB02FC146050 +S315001F4F003A64A0D3046159DA14604263BDD1FFFF2E +S315001F4F1059D8BDD159D8FFFFA3D159D8186090636E +S315001F4F200064BDDB25609261A1D3FFFF00B8FFFFC0 +S315001F4F300302274110A1A1D302A16145BDDB604138 +S315001F4F40A5D1DA856444007FCD81BDDB05036447A7 +S315001F4F50007FCD81BDDBF4020164BDDB2560E4610A +S315001F4F60A1D102A16145BDD96441A5D1DA856444A9 +S315001F4F70007FCD81BDDB05036447007FCD81BDDB8F +S315001F4F80F402274132A1A1D3FFFF7FA8414B39036A +S315001F4F90DD64BDDB02A1A1D1166464400236FFFFAA +S315001F4FA0BDDB0064BDDB5064BDDBF264BDDB0164A9 +S315001F4FB0BDDB0164BDDB0064BDDB0064BDDB50648B +S315001F4FC0BDDBF264BDDB2B41A1D3BDDB0164BDDBC1 +S315001F4FD00064BDDB0064BDDB5064BDDBF264BDDB7A +S315001F4FE02B44D881A1D3BDDB0164BDDB0064BDDBCF +S315001F4FF00064BDDB5064BDDBF264BDDBD981A1D388 +S315001F5000BDDB6341186090636345D581E981414BE0 +S315001F50100E65BDD3BDD16047B087A5DAC981DA85D4 +S315001F5020F80766F52B430AA326601C6138FCA1DD31 +S315001F5030434B26601E612064A1DB00F42B436340B3 +S315001F5040012601A3CB8326601E61026458D059D95D +S315001F5050FD1F3344E084689366F51F604E621F6030 +S315001F50600264A2DB66445ADB02645ADBFFFF2BFF96 +S315001F507000664646C1FE14646EFB56643B425ADB0D +S315001F508014604062A2D3FFFF64A4A2DB14604062D7 +S315001F5090A2D114606E62A2D91F607E6214606A6418 +S315001F50A0A2DB02644ADBFFFF04FF0C600E62006096 +S315001F50B01C64A2DBA86060645ADBCFFE2F58FFFF7B +S315001F50C00C600C62A2D100600464A0809C840E0355 +S315001F50D0A084A2DB57643B425ADB00646EFB0C6064 +S315001F50E00C620064A2DBA560B778FFFF0060106446 +S315001F50F0A0809C841703A084A2DB1F607E621460BD +S315001F51006A64A2DB03644ADBFFFF04FF58643B4269 +S315001F51105ADB00646EFB0C600C620064A2DBA960A4 +S315001F5120CA78FFFF00600864A0809C842803A084BF +S315001F5130A2DB1F607E6214606A64A2DB03644ADB23 +S315001F5140FFFF04FF00646EFB0C600C620064A2DBB1 +S315001F5150264600F403F2FFFF00B8FFFF140359644D +S315001F51603B425ADB26461F604E64404BD660584D65 +S315001F51705878FFFF00664646A560B778FFFF5A645A +S315001F51803B425ADB9B005B643B425ADB04F2FFFF48 +S315001F519007B401610303CC84E181FD0261449AFBDC +S315001F51A02745026246D35AD160475BFB64475AFBC9 +S315001F51B0006462FB0C6246D384FB04F00F60FF643D +S315001F51C0A08489FB14603A62A2D38BFB264631F07A +S315001F51D085F932F0FFFF86F933F087F9FFFF00F4F8 +S315001F51E00A650C6118609063A5D0DA856444007F58 +S315001F51F0CD81BDDB05036447007FCD81BDDBF40296 +S315001F520018609261A1D30065604359D3FFFF7FB435 +S315001F5210023A020001641500043A020002641100FA +S315001F52200A3A020004640D000B3A020008640900E2 +S315001F5230103A020010640500163A020020640100AD +S315001F52400064CF83B485E10265447EFB18609261DA +S315001F5250A1D30065604359D3FFFF80B0FFFF010351 +S315001F52606045CF836544F7027FB4023A02000A64A1 +S315001F52701500043A0200146411000A3A020032644F +S315001F52800D000B3A020037640900103A0200506401 +S315001F52900500163A02006E640100146480FBAEF32B +S315001F52A0FFFF64A4F0F36045106145D160400136ED +S315001F52B006000236040004360200053A02000064A6 +S315001F52C001000164A1DB7DF37EF1FFFFA08465432E +S315001F52D002027DF3FFFF60410B60D065F0F3FFFF15 +S315001F52E0E08444D36145A480FFFF0402E884A480C0 +S315001F52F0FFFFFC03A4847FFB63456047106145D114 +S315001F5300FFFF9084A1DB604760458064E884A4802A +S315001F5310FFFFFC03A4846345186145D1A1DB00612F +S315001F5320E884FFFF0205DD81FB00E1810B60C46598 +S315001F533045D31261634545DBAEF3264668A42EF0BE +S315001F5340A0D92FF0FFFF58D930F058D99E60584E7C +S315001F53502478FFFF26461F604E64404BD660584D8B +S315001F53605878FFFF006646460365BC60584E437873 +S315001F5370FFFF016390FD0B60FA62A2D10060026419 +S315001F5380B084A2DBCFFEC1FE5C643B425ADBA46045 +S315001F5390C978FFFFFF60F765204424809F609578DA +S315001F53A0FFFFF5F3FFFFFDA029F20303AA607B7839 +S315001F53B0FFFF6040B0361100C03602002F58FFFFB6 +S315001F53C026461F604E64404BD660584D5878FFFFE7 +S315001F53D0006646469F609578FFFF664500F403F218 +S315001F53E004F2FEA0F3A06F02604102F2200300A0A8 +S315001F53F0FFA05303650300A0FFFF4F031A609261CE +S315001F54000164A1DB1A6094610D64A1DB1A609661C9 +S315001F54100364A1DB26461F604E64404BD660584D81 +S315001F54205878FFFF006646469F609578FFFF246009 +S315001F54301C61A1D3FFFFFEA01A60926117020164CF +S315001F5440A1DB1A6094610064A1DB1A609661016496 +S315001F5450A1DB26461F604E64404BD660584D5878D8 +S315001F5460FFFF006646469F609578FFFF0264A1DB3B +S315001F54701A6094610064A1DB1A6096610164A1DB66 +S315001F548026461F604E64404BD660584D5878FFFF26 +S315001F5490006646469F609578FFFF654607F21465CE +S315001F54A044D3FFFF017EA2DB26461F604E64404B9E +S315001F54B0D660584D5878FFFF006646462F58FFFFA7 +S315001F54C0A1602378FFFF03F202F2FCA0FFA01202E5 +S315001F54D00B0204F2FFFF00A06546090207F21465DE +S315001F54E044D3FFFF017EA2DB9F609578FFFF264610 +S315001F54F02F58FFFF65466EF129F264416040A03ABE +S315001F5500020008B10400C03A0C0004B1FFFF4A03B1 +S315001F55100C600C62A2D100601064B084A2DBCFFEC7 +S315001F55204100B03A020001653100103A1700414BA5 +S315001F5530266076611064A1DB38F06645644300F48B +S315001F55406340012601A3CB8326607661026458D08F +S315001F555059D9FD1F65462B4102651800303A2200B6 +S315001F5560414B266076613064A1DB38F066456443A3 +S315001F557000F46340012601A3CB8326607661026493 +S315001F558058D059D9FD1F65462B411065A580FFFFD1 +S315001F559009030C600C62A2D100600864B084A2DB10 +S315001F55A0CFFE00662F58FFFF00603C61FE60584D1E +S315001F55B04D78FFFF664468FB086428FAAEF307FAC6 +S315001F55C00C608064C1F119F80EFA006438FA0060A5 +S315001F55D03C61FE60584D4D78FFFF664467FB0864CB +S315001F55E028FAAEF307FA0C6080640EFAC1F119F8B7 +S315001F55F0006438FA0C603062AC605B64A2DB0C603E +S315001F5600026200608064A2DBAB600A645ADBCFFED5 +S315001F56102F58FFFF20643B425ADB2360A262A2D3AE +S315001F5620FFFF01A803A804030303AC604978FFFF2B +S315001F563004600065204434800C6000620064A2DBB5 +S315001F56409BFE030520404B230E000C600262806008 +S315001F56500064A2DBAB601C645ADBCFFE21643B42B5 +S315001F56605ADB2F58FFFF1A609E61A1D3FFFF6040D0 +S315001F5670012A070090600065204434800064A1DB86 +S315001F56800400106000652044348090F35EFB88F1AF +S315001F5690BAFE01A85FF90402026490FBFFFFC1FE78 +S315001F56A06447F5F310B004A8370268F53502DAF13E +S315001F56B02EF8DBF1FFFF2FF8DCF130F8FFFF85F145 +S315001F56C02BF831F8FFFF86F12CF832F8FFFF87F130 +S315001F56D02DF833F81060486429FA1F604E621F6068 +S315001F56E00264A2DB66445ADB02645ADBFFFF2BFF10 +S315001F56F0C1FE22643B425ADB0C60026200600164F9 +S315001F5700A2DBAB6087645ADBCFFE2F58FFFF2364F3 +S315001F57103B425ADB106788FB90F3FFFF00A8FFFF91 +S315001F57200B030C60026280600064A2DBAB608C64BA +S315001F57305ADBCFFE2F58FFFF0C6000620064A2DB0E +S315001F5740056459FB2560B4645CFB24643B425ADB49 +S315001F57500F4EBF60584F5E78FFFF0E4F0C60026200 +S315001F576010600064A2DBAB60B9645ADBCFFE2F5812 +S315001F5770FFFF25643B425ADBFFFF5FF388FB604058 +S315001F57801027DAFEF5F300A804A82A0267F52802F7 +S315001F5790DAF12EF8DBF1FFFF2FF8DCF130F8FFFF0F +S315001F57A085F12BF886F1FFFF2CF887F12DF8A464FD +S315001F57B029FA89F1C067B0842AFA1F604E621F60FA +S315001F57C00264A2DB66445ADB02645ADBFFFF2BFF2F +S315001F57D0C1FE206000652044348026643B425ADBAC +S315001F57E0A2F500647AFBF160016423FADA8513607F +S315001F57F082638DF1434CD380BED113056540802A49 +S315001F5800020000F40465644332610F4EDB60584F9B +S315001F58109178FFFF0E4F2C437AF304A332A47AFB31 +S315001F5820E800204720B020AF0F0340400C60026203 +S315001F583000600164A2DBAC6021645ADBCFFE2F58E7 +S315001F5840FFFF27643B425ADB7AF3A2F102A4E884E6 +S315001F5850644622FA1F604E621F603E64A2DB5AD95D +S315001F586002645ADBFFFF2BFF0064A2FB0865455449 +S315001F58703BFFEB60FF65204424800B60F262A2D1E0 +S315001F588080600064B084A2DBCFFE5EF390FBFFFF57 +S315001F5890C1FE0C6000620064A2DB0C600262006045 +S315001F58A08064A2DBAB600A645ADBCFFE2E643B42E8 +S315001F58B05ADB2F58FFFF2F643B425ADBA2F10064CD +S315001F58C0B086A2FB07031F604E64404BD660584D3F +S315001F58D05878FFFFEB60FF65204424800C60006250 +S315001F58E00064A2DB0C60026200608064A2DBAB6016 +S315001F58F00A645ADBCFFE2F58FFFF1A60A2632E449D +S315001F5900A3DB00660160CA6118608A63A1D3FFFF2B +S315001F5910207FBDDB21603264BDDB04A1A1D3FFFF65 +S315001F5920227FA3DB14001A60A2632E44A3DB01604F +S315001F5930CA6118608A63A1D30066207FBDDB59D375 +S315001F5940FFFF217FBDDB59D3FFFF227FA3DB0B6048 +S315001F5950FA62A2D19F60FF64A084A2DBDEFE0B0465 +S315001F59600B60FC6240600064A2DBAC60A7645ADB7C +S315001F5970CFFE2F58FFFF1F606E6218608864A2DB80 +S315001F598020644ADBFFFF2DFF0B60FC622060006472 +S315001F5990A2DBAC60CF645ADBCFFE2F58FFFF0B6034 +S315001F59A0FA62A2D19F60FF64A084A2DBBEFE0B60D9 +S315001F59B0F262A2D140600064B084A2DBCFFE1A60FF +S315001F59C0A263A3D7FFFFFFFF0C602E62B06078644F +S315001F59D0A2DB14608E620064A2DB06A20C604A641E +S315001F59E0A2DB06645ADB5ADB14609A620064A2DBF0 +S315001F59F006A20C604E64A2DB06645ADB5ADB1460F7 +S315001F5A00A6620064A2DB06A20C605264A2DB0664D7 +S315001F5A105ADB5ADBC5F11460AA62A2D90C60486230 +S315001F5A20B2601C64A2DB0C604C62B2602664A2DB0F +S315001F5A300C605062B2603064A2DB00607061FE6071 +S315001F5A40584D4D78FFFF664469FB086428FAAEF38C +S315001F5A5007FA006438FA0B60FC6200600264A2DB7E +S315001F5A60AD6036645ADBCFFE2F58FFFF0B60FA621C +S315001F5A700064A2DB03646FFB0F4EB660584F2F788E +S315001F5A80FFFF0E4F006471FB69F50160B463BDD360 +S315001F5A902EFABDD3FFFF2FFAA3D330FAFFFF85F3EC +S315001F5AA02BFA31FAFFFF86F32CFA32FAFFFF87F340 +S315001F5AB02DFA33FAFFFFC1F319FA066080640EFA56 +S315001F5AC0B160584EF478FFFFF760FF6520442480CD +S315001F5AD00B60F262A2D180600064B084A2DBCFFEAD +S315001F5AE00B60FA62A2D1FF608F64A084A2DBC6F1AD +S315001F5AF014609E62A2D91F607E6214609A64A2DB44 +S315001F5B0002644ADBFFFF04FF006471FB0B60FC624B +S315001F5B1000607464A2DBAD6091645ADBCFFE2F5820 +S315001F5B20FFFF0B60FA62A2D100600464A0809C8410 +S315001F5B300503A084A2DBB0607878FFFF0060406495 +S315001F5B40A0809C840303A084A2DBE0000060206485 +S315001F5B50A0809C841003A084A2DB20405027DF0076 +S315001F5B60B4F371F3FEA0F6A0D106040771F3FFFF8D +S315001F5B70DC84A2DBCB0000601064A0809C84CF0372 +S315001F5B80A084A2DB07000B60FA62A2D1FF609F64AC +S315001F5B90A084A2DBE8F32945D48071F30304AE6029 +S315001F5BA00C78FFFFF6A0FFFF0304AE600C78FFFF23 +S315001F5BB00B60FC6200606464A2DBAD60E3645ADBC9 +S315001F5BC0CFFE2F58FFFF0B60FA62A2D1006004645C +S315001F5BD0A0809C840503A084A2DBB0607878FFFFB9 +S315001F5BE000604064A0809C840303A084A2DBD200D3 +S315001F5BF000602064A0809C84E403A084A2DB204074 +S315001F5C005027DF00B4F3FFFFFEA0FFFFC30671F3AB +S315001F5C10FFFFDC84A2DBBE000B60FA620064A2DB1E +S315001F5C202040402B0B000B60FC6280600064A2DBEF +S315001F5C30AE600C645ADBCFFE2F58FFFF1660266539 +S315001F5C400164A5DBC7F114609E62A2D90C6459FBDF +S315001F5C50AE602E6470FBB060F578FFFF1F607E623A +S315001F5C601460A664A2DB03644ADBFFFF04FF0B601C +S315001F5C70FA62A2D1FF60DF64A084A2DB8CF11360FD +S315001F5C808263D3806DFD45036DF3EAF160432944BA +S315001F5C90A3D3C085D4805BD33C06604308A3BED381 +S315001F5CA087F1A3D3D08086F10502BFD3D08085F1BB +S315001F5CB00102D080F8A31102A3D383F1FFFFD08086 +S315001F5CC0FFFF27030C600C62A2D100601064B08432 +S315001F5CD0A2DBCFFEAD606478FFFF2560F865A5D314 +S315001F5CE0654110A301A4FEB4C485FEA1BDD359D13D +S315001F5CF0FFFFD080D58005020103F800B0606C78E5 +S315001F5D00FFFF6DF38CF104A4D080FFFF02036DFB30 +S315001F5D10BB00E8F32945D480FFFF0C071F607E6296 +S315001F5D2014609A64A2DB03644ADBFFFF04FFAD60C5 +S315001F5D306478FFFFE9F32945D480FFFF1806046541 +S315001F5D40BC60584E4378FFFF0564F5FBBEF3FFFFAB +S315001F5D5001BCBEFBFFFF1F607E6214609A64A2DB5C +S315001F5D6003644ADBFFFF04FFAF600778FFFF0B608A +S315001F5D70FC6200607464A2DBAE60C2645ADBCFFEB5 +S315001F5D802F58FFFF0B60FA62A2D100600464A08047 +S315001F5D909C840503A084A2DBB0607878FFFF0060B7 +S315001F5DA04064A0809C840503A084A2DBAE603E787D +S315001F5DB0FFFF00602064A0809C841603A084A2DBE2 +S315001F5DC020405027DD00B4F371F3FEA0F6A00906AC +S315001F5DD0040400645AFB4049040071F3FFFFDC848E +S315001F5DE0A2DBAE603E78FFFF00601064A0809C843B +S315001F5DF0C703A084A2DB1F607E621460A664A2DBB9 +S315001F5E0003644ADBFFFF04FFAE600C78FFFF0B60E5 +S315001F5E10FA620064A2DB2040402B0B000B60FC6281 +S315001F5E2080600064A2DBAF6007645ADBCFFE2F5889 +S315001F5E30FFFF166026650064A5DBC8F114609E622D +S315001F5E40A2D90D6459FBAF60296470FBB060F57869 +S315001F5E50FFFF1F607E621460A664A2DB03644ADB39 +S315001F5E60FFFF04FF0B60FA62A2D1FF60DF64A0840C +S315001F5E70A2DB8CF113608263D3806DFD5D036DF32E +S315001F5E802941A0D158D3D180644560430F0508A38B +S315001F5E90BED387F1A3D3D08086F10502BFD3D080AE +S315001F5EA085F10102D080F8A32002454908A3BED37D +S315001F5EB087F1A3D3D08086F10502BFD3D08085F1A9 +S315001F5EC00102D080F8A33802A3D383F1FFFFD0804D +S315001F5ED0FFFF32030C600C62A2D100601064B08415 +S315001F5EE0A2DBCFFEB0601C78FFFF2560F865A5D347 +S315001F5EF0654110A301A4FEB4C485FEA1BDD359D12B +S315001F5F00FFFFD080D5801002F9020565BC60584E90 +S315001F5F104378FFFF0464F5FBBEF3FFFFFEB4BEFB31 +S315001F5F20FFFFB0606C78FFFF6DF38CF104A4D08087 +S315001F5F30FFFF02036DFBA300E9F32945D480FFFF92 +S315001F5F407B0514604863A3D383F1FFFFD080FFFF57 +S315001F5F5009030C600C62A2D100601064B084A2DB3E +S315001F5F60CFFE6A001F607E6214609A64A2DB036420 +S315001F5F704ADBFFFF04FF0565BC60584E4378FFFFF1 +S315001F5F800464F5FBBEF3FFFFFEB4BEFBFFFF88F301 +S315001F5F9069F5487E29FA02600065204434801F6037 +S315001F5FA04E621F600264A2DB66445ADB02645ADB40 +S315001F5FB0FFFF2BFFC1FE0B60FC6200600164A2DBCA +S315001F5FC0AF60E6645ADBCFFE2F58FFFF0B60FA6205 +S315001F5FD0A2D1FF60FE64A084A2DB14609E620060F3 +S315001F5FE03264A2DB1F607E6214609A64A2DB0264C5 +S315001F5FF04ADBFFFF04FF0B60FC6200601064A2DB3C +S315001F6000B06006645ADBCFFE2F58FFFF0B60FA62A3 +S315001F6010A2D1FF60EF64A084A2DBFD60FF65204470 +S315001F602024800B60F262A2D180600064B084A2DB80 +S315001F6030CFFEAD606478FFFF0B60FC620060746486 +S315001F6040A2DBB06027645ADBCFFE2F58FFFF0B6021 +S315001F6050FA62A2D100600464A0809C840503A08418 +S315001F6060A2DBB0607878FFFF00604064A0809C844C +S315001F60700503A084A2DBAF603978FFFF00602064B0 +S315001F6080A0809C841603A084A2DB20405027DD003D +S315001F6090B4F371F3FEA0F6A00906040400645AFBCC +S315001F60A04049040071F3FFFFDC84A2DBAF6039783F +S315001F60B0FFFF00601064A0809C84C703A084A2DB3E +S315001F60C01F607E621460A664A2DB03644ADBFFFFC7 +S315001F60D004FFAF600778FFFF086000652044348027 +S315001F60E00C600C62A2D100602064B084A2DBCFFEDC +S315001F60F01F607E6214608E64A2DB03644ADBFFFFAF +S315001F610004FF1F607E6214609A64A2DB03644ADB8D +S315001F6110FFFF04FF1F607E621460A664A2DB036498 +S315001F61204ADBFFFF04FF0B60FA620064A2DB5ADB47 +S315001F613000646FFB0C600C62A2D102600064B08425 +S315001F6140A2DBCFFE0B60FC6200600264A2DBAD60C7 +S315001F615036645ADBCFFE2F58FFFFA3D383F182FB92 +S315001F6160D08060443F030B60FA62A2D1BF60FF6418 +S315001F6170A084A2DBDEFE0B040B60FC6240600064A1 +S315001F6180A2DBB060B3645ADBCFFE2F58FFFF0B6054 +S315001F6190FA62A2D1DF60FF64A084A2DB82F183F9D9 +S315001F61A01F606E62A2D91E644ADBFFFF2DFF0B60C4 +S315001F61B0FC6220600064A2DBB060E2645ADBCFFEA3 +S315001F61C02F58FFFFBEFE0B60FA62A2D1DF60FF648D +S315001F61D0A084A2DB0B60F262A2D140600064B0848F +S315001F61E0A2DBCFFE70F7FFFFFFFF026000652044B2 +S315001F61F034800B60FA62A2D17F60FF64A084A2DBA9 +S315001F6200204051230B000B60FC6280600064A2DB00 +S315001F6210B060F9645ADBCFFE2F58FFFF0B60FA629E +S315001F6220A2D17F60FF61A1845AD14ADBA1845ADBC8 +S315001F62304060006520443480026490FBFFFFC1FE6E +S315001F624090F30065D480FFFF12030B60FA62A2D1A0 +S315001F62507F60FF64A084A2DB0B60FC628060006429 +S315001F6260A2DBB1601C645ADBCFFE2F58FFFF2560EF +S315001F6270F8645CFB0B60FA62A2D1EF60FF64A08436 +S315001F6280A2DBAC60584E7D78FFFF0F4EBF60584FA4 +S315001F62905E78FFFF0E4F0B60FC6210600064A2DB8E +S315001F62A0B16056645ADBCFFE2F58FFFFAC60584EC5 +S315001F62B09378FFFF1F607E6214609A64A2DB0264FC +S315001F62C04ADBFFFF04FF0B60FA62A2D1EF60EF64A7 +S315001F62D0A084A2DB016490FBBF60FF65204424807D +S315001F62E001601C62A2D10C608263C385C8A338A358 +S315001F62F0D780B4F30904FEA071F33A06F6A0006432 +S315001F630037045AFB4049340008A3BED387F1A3D3F1 +S315001F6310D08086F10502BFD3D08085F10102D080DF +S315001F6320F8A3E502BED35AD16047404A64474048A6 +S315001F6330B160584EC878FFFF0A48B160584ED878EA +S315001F6340FFFFB160584EF478FFFF0160366571F3A9 +S315001F6350A5D3F6A040BC0604A5DB6FF1FF60FB6466 +S315001F6360A0846FFB71F3FFFF00B8CC840103A2DB8F +S315001F6370FD60FF65204424800B60F262A2D180601D +S315001F63800064B084A2DBCFFEC1FE70F7FFFFFFFFE4 +S315001F63905AF12844D08403A4030EE884E884040039 +S315001F63A0FAA4E884E887C0BFC084A2DB2E58FFFF8B +S315001F63B05BF12844D0841FA4060EE884E884E88491 +S315001F63C0E884E8840700C2A4E884E884E884E884B3 +S315001F63D0E887F8BFC08462F15BFBD080FFFF010531 +S315001F63E0644458FB2E58FFFF2040202A08000060F7 +S315001F63F0C465A5D3FFFFD0806445010660452F679E +S315001F6400D480FFFF010660455AF18B67D08060413B +S315001F641002246441D5848065C48701050064FFB4E6 +S315001F642040492040202A06002E43C460584ED47887 +S315001F6430FFFF434E2E58FFFF0B60FA62A2D100608A +S315001F64400864B084A2DBCFFE2F58FFFF0B60FA62F1 +S315001F6450A2D100601064B084A2DBCFFE2F58FFFFCD +S315001F64600B60FA62A2D100602064B084A2DBCFFE6B +S315001F64700C601862A2D100604064B084A2DBCFFE1C +S315001F64802F58FFFF264626F2706360400A360A0021 +S315001F64901436120032360800373608005036080008 +S315001F64A06E360800D06308003363060033630400AA +S315001F64B021630200216300001A609861A1DD264650 +S315001F64C000F41065706118609063A5D0DA85644486 +S315001F64D0007FCD81BDDB05036447007FCD81BDDB1A +S315001F64E0F402186090635061BDD3BDD1FDA0FFFFBC +S315001F64F007036444E085D181FEA1C783F50D04001F +S315001F650014604861A3D3A1DB3140062659000064FD +S315001F651075FB186090637061BDD3BDD1FCA0FBA055 +S315001F6520080328036444E085D181FEA1C783F40DC7 +S315001F65304700BDD3BDD300B875FB74FBBDD3400266 +S315001F6540A3D360456047B48460413FB5E884E884BF +S315001F6550E884E884E884E88477FB6547E084E08480 +S315001F656076FB6444E085FAA3C783146040626144E6 +S315001F6570A2DBD200BDD3A3D300B873FB7BFB2002E3 +S315001F65808BF175F372F904656040003A0665314474 +S315001F65903491022A0D00006008653144349177F367 +S315001F65A076F100B86445010367456550CC8478FBD6 +S315001F65B00C600C62A2D101600064B084A2DBCFFE26 +S315001F65C00C600E62A2D3FFFF6040802A7D001A6016 +S315001F65D090610164A1DBB360584EB878FFFF264671 +S315001F65E000F406F284FB00648AFB0C600C62A2D1E5 +S315001F65F000608064B084A2DBCFFE264638F200F42A +S315001F66001065F4A4BCA060410106446141481860AE +S315001F66109063A5D0DA856444007FCD81BDDB050379 +S315001F66206447007FCD81BDDBF4021860906328416B +S315001F6630BDD3BDD101A8C98106036444D181E085BC +S315001F66403F06C783F50043482560E663434A644116 +S315001F66502560E464A0D928430065454CBDD361403D +S315001F666000362800CD8160400236604504366045FD +S315001F667082366045843660450B3660458B366045ED +S315001F6680163660459636604565400036E700644419 +S315001F6690DC84605C2C44003A0200454CDF002C5E13 +S315001F66A0655F0065454C43482A43BDDBFFFF434AF0 +S315001F66B02843D4006440013A39002A436544A3DBCA +S315001F66C03500B460AE78FFFFF5F3FFFF03A802A8FD +S315001F66D002034102F6000C600C62A2D1FF60FB644C +S315001F66E0A084A2DB1F607E6214606A64A2DB026460 +S315001F66F04ADBFFFF04FF26461A609861A1D324F2E6 +S315001F6700604523F000F46443C7836041022401A15E +S315001F671003F002F2D180FFFF090704046345D4800A +S315001F6720FFFF0406B360584EB878FFFF264625F0D4 +S315001F6730FF672088645F404AB160584EC878FFFFE4 +S315001F67400A48B160584ED878FFFFB160584EF478AA +S315001F6750FFFF2F58FFFF0B60FC62A2D3FFFF6040B5 +S315001F67604022AF0001603662A2D3FFFFBFB4A2DB97 +S315001F67701A609861A1D3264660451860806300F4AD +S315001F678002F2BDDBFFFF03F2BDDB04F2FFFFBDDB41 +S315001F679005F2A3DBFAA32646A3D323F00061D08418 +S315001F67A0F181D484F181BDDBA3D303B103A924F006 +S315001F67B042FE0103CC84F181D084F181BDDBA3D3DA +S315001F67C003B103A927F042FE0103CC84F181D084D3 +S315001F67D0F181BDDBA3D303B103A928F00103CC8448 +S315001F67E0D084A3DB016438FB1A609061A1D3FFFF3D +S315001F67F002A8FFFF02022E58FFFF1AFF18608064CF +S315001F6800A0D106A4A0D364456040802B0300FF607F +S315001F6810FF64948500609664D480FFFF0B061A60A0 +S315001F68209061A1D36FF300A804B004020303B46000 +S315001F68308A78FFFF264600F402F25AD24048404AA1 +S315001F68405AD25AD2404C60415AD084F94063AD8027 +S315001F6850F0A309023C032C412A44404C2844404AD9 +S315001F686000644048F400D1800102310410A3806007 +S315001F68700065A580CF830802284460882A44708A51 +S315001F68802C44708CF181F500E7A3644400A80062D4 +S315001F6890020200611C00E084DE82FD0442FEF884D1 +S315001F68A06245C783604502FED58402050105614422 +S315001F68B0CF8360410803284460882A44708A2C4489 +S315001F68C0708CF181F100CE82E981FD02F18102F225 +S315001F68D0FFFF6047E884E8845AD23FB5E084E0842E +S315001F68E0E084E084E084E084B4846145D484C08479 +S315001F68F0E084E084E084E093E0931A609061A1D382 +S315001F6900FFFF00A8FFFF02032E58FFFF1065734409 +S315001F6910D493D4936FF3264604BCA2DB25F0FF67FE +S315001F69202088645F404AB160584EC878FFFF0A4806 +S315001F6930B160584ED878FFFFB160584EF478FFFF0C +S315001F694071F3FFFF00B8CC840103A2DB0B60FA6270 +S315001F6950A2D100604064B084A2DBCFFE1F607E62BE +S315001F69601460A664A2DB03644ADBFFFF04FF0B600F +S315001F6970FA62A2D1FF60DF64A084A2DB26462F58ED +S315001F6980FFFF9BF326466043012A24000FF229F0DE +S315001F69906040102A10006440202B020002BB010039 +S315001F69A0FDB39BFD0C601862A2D100600864B08421 +S315001F69B0A2DBCFFE0F006440202B020004BB0100A8 +S315001F69C0FBB39BFD0C601862A2D100601064B084FB +S315001F69D0A2DBCFFE26462F58FFFFF5F338F204A899 +S315001F69E05DFB02032F58FFFF00F410630864404845 +S315001F69F0BDD2FFFF604705360B00FFB5C783012ACF +S315001F6A00F7004FD25BD2604005370800DF83F500E1 +S315001F6A10FFB56541478A5BD2DF830700007FDC85B0 +S315001F6A20478A60415BD2DB83604701B0FEB5020334 +S315001F6A300264404889F16544E084E084E084FDA156 +S315001F6A40E181E181E185C481D084D1802A072906AD +S315001F6A509C84DC84E884E884E8859AF3C78301264E +S315001F6A606047AB83FCA30200030400F484A3FC006D +S315001F6A70806547D02841A080FEA1160309020C603D +S315001F6A802462A2D100601064B084A2DBCFFE1E0078 +S315001F6A900C602462A2D100600464B084A2DBCFFE26 +S315001F6AA015002841FEA1FFFF09030C602462A2D135 +S315001F6AB000600864B084A2DBCFFE08000C6024626D +S315001F6AC0A2D100600264B084A2DBCFFE0C60186204 +S315001F6AD0A2D100600464B084A2DBCFFE2040202A2E +S315001F6AE031005DF12A4488A0D0802C052B05604318 +S315001F6AF00126150006608065BDD2BDD2D480FFB0C9 +S315001F6B002102BDD21F02603B1D0060471D3A1A00BD +S315001F6B10007FA3D061FB645E604762FB13004FD208 +S315001F6B20066560475BD280A0D4800C020B021D60F5 +S315001F6B3060655BD25BD0D484645E040261FB6444EF +S315001F6B40007E62FB26462F58FFFF0C601862A2D1FB +S315001F6B5000602064B084A2DBCFFE2F58FFFF0C60BD +S315001F6B601862A2D102600064B084A2DBCFFE2F5848 +S315001F6B70FFFF00639BFD146076630064A3DB06A31F +S315001F6B800C605A64BDDBBDDB0664A3DB0C60586278 +S315001F6B90B560A564A2DBD9F114607A62A2D914602C +S315001F6BA082630064A3DB06A30C605E64BDDBBDDBF2 +S315001F6BB00664A3DB0C605C62B560AF64A2DB236076 +S315001F6BC0F062A2D114608662A2D900603C61FE60A9 +S315001F6BD0584D4D78FFFF66446AFBAEF307FA08640B +S315001F6BE028FAC1F319FAF86080640EFA006438FABD +S315001F6BF000603C61FE60584D4D78FFFF66446BFB9D +S315001F6C00AEF307FA086428FAC1F319FA2460806400 +S315001F6C100EFA006438FA0C6024620064A2DB5ADBA9 +S315001F6C200C603862B6601764A2DB2F58FFFF006343 +S315001F6C309BFD0C600C62A2D104600064B084A2DBD1 +S315001F6C40CFFE0C6018620064A2DB5ADBBAFEFE6040 +S315001F6C50FF6520442480006488FB2F58FFFF2360B4 +S315001F6C60F062A2D114608662A2D92360EA62A2D31F +S315001F6C70FFFF00A8FFFF0A02006488FBBAFE0C6034 +S315001F6C8018620064A2DB5ADB2F58FFFFBAFE9BF384 +S315001F6C90006388FD10BC9BFBFE60FF6520442480BB +S315001F6CA00B60F262A2D180600064B084A2DBCFFECB +S315001F6CB00060646314603E64A0DD0C6018620064AB +S315001F6CC0A2DB0C601A6201600464A2DBB6606C640E +S315001F6CD05ADBCFFE2F58FFFF0C601862A2D101604E +S315001F6CE00064A0809C840303A084A2DBA000314023 +S315001F6CF0042AE300204052230E000C601862006431 +S315001F6D00A2DB0C601A6281600064A2DBB6606C6451 +S315001F6D105ADBCFFEDF000C6018620064A2DB016045 +S315001F6D200065204434806BF5C1F119F8FFFF85F12A +S315001F6D302BF831F8FFFF86F12CF832F8FFFF87F1A9 +S315001F6D402DF833F8FFFFDAF12EF8DBF1FFFF2FF8EE +S315001F6D50DCF130F81160486429FA00642AFA22FA35 +S315001F6D601F604E621F600264A2DB66445ADB026428 +S315001F6D705ADBFFFF2BFFC1FE0C601A620060016425 +S315001F6D80A2DBB660C7645ADBCFFE2F58FFFF6BF539 +S315001F6D9022F2FFFF00B8FFFF0303B6604678FFFF2E +S315001F6DA0106788FB03649CFBFE60FF6520442480FC +S315001F6DB00B60F262A2D180600064B084A2DBCFFEBA +S315001F6DC00C6018620064A2DB0C601A6281600064AA +S315001F6DD0A2DBB660EE645ADBCFFE0D000C601862B4 +S315001F6DE0A2D101600064A0809C840503A084A2DB5D +S315001F6DF0B6601778FFFF46600065204192F3A580B5 +S315001F6E0001B0010206000C6018620064A2DB2F5855 +S315001F6E10FFFF14603E65A5D3016300A890FD2E02F7 +S315001F6E2000606464A5DBFFFF6BF5C1F119F8FFFF76 +S315001F6E3085F12BF831F8FFFF86F12CF832F8FFFFAA +S315001F6E4087F12DF833F8FFFFDAF12EF8DBF1FFFF9C +S315001F6E502FF8DCF130F81160486429FA00642AFA29 +S315001F6E6022FA1F604E621F600264A2DB66445ADB71 +S315001F6E7002645ADBFFFF2BFFC1FE08009BF3324063 +S315001F6E8002260400604040260100DAFEC1FE0C60A7 +S315001F6E9018620064A2DB0C601A6201608264A2DBC6 +S315001F6EA0B76056645ADBCFFE2F58FFFF0C6018627F +S315001F6EB0A2D101600064A0809C840503A084A2DB8C +S315001F6EC0B6601778FFFF00600264A0809C840603EB +S315001F6ED0A084A2DBBAFEB960A078FFFF026490FB14 +S315001F6EE00160006520443480BAFEC1FE0C60186242 +S315001F6EF00064A2DB0C6024620064A2DB0C601A62D1 +S315001F6F0001604664A2DBB76089645ADBCFFE2F5847 +S315001F6F10FFFF0C601862A2D100600464A0809C84ED +S315001F6F204103A084A2DB0C602462A2D10060086426 +S315001F6F30A0809C840503A084A2DBB660D278FFFFE5 +S315001F6F4000600264A0809C840F03A084A2DB2360E0 +S315001F6F50EC62A2D19BF30061D180F7B40302B66045 +S315001F6F60D278FFFF9BFB410000601064A0809C84C9 +S315001F6F700F03A084A2DB2360EC62A2D19BF3006106 +S315001F6F80D18008BC0302B860AD78FFFF9BFB2D00C4 +S315001F6F9000600464A0809C840503A084A2DBB86003 +S315001F6FA0AD78FFFF0C601862A2D100604064A0801C +S315001F6FB09C840503A084A2DBB660D278FFFF006025 +S315001F6FC00264A0809C840503A084A2DBB960A0781C +S315001F6FD0FFFF01600064A0809C840503A084A2DBE0 +S315001F6FE0B6601778FFFF2F58FFFF02639BF390FDD4 +S315001F6FF001BCC1FE9BFBD9F114607A62A2D90C6059 +S315001F700018620064A2DB0C6024620064A2DB0C60C1 +S315001F70101A6201603464A2DBB8601B645ADBCFFEC0 +S315001F70201F607E6214607664A2DB02644ADBFFFF88 +S315001F703004FF2F58FFFF0C601862A2D10060106476 +S315001F7040A0809C841C03A084A2DB9BF3FFFF6040EF +S315001F7050042A0100E5001F607E6214607664A2DBCD +S315001F706003644ADBFFFF04FF9BF3FFFF08B0FFFF2C +S315001F70700302B860A578FFFFB860AD78FFFF006018 +S315001F70800464A0809C843C03A084A2DB0C60246261 +S315001F7090A2D100601064A0809C840803A084A2DB98 +S315001F70A09BF3FFFF08BC9BFB2F58FFFF006002648A +S315001F70B0A0809C840303A084A2DBB200006004644A +S315001F70C0A0809C840C03A084A2DB1F607E621460D8 +S315001F70D07664A2DB03644ADBFFFF04FF3E00006009 +S315001F70E00864A0809C840C03A084A2DB1F607E62C0 +S315001F70F014607664A2DB03644ADBFFFF04FF2600ED +S315001F71000C601862A2D100602064A0809C840803D2 +S315001F7110A084A2DB9BF3FFFF6040082A17001D0017 +S315001F712001600064A0809C840E03A084A2DB1F6004 +S315001F71307E6214607664A2DB03644ADBFFFF04FFF2 +S315001F7140B6601778FFFF2F58FFFF00009BF3FFFF66 +S315001F7150FEB49BFBB660D278FFFF2360EA62A2D320 +S315001F7160FFFF01A8FFFF0302B960A978FFFF9BF38A +S315001F7170016390FD21BC9BFB6AF585F1FFFF2BF890 +S315001F718086F12CF8FFFF87F12DF889F1C067B084CF +S315001F71902AFAC1F119F8FFFFDAF12EF8DBF1FFFF2A +S315001F71A02FF8DCF130F81060A46429FA1F604E62D4 +S315001F71B01F600264A2DB66445ADB02645ADBFFFFD0 +S315001F71C02BFFC1FE14607A6200605064A2DB1F6051 +S315001F71D07E6214607664A2DB02644ADBFFFF04FF53 +S315001F71E00C6018620064A2DB0C6024620064A2DBE0 +S315001F71F00C601A6201602C64A2DBB96003645ADB5F +S315001F7200CFFE2F58FFFF0C601862A2D101600064E9 +S315001F7210A0809C840E03A084A2DB1F607E62146084 +S315001F72207664A2DB03644ADBFFFF04FFB6601778B0 +S315001F7230FFFF0C602462A2D100600464A0809C84BE +S315001F72400303A084A2DB89000C601862A2D1006030 +S315001F72500864A0809C840D03A084A2DB9BF3FFFF20 +S315001F726002B0FFFF0302B9609078FFFFB860AD78E8 +S315001F7270FFFF0C602462A2D100600864A0809C847A +S315001F72800503A084A2DBB9609078FFFF006002644B +S315001F7290A0809C841903A084A2DB1F607E621460F9 +S315001F72A07664A2DB03644ADBFFFF04FF2360EC6204 +S315001F72B0A2D39BF300A8F7B40302B9609078FFFF2F +S315001F72C09BFBB760F578FFFF00601064A0809C846D +S315001F72D01903A084A2DB1F607E6214607664A2DBA2 +S315001F72E003644ADBFFFF04FF2360EC62A2D39BF318 +S315001F72F000A808BC0302B860AD78FFFF9BFBB76010 +S315001F7300F578FFFF0C601862A2D100602064A08090 +S315001F73109C840303A084A2DB02002F58FFFF0000FA +S315001F73201F607E6214607664A2DB03644ADBFFFF84 +S315001F733004FF9BF3FFFFFEB49BFBB660D278FFFFF3 +S315001F73409BF3016390FD01BC9BFB006488FBC1FEA0 +S315001F73502D009BF3016390FD01BC9BFB006488FB22 +S315001F73606AF585F1FFFF2BF886F12CF8FFFF87F1F1 +S315001F73702DF889F1C067B0842AFAC1F119F8FFFF09 +S315001F7380DAF12EF8DBF1FFFF2FF8DCF130F80060A1 +S315001F7390A46429FA1F604E621F600264A2DB664462 +S315001F73A05ADB02645ADBFFFF2BFFC1FE1F607E62A2 +S315001F73B014608264A2DB02644ADBFFFF04FF0C60D9 +S315001F73C018620064A2DB0C6024620064A2DB0C60FE +S315001F73D01A6203600E64A2DBB960F2645ADBCFFE49 +S315001F73E02F58FFFF0C601862A2D100600464A080B2 +S315001F73F09C840203A084A2DB01600064A0809C849D +S315001F74000E03A084A2DB1F607E6214608264A2DB6F +S315001F741003644ADBFFFF04FFB6601778FFFF0C60AB +S315001F74202462A2D100600464A0809C840303A0840C +S315001F7430A2DB8F000C601862A2D100600A64A080D4 +S315001F74409C840303A084A2DBB1000C602462A2D13A +S315001F745000601264A0809C840303A084A2DBA600A4 +S315001F74600C601862A2D102600064A0809C84B803DD +S315001F7470A084A2DB106788FB0C6018620064A2DB85 +S315001F74800C6024620064A2DB0C601A620060016457 +S315001F7490A2DBBA607B645ADBCFFE6BF5C1F119F82C +S315001F74A0FFFF85F12BF831F8FFFF86F12CF832F834 +S315001F74B0FFFF87F12DF833F8FFFFDAF12EF8DBF126 +S315001F74C0FFFF2FF8DCF130F81160486429FA0064D9 +S315001F74D02AFA22FA1F604E621F600264A2DB66440C +S315001F74E05ADB02645ADBFFFF2BFF9BF3C1FEFEB480 +S315001F74F09BFB2F58FFFF6BF522F29CF300A8CC8451 +S315001F750005039CFB0303B960A078FFFFB660D27822 +S315001F7510FFFF0060B361FE60584D4D78FFFF664464 +S315001F752063FB806429FAD1F119F8086428FA006010 +S315001F753080640EFAAEF107F8FF60FF642BFA2CFA8F +S315001F75402DFA0C603C62BB606E64A2DB0C602C6281 +S315001F7550BC600D64A2DB2F58FFFF63F5DAF12EF82E +S315001F7560FFFFDBF12FF8DCF1FFFF30F885F131F873 +S315001F7570FFFF86F132F887F1FFFF33F8186090633B +S315001F758084F10064645EBDDB6447007FBDDB02647B +S315001F75903240082610BCBDDB0064BDDB0064BDDBCA +S315001F75A024601662A2D3FFFF00B82560F8620203AB +S315001F75B02360C662A2D3DA85BDDB6041A5D1DA8519 +S315001F75C06444007FCD81BDDB05036447007FCD8109 +S315001F75D0BDDBF4020164BDDB2560E462A2D3DA855C +S315001F75E0BDDB6041A5D1DA856444007FCD81BDDB5B +S315001F75F005036447007FCD81BDDBF4020364BDDB59 +S315001F760083F10164BDDBBDD90664BDDB0264BDDB4E +S315001F76100064BDDBBDDB18609065D784E8846041DC +S315001F762008A438FA65430C6500F4BDD3BDD1604785 +S315001F7630B087A5DAC981DA85F8071860906384F1E7 +S315001F76400064645EBDDB6447007FBDDB0264BDDB97 +S315001F76500064BDDB0064BDDB2560F862A2D3DA855A +S315001F7660BDDB6041A5D1DA856444007FCD81BDDBDA +S315001F767005036447007FCD81BDDBF4020164BDDBDA +S315001F76802560E462A2D3DA85BDDB6041A5D1DA8528 +S315001F76906444007FCD81BDDB05036447007FCD8138 +S315001F76A0BDDBF4020364BDDB0164BDDB83F1BDD921 +S315001F76B08064A3DB18609065D784E88499FB6041DA +S315001F76C065431560BE6500F4BDD3BDD16047B08765 +S315001F76D0A5DBC981DA85F8072F58FFFF0B60F46217 +S315001F76E0A2D100600264B084A2DBCFFE2F58FFFF39 +S315001F76F0F5F39BFEFDA02504240200F402F2FFFF12 +S315001F77006047003A1E00604300361E00E0A0DA857F +S315001F771018072560F861A1D1FFFFD380CB83110223 +S315001F7720070E59D3A5D0DA85D080FFFF0A02F91FAD +S315001F7730634000361B00A5D059D3FFFF9080FF2260 +S315001F77401500BC600B78FFFF24601662A2D3FFFFF3 +S315001F77506040012A0B0024601862A2D3FFFF60401D +S315001F7760012AEF00006004652044348026462EF26D +S315001F77702BFA2FF2FFFF2CFA30F22DFAFFFFDAF168 +S315001F77802EF8DBF1FFFF2FF8DCF130F8FFFF85F154 +S315001F779031F886F1FFFF32F887F133F8506393F320 +S315001F77A02040042A99F329FC08A42040202608A477 +S315001F77B038FA6041D1F319FA0060086428FAAEF36B +S315001F77C007FA2040042A01000B001560BC6199F3DB +S315001F77D000F4CC84A8830A6459D158D8FD1FDA83D4 +S315001F77E0FF60EF6307F03244A3836040082610BB97 +S315001F77F007FCFF60FB65204424801F604E621F60EC +S315001F78000264A2DB26445ADB02645ADBFFFF2BFF0E +S315001F7810C1FE006646462F58FFFF0B60F4620064E8 +S315001F7820A2DB5ADB006498FB2F58FFFF0E5732402E +S315001F783040262700454800601061FE60584D4D7870 +S315001F7840FFFF1F03F260026423FA006046612844AB +S315001F785059DA03643843BDD1CC8459D8FC02394464 +S315001F786059DA066422FA1F604E621F603E64A2DB6D +S315001F787066445ADB02645ADBFFFF2BFF086545543B +S315001F78803BFF3758FFFF0E57324040261D00454825 +S315001F789000600661FE60584D4D78FFFF15030264B8 +S315001F78A022FAF26000645ADA28445ADA08651F6021 +S315001F78B04E621F603E64A2DB66445ADB02645ADBDB +S315001F78C0FFFF2BFF45543BFF3758FFFFA2FF3240F8 +S315001F78D040263E00A1F36743DC84CC84390360460F +S315001F78E00A02A1FD00604661FE60584D4D78FFFFFC +S315001F78F06644A1FB2E03464B23605E61186422FA81 +S315001F7900F160006423FA4865A2FF2C63006459D115 +S315001F7910A2DBA5D8DA85FB1F0863624459D158D864 +S315001F7920FD1F0863026400F459D158D8FD1F1F605C +S315001F79304E621F603E64A2DB2B445ADB02645ADB95 +S315001F7940FFFF2BFF086545543BFFA6FE0064A1FB06 +S315001F7950A3FF8E60F078FFFFA6FEB805A7FE1505EC +S315001F7960A5FE0304BD606C78FFFFA4FE03058E60B1 +S315001F7970F078FFFF0C600062A2D100608064B084C3 +S315001F7980A2DBCFFE8E60F078FFFF36451B602464B6 +S315001F799044D7FFFFFFFFA3F3FFFF01B000642603D9 +S315001F79A0A3FB3144E8B440510C602A62A2D10060A7 +S315001F79B02064B084A2DBCFFE4FF301636040FF2635 +S315001F79C04FFD8160584E2578FFFF18603E62186094 +S315001F79D04064A2DB00644ADB0160FE6316603A6105 +S315001F79E0006459DBFE1F8E60F078FFFF7500246070 +S315001F79F02C63BDD3BDD1BDD1B084B084FFFF0502BA +S315001F7A0090FB3144FEB44051670027F3A3F1604752 +S315001F7A10644107B107B40824674C56FB0161030391 +S315001F7A20CC84E181FD02A180B1835602A3FD1F60B4 +S315001F7A303862A2D3FFFF00A86046465E314401BCF0 +S315001F7A404051F0F3D1FE03A80163060254FD026301 +S315001F7A5014600064F4FB0C0002A8016303030A60B0 +S315001F7A6000640300026314600064F4FB006454FBAB +S315001F7A7051FDAEF1126141D10B60C4652460C26233 +S315001F7A80A2D3FFFFFEA003A818067DF108026444D7 +S315001F7A900CB404A80F030103C88444D31200644422 +S315001F7AA030B410A8070303030A6444D30A0008640A +S315001F7AB044D30700016444D30400E884E08444D31C +S315001F7AC00000A1DBEDE20F4E9760584FE578FFFFF0 +S315001F7AD00E4F8E60F078FFFFD7FE8E60F078FFFFA7 +S315001F7AE01F602062A2D3FFFF00A860460EF24E035E +S315001F7AF06040F0373B00FF373000FD372600F83770 +S315001F7B000A006047FFB50B60F46246D1006001644E +S315001F7B10B084A2DBCFFE1F604E620064A2DB664408 +S315001F7B205ADB02645ADBFFFF2BFFDA0006B40EFA9C +S315001F7B301F604E621F602664A2DB66445ADB026426 +S315001F7B405ADBFFFF2BFFD3FECB0022F00061B18073 +S315001F7B5060400426EB020226E903A2FF02F0096039 +S315001F7B603C64D080B5F30202CC84B5FB1F604E6423 +S315001F7B70404BD660584D5878FFFFB200ACFE090542 +S315001F7B80ADFE1005AEFEAC05AFFE3A058E60F07871 +S315001F7B90FFFF0B60F262A2D120600064B084A2DBFB +S315001F7BA0CFFEF4000C603C650A610700A2DD584F4A +S315001F7BB06458FFFF00B9FFFF08030063A5D15AD31E +S315001F7BC0DA8500A8CD81F202F802E0000B60F062B0 +S315001F7BD00C602265BD60FE6300645ADBD680FFFF22 +S315001F7BE004035ADB5ADB5ADDF9000C603A65006460 +S315001F7BF05ADBD680FFFF02035ADDFB002F58FFFF1B +S315001F7C000B60F46440410B60F263A3D10064D08023 +S315001F7C1008610803BDDBA3D3FFFFB084CD81A3DBBF +S315001F7C2006A3F9020C602A63A3D10064D080096100 +S315001F7C301603BDDB6444FEA302A3CD81E884E303E0 +S315001F7C400205E103F9004042A3D3434400A8414380 +S315001F7C500203584F6058224423412443ED00214319 +S315001F7C600C602465D780BDD1BDD303028E60F0782A +S315001F7C70FFFFA084BDD14341F503BE600364645872 +S315001F7C80404F29F08360FF656447FFFF032A010009 +S315001F7C901C00032603AC6047A48429FA2EF22BFA94 +S315001F7CA064412FF22CFA30F2FFFF2DFADAF32EFA87 +S315001F7CB06043DBF32FFAFFFFDCF130F83240042A72 +S315001F7CC0280031FC32FA33F824006047A48429FACD +S315001F7CD064412EF22BFA2FF2FFFF2CFA30F22DFA07 +S315001F7CE0FFFFDAF32EFADBF3FFFF2FFADCF130F892 +S315001F7CF0FFFF35F231FA36F2FFFF32FA37F233FA67 +S315001F7D00FFFFDAF335FADBF3FFFF36FADCF137F85C +S315001F7D10FFFF20F200F013FA644606F2FFFF6040F1 +S315001F7D20802B0000264638F04264D080FFFF0104F6 +S315001F7D3038FA07F20065D480AEF1010207F820F287 +S315001F7D4013FAFFFF25F226F0604700F418FA64477E +S315001F7D5019FA61441AFA016706FA10612360F26480 +S315001F7D60106358D1CD81BDD8FC02C0F1F0F1645E1D +S315001F7D70645F3663BDDA2360EC62A2D3FFFFE08443 +S315001F7D80E084E0844AD360456040013603640236CE +S315001F7D900164B48406A2A2D1BDDA6447BDDAEDF34D +S315001F7DA0EEF16047BDDA6447E4F1BDDA6444BDDA3B +S315001F7DB0264622F044F36440102A050003B7E084E8 +S315001F7DC0E084E08410BC08BC28FA1F604E621F6066 +S315001F7DD00E64A2DB26445ADB02645ADBFFFF2BFF2D +S315001F7DE0C8FE006646462F58FFFF2360EA62A2D3ED +S315001F7DF088F102A829F20302B08429FA08000C6050 +S315001F7E001862A2D100600264B084A2DBCFFE1F609D +S315001F7E104E621E60FC64A2DB66445ADB02645ADBB8 +S315001F7E20FFFF2BFFC1FE1F600E62A2D3FFFF00A83C +S315001F7E306046DB028E60F078FFFF00604861FE60DF +S315001F7E40584D4D78FFFF664464FB086428FAFF60AF +S315001F7E50FF642BFA2CFA2DFAFFFF31FA32FA33FAA6 +S315001F7E6012608064AEF10EFA07F814605263006464 +S315001F7E70A3DB06A30C604264BDDB0464BDDB0664A2 +S315001F7E80A3DB0C604062C2604264A2DB14605E63C7 +S315001F7E900064A3DB06A30C604664BDDB0864BDDB80 +S315001F7EA00664A3DB0C604462C2604C64A2DB0C60F8 +S315001F7EB03262C2602C64A2DB2F58FFFF64F5DAF131 +S315001F7EC02EF8FFFFDBF12FF8DCF1FFFF30F8D1F1C1 +S315001F7ED019F830643B425ADB0C6006620064A2DB71 +S315001F7EE000638EFD16602A65A5DD136082638CFD17 +S315001F7EF08DFD2040102B0900006000651A609A61F5 +S315001F7F00A1D3FFFFD480FFFF570364F5406429FA0E +S315001F7F105CF300F46043BDD104656447A5DA644190 +S315001F7F20DD81E98162440403BDD1CD8158D8FC02AD +S315001F7F30588B2560E463A3D12B44C88464456441F0 +S315001F7F4003A1E981414CBDD1CD8158D8FC022BD26A +S315001F7F502B436047017E5CF1A3DAA4D3CB83448B0A +S315001F7F60F8842C410C04BED2FFFF6047BEDA007EA8 +S315001F7F70A3D26045007FB484CD81BDDAF40264F5D7 +S315001F7F802B4404A438FA83F382FB1A609C610164B4 +S315001F7F905CF1A1DB83FBFFFFA4D3046500A859F3A3 +S315001F7FA001030C65F3B4B48402B059FB2E0360477A +S315001F7FB00FB483FB01032900C060EB78FFFF59F163 +S315001F7FC083F364400226F800204010270700F3A021 +S315001F7FD004A40104F1A41036EF001600404B1A60EA +S315001F7FE09A61A1D3FFFF60451A609C61A1D32B4103 +S315001F7FF060404037E100E084A4835D8BFA03604351 +S315001F80001A609C61A1DD2B4483FB0C60626383F3C2 +S315001F8010FFFFE08547D359F101B006B0D103644095 +S315001F802003260100CD0331643B425ADB0C60066216 +S315001F80300064A2DBDEFE0E040C6008624060006472 +S315001F8040A2DBC06013645ADBCFFE32643B425ADBAD +S315001F80502F58FFFF83F11F606E62A2D91E644ADB91 +S315001F8060FFFF2DFF0C60086220600064A2DBC0606A +S315001F80703D645ADBCFFE2F58FFFFBEFE0B60F26238 +S315001F8080A2D140600064B084A2DBCFFE0C60066202 +S315001F80900064A2DB64F51F604E621F600264A2DBF0 +S315001F80A066445ADB02645ADBFFFF2BFF006457FB53 +S315001F80B00C60086200600164A2DBC06067645ADB63 +S315001F80C0CFFEC1FE33643B425ADB2F58FFFF346499 +S315001F80D03B425ADB0C6006620064A2DBCBF11460E4 +S315001F80E05662A2D91F607E6214605264A2DB0264CC +S315001F80F04ADBFFFF04FFCCF114606262A2D91F6046 +S315001F81007C62A2D3FFFF00A8FFFFFB021F607E62F7 +S315001F811014605E64A2DB02644ADBFFFF04FF0C608F +S315001F8120086200600864A2DBC0609A645ADBCFFE57 +S315001F81302F58FFFF57F10C6006620064A2DB6440F4 +S315001F8140FF260300BF60DF78FFFF020A006457FBAC +S315001F8150CDF114606262A2D90C60086200600C64E3 +S315001F8160A2DBC060C0645ADBCFFE1F607E62146054 +S315001F81705E64A2DB02644ADBFFFF04FF2F58FFFF8A +S315001F81800C600662A2D100600464A0809C840C036C +S315001F8190A084A2DB1F607E6214605E64A2DB0364A0 +S315001F81A04ADBFFFF04FF1400FF60F764A084A2DB15 +S315001F81B057F3DB0A00A00064020357FBD6001F60BB +S315001F81C07E6214605264A2DB03644ADBFFFF04FF76 +S315001F81D0BF60DF78FFFF35643B425ADB1F607E625C +S315001F81E014605264A2DB03644ADBFFFF04FF59F3EA +S315001F81F0FFFFF3B459FB0C6006620064A2DBDEFED0 +S315001F82000E040C60086240600064A2DBC060FB6461 +S315001F82105ADBCFFE32643B425ADB2F58FFFF82F1F7 +S315001F822083F91F606E62A2D91E644ADBFFFF2DFF12 +S315001F82300C60086220600064A2DBC16023645ADB05 +S315001F8240CFFE2F58FFFFBEFE0B60F262A2D1406029 +S315001F82500064B084A2DBCFFE146002631C6100645D +S315001F8260CD81BDDBFD020C6082618EF36143C8A523 +S315001F827047D10F04BED51360FE63C383C383C38375 +S315001F828043D3BED1DC84A3DB6644C084BEDB654416 +S315001F8290ED00146002630E61414BBDD3BDD100BD1D +S315001F82A06441190301A8614402A815030202E98467 +S315001F82B012006547604561440961CD81E084FF2353 +S315001F82C0FC000224C4840228D484CD81010E01BC83 +S315001F82D00203E084F600007F2B414D8BBFDBDD02DE +S315001F82E00C6082618EF36143C8A547D10A04DA8602 +S315001F82F014600063C383C383C38343D1A6D9654474 +S315001F8300F20036643B425ADB59F38EF1F3B459FB44 +S315001F83100C608263C385454A136082658DF3454CA5 +S315001F832040482040202A02000065454B2A45D78039 +S315001F83300265230547D1026547D30A65D08147D316 +S315001F834001050061F2A301B0614411032040202AF8 +S315001F83500800C460584E7478FFFF2B4402A4404B9C +S315001F836061442C42A2DB5ADD5A8C38A3DF00284217 +S315001F83704ADD4ADB424838A3D90028448CFB8CF1DE +S315001F83801360826344482845D780A3D11505046529 +S315001F839046D32845D680D080020404A3F500F706ED +S315001F83A06246A2D9A3DB5BD366425AD1A2DBA3D90D +S315001F83B0FEA3A3D16642EB008CF38DF160434448C4 +S315001F83C02845D780A3D11505046546D32845D680F1 +S315001F83D0D080020404A3F500F7066246A2D9A3DBE8 +S315001F83E05BD366425AD1A2DBA3D9FEA3A3D16642B1 +S315001F83F0EB000B60F262A2D110600064B084A2DBB6 +S315001F8400CFFE2040802B1E0000600461FE60584D89 +S315001F84104D78FFFF016422FAF160026423FA1F60A0 +S315001F84204E621F603E64A2DB66445ADB02645ADB5F +S315001F8430FFFF2BFF086545543BFF20447F60FF6508 +S315001F8440204424800C6006620064A2DB5ADB3E6473 +S315001F84503B425ADB2F58FFFF3F643B425ADB1F60EC +S315001F84607E6214605264A2DB03644ADBFFFF04FFD3 +S315001F8470006459FB0C6006620064A2DB5ADBBEFE79 +S315001F84802F58FFFF0C600662A2D100600464B084FF +S315001F8490A2DBCFFE2F58FFFF0C600662A2D1006041 +S315001F84A00864B084A2DBCFFE2F58FFFFC460167886 +S315001F84B0FFFF3C643B425ADB2040902B0100F60035 +S315001F84C059F38EF104B007600064D080240323069D +S315001F84D026468EF10C608263C38383F325F0BDDBD2 +S315001F84E06444007FBDDB6447007FBDDB31F0BDD92F +S315001F84F0FFFF32F0BDD933F0FFFFBDD900F406F000 +S315001F8500FFFFBDD907F0BDD9006408F0A3DB6447A0 +S315001F8510604500370300C4603278FFFFBDDBE0A073 +S315001F8520DC84F90700B8E881F603106458D0CD81C2 +S315001F8530BDD9FC02D884404B18608E6184630064E9 +S315001F854059DBFE1F2B4318609064404B3E6165400C +S315001F8550012ABDD0FFFF6444007F2BDB5A8B644783 +S315001F8560007F2BDBCD815A8BF40218609063654028 +S315001F8570012602A3BDD3BDD101A8C383CC02C383E9 +S315001F8580BDD3BDD103A8BDD183F3C502D0808EF361 +S315001F8590C202204710B0FFFF0603C360E778FFFF44 +S315001F85A0C4603278FFFF14604A617F64A1DB59DB28 +S315001F85B059DB0C60B4618EF17F6441DB0A61414B6C +S315001F85C0BDD3BDD180A8DDA80C03310300A864422A +S315001F85D00503E2852B41CD81C783F107C360D77899 +S315001F85E0FFFFBDD3606500A0BDD31E02D4801D65ED +S315001F85F0BDD31A02D480BDD116602A65A5D3140235 +S315001F860002A4A5DBFEA51460BE6444D9BDD11460C7 +S315001F8610FE6145D90C6084658EF3FFFF44D3FFFFCF +S315001F8620D080FFFF0105A2D92B41CD81C800634130 +S315001F8630BDD3BDD300A8BDD350A808020702BDD322 +S315001F8640F2A801A8030202026143070061436442C4 +S315001F8650E285C783C360D278FFFF24601A64A0D364 +S315001F8660FFFF604000361300013611006440063AD2 +S315001F867011000160E464A0D38EF16040013A9000BE +S315001F86800C60B461026441DB59DB016459DBC360D2 +S315001F8690D278FFFF146050616444E0846345C4844C +S315001F86A0A1DB79F924601A64A0D312A360400236B5 +S315001F86B0050003360300C4603278FFFFBDD1FFFFFC +S315001F86C0644002361400644001360A006440053ACD +S315001F86D05C002560DC62A2D3FFFF6040022A5500C2 +S315001F86E024601A64A0D3FFFF6040033A4E00146053 +S315001F86F04A610C60B4658EF3A1D944D90160E46167 +S315001F870079F1A1D364400A3A0D006040013A3D0059 +S315001F87108EF10C60B661026441DB016459DBC360F4 +S315001F8720D278FFFFA3D37F6560410AA3A3D1FFFFC2 +S315001F8730644002366445CD8164400036030008A3B9 +S315001F8740F50207007F64D480614400B801026445C6 +S315001F8750F60065407F3619000C60B6618EF16544E0 +S315001F876041DB14605061A1D1FAA3D3800160E46498 +S315001F87700F05A0D1A3D30AA36041A3D36445D0801C +S315001F8780CD810B036F0308A3F800C4603278FFFF87 +S315001F8790A0D301656040013A65000C60B8618EF197 +S315001F87A0654441DB2B41CD81C260DF78FFFF14603A +S315001F87B04A65A5D100607F61D18024601A64A0D369 +S315001F87C00602604000360300013601004B008EF39F +S315001F87D0FFFF38A48EFB3D643B425ADB8DF383F1CA +S315001F87E004A48DFB0C605E6359F3644108B0E185F8 +S315001F87F01C03FEA147D30206FBB4A3DBDD815BD3BB +S315001F88000C240200FBB4A3DB5BD3DD8102BCA3DB1C +S315001F88100E65DD81D5805BD30805FBB4A3DBDD8147 +S315001F8820D5805BD30203FBB4A3DB1C0038F2FFFF2A +S315001F8830FFA43C65C484E88422FAF160026423FA2B +S315001F88401F604E621F603E64A2DB26445ADB026431 +S315001F88505ADBFFFF2BFF086545543BFF0066464664 +S315001F88602F58FFFF26462F58FFFF166316602062FC +S315001F887000645ADBFE1F61FB62FB166026630264FF +S315001F8880A3DB1460BE623E6300645ADBFE1F2E58D4 +S315001F8890FFFF16602C62A2D30063F8A001A4030396 +S315001F88A0A2DB2E58FFFFA2DD16602E62A2D1A2DD2B +S315001F88B05AD3FFFFA2DDC08161440224FFFFE98175 +S315001F88C0E981E981E9815AD3E981E883EB83EB8367 +S315001F88D0EB83EB85D485C583A2DD166022626347D1 +S315001F88E0007FA2DB2E58FFFF16603465A5DD1560DD +S315001F88F03E6561442B4145DB604115607E650AA3D9 +S315001F8900A3D12B4444D916603465A5D3FFFF60431A +S315001F8910614400A0FFFF410306A3BDD185F386F185 +S315001F8920D080BDD3170287F3D080A3D11302D08086 +S315001F8930FFFF100261431460BE652B4444D11660CD +S315001F89402265A5D16444D0811660266501050061A4 +S315001F8950A5D315001460BE652B4444D1166022654D +S315001F89606443A5D164656344C084D480FFFF0206B7 +S315001F8970006113006143D08116602665A5D3E98186 +S315001F8980E981CC84CC8402030203E981E981E98170 +S315001F8990E985D78460410105006116603465A5D35A +S315001F89A0FFFF60432E58FFFF16602865A5D161F3B0 +S315001F89B06441CD81CD8102030203E884E884E88403 +S315001F89C0E885294454892E58FFFFDCF3FFFF0FB4B7 +S315001F89D001A46047E084E084E084E084E0851460BD +S315001F89E0B6636544BDDB0C606264BDDB0264BDDB40 +S315001F89F00664A3DB1F607E621460B264A2DB02649E +S315001F8A004ADBFFFF04FF2E58FFFF1460B663EA60C0 +S315001F8A106064BDDB0C606264BDDB0264BDDB0664A3 +S315001F8A20A3DB1F607E621460B264A2DB02644ADBB2 +S315001F8A30FFFF04FF2E58FFFF1663166020620064B7 +S315001F8A405ADBFE1F61FB62FB166026630264A3DB13 +S315001F8A501460BE623E6300645ADBFE1F0C606062D8 +S315001F8A60C6605D64A2DB0C603A62C6604964A2DB25 +S315001F8A700C601E620064A2DB0C602062006004644E +S315001F8A80A2DBC56047645ADBCFFE2F58FFFF204489 +S315001F8A9040260300C6602078FFFF204052230700B0 +S315001F8AA060F3FFFF01A460FBC6600D78FFFF406007 +S315001F8AB0006520443480166026650264A5DB1460B9 +S315001F8AC0BC627E6300645ADBFE1F16602A62A2DD4B +S315001F8AD090F35EFB026490FBFFFFC1FE90F3FFFF66 +S315001F8AE000A8FFFF0B030C60206280600064A2DBFE +S315001F8AF0C5606E645ADBCFFE2F58FFFF046459FB17 +S315001F8B00256092645CFB0F4EBF60584F5E78FFFF77 +S315001F8B100E4F0C601E620064A2DB0C6020621060A8 +S315001F8B200064A2DBC56098645ADBCFFE2F58FFFF97 +S315001F8B305EF390FBFFFFCAFEC1FE166036626644F7 +S315001F8B40A2DB5ADD61445ADB6CF5D1F1FFFF19F840 +S315001F8B50F86080640EFAAEF107F8016060672BFAC1 +S315001F8B601D642CFA01642DFADAF12EF8FFFFDBF1F2 +S315001F8B702FF8086429FADCF130F8FFFF85F131F888 +S315001F8B8086F1FFFF32F887F133F8406338FC00F4B3 +S315001F8B900262CB8300645ADAFE1F16602265A5D3D4 +S315001F8BA002FA13608464A0D10A6141D303FA0661F5 +S315001F8BB00663006515607E6444D159D815603E640E +S315001F8BC044D159D81460BE6444D159D81460FE6488 +S315001F8BD044D159D8654402A46045EC1F6CF51F604B +S315001F8BE04E621E60FC64A2DB66445ADB02645ADBDB +S315001F8BF0FFFF2BFF16603662A2D55AD35AD36043A6 +S315001F8C0060410C600C62A2D100602064B084A2DBBC +S315001F8C10CFFEBF60FF6520442480C560584E05788F +S315001F8C20FFFF0C601E620064A2DB0C6020621060F6 +S315001F8C300264A2DBC56047645ADBCFFE2F58FFFFD5 +S315001F8C40166038636644A3DB00604061FE60584DC2 +S315001F8C504D78FFFF66446CFB16603863A3D1006432 +S315001F8C606446A3DB0060406520443480C460584ED0 +S315001F8C70E578FFFF0C601E620064A2DB0C602062B9 +S315001F8C8000600264A2DBC56047645ADBCFFE2F5823 +S315001F8C90FFFF1F607E621460B264A2DB03644ADBBF +S315001F8CA0FFFF04FF0C601E620064A2DB5ADBFF603D +S315001F8CB09F65204424802F58FFFF0C601E62A2D19F +S315001F8CC000600264B084A2DBCFFE2F58FFFFAAFF0D +S315001F8CD034F399FF405098FF0AF140763F60FF64D6 +S315001F8CE0A0830AFD6444802B1A0050FE01F1FE602A +S315001F8CF00164D08002F1DC602364D08003F1BA6086 +S315001F8D004564D080634701010A00C0BF0AFB007695 +S315001F8D1063402027040033F399FF405098FF190042 +S315001F8D20ABFF1700A8FF204402B000F1030301BCEC +S315001F8D3040400F0027F902BC404001F128F902F11B +S315001F8D40D4FE29F903F12AF9AEFFFFFFAEFFFFFF9D +S315001F8D50AEFFA1FFFFFFD23F754402B001B008026C +S315001F8D60E10204B008B0B302DB024026A7FFF10000 +S315001F8D70A9FF77446057404A012A1E00244400A8D1 +S315001F8D80244609F2190300A840440C03604610FB51 +S315001F8D90664720BF3B4204A2A2DB0EF2017510BC40 +S315001F8DA00EFA0AF408F22D45D4800EF20203D2FE03 +S315001F8DB0030001BC0EFAD0FE2A44082A1B002344D6 +S315001F8DC000A80064170340431F602C62A2D5010050 +S315001F8DD009F40EF2664100B908B00C03F9034643C5 +S315001F8DE018AC0EFA234780BF3B4204A2A2DB6643A0 +S315001F8DF011FD08752A4406223900224400A8604640 +S315001F8E000EF2340310B001BC0302006440422E0070 +S315001F8E100EFAD0FE1F6026644047584F1C0046427C +S315001F8E202502224740BF3B4204A2A2DB22F2664331 +S315001F8E3000A80EF208026040022AE40012FD106428 +S315001F8E400EFA027513006040042ADC0012FD10643E +S315001F8E500EFA04750B0027D3030010B009F20403A2 +S315001F8E60AC860EF2FA0208FE2F58FFFF2A44802A0C +S315001F8E701A00214400A860460EF2150301BC0EFA23 +S315001F8E80D0FE1F603E644047584FE50046410B0227 +S315001F8E90214710BF3B4204A2A2DB0EF2664308FD28 +S315001F8EA010BC0EFA80753440FF263BFF2A4410B0D3 +S315001F8EB020440903FDB401B040400503FEB4404001 +S315001F8EC0C6609278FFFFC660A978FFFF0064404A1C +S315001F8ED03540012A1500244100B9405528020D4787 +S315001F8EE0584FB9002402664720BF3B4204A2A2DBAB +S315001F8EF00EF24644664310FD10BC0EFA01751700AC +S315001F8F003540042A0700234100B940551002C660A8 +S315001F8F10E478FFFF3540022A0700224100B9405579 +S315001F8F200602C7600A78FFFF354008260300344053 +S315001F8F30082A0500214100B940554054A203C660C6 +S315001F8F40A978FFFF0F600EF3FE65248680670EFB70 +S315001F8F500CF32DF34045FC2B020040450300584FF0 +S315001F8F6053000702584F5F00040566506552615152 +S315001F8F700A0040672645B48440462DF505F08060FB +S315001F8F80645000727E712644ACFF1063ACFF01254E +S315001F8F90FD1FACFFFFFFACFFFFFFACFF0EFBC66064 +S315001F8FA0A978FFFF0F600FF3FE65248680670FFB0E +S315001F8FB00DF32DF34045FC2B020040450300584F8F +S315001F8FC023000802584F2F008EFF04056650655276 +S315001F8FD061510A0040672645B48440462DF505F0C9 +S315001F8FE08060645000727E718DFF2644ADFF106352 +S315001F8FF0ADFF0225FD1FADFFFFFFADFFFFFFADFF5D +S315001F90000FFBC660A978FFFF2544AFF1B0F1D080F2 +S315001F9010D080070401060500254601F00367A085D9 +S315001F902094802F58FFFF25462641446301F2FFFF18 +S315001F9030FFB5D581FFFF070400F2046300A8604651 +S315001F9040F50242FE0E006144C5816345C581604538 +S315001F90500064D48401F2F085F0806544F885FFFF33 +S315001F906002FE2F58FFFFB2F3B1F300BECC840C03F0 +S315001F9070B1FB80607C6401FA006400F000FAD080C6 +S315001F9080B2F90202B3F908FE2E58FFFF1E60FC63F9 +S315001F90900D6500614148A3D306A3AC860061090391 +S315001F90A000F209F0AC8600F2DD81FC026444AC8656 +S315001F90B0F6006144254627DA654428454588CC8550 +S315001F90C05A87E902006427DA5ADA5A87AEF3ADF3F4 +S315001F90D060430CA364A360450061A3D364A3AC865D +S315001F90E000F20403AC8600F2DD81FC026544CC85E8 +S315001F90F06144F302254627DA5A87284545880064C6 +S315001F910027DA5A8706604065B2F30161AC8600F222 +S315001F91100303D580DD81FA04CD84254627DA284549 +S315001F9120C4845ADADA81B1F159D81E60FA64186319 +S315001F9130A0D106A459D8FC1F006459DA59DA016078 +S315001F914066640A6358D159D8FD1FF5F159D82E58B0 +S315001F9150FFFF074CFE60584FEE78FFFF0C47584F36 +S315001F916023002E58FFFF074CFE60584FEE78FFFF77 +S315001F91700C47274400BE08F0150364424AD309F280 +S315001F9180DC83A2DD254309FC634627430AFC09FA53 +S315001F919008F800A866430302644458DD03006046CE +S315001F91A025440AFA2E58FFFF274300BB2546BFD387 +S315001F91B01203DC84A2DBA3D308FC00A809FA03026E +S315001F91C02544BEDB0400604625440AFA2546006492 +S315001F91D00AFA2544A3DB2F58FFFFA0FE0705A3FEAF +S315001F91E00705A1FE150560643BDB0F002058FFFF36 +S315001F91F055F7FFFFFFFF99FF304459BC405198FFB9 +S315001F920099FF30447DB4405198FFA1FFFFFFD33F24 +S315001F921000643BDB3C44AC80FFFFF7028FF390F307 +S315001F922002A802A80A02006491FB8FFB90FB006450 +S315001F923092FBCAFEC9604A78FFFF0302006490FBD7 +S315001F9240CAFE01643BDB1F600262A2D3FFFF00A8B8 +S315001F925060461403F5F329F2FDA06040803A2C0006 +S315001F92602B029BFE29051F6048620064A2DB664431 +S315001F92705ADB02645ADBFFFF2BFFE50090F3FFFF6B +S315001F928001A8FFFF07021E60FC62A2D3FFFF00A812 +S315001F92906046120286FF204052270A009AFE0804E3 +S315001F92A082FF294404BC404912643BDB1DFF19FFA2 +S315001F92B084FFC860FB78FFFF6644FCFB0DF2D7F105 +S315001F92C0465C645F0DFA11643BDBDDFE0C051F6017 +S315001F92D066650864A5DBC960736455FB1DFF2DFF1A +S315001F92E0C9600578FFFF07F00064D080AEF3070260 +S315001F92F022F00464B084A2DACE605F78FFFFD080CC +S315001F9300F0F3320312616040033A2E00106141D31D +S315001F931053F16040033A28006440FF222500057E72 +S315001F9320A1DB07F000656543186141D3106100A8F2 +S315001F933041D317036047FFB5186141D300BBFFA098 +S315001F934007030F06E884A480FFFF0202FB0409003F +S315001F9350B981E884D981FD040B60C46545D31261C8 +S315001F936041DB006453FB52FB29F200634047503632 +S315001F93700500A43603008036010001634EFD4047F9 +S315001F9380082A0A00032F080085F12BF886F1FFFF34 +S315001F93902CF887F12DF8FFFF50F334FA10A450FB79 +S315001F93A0006415FA16FA0FFAFFFF07F0126343D18E +S315001F93B0007F645E51FB6444007EF4FB07F0AEF34E +S315001F93C0FFFFD080FFFF0303F4F3F3FB604100F4BC +S315001F93D0274501F23C461DFA22637B60FF64A48485 +S315001F93E0032B1C6329FA6040A4361463434C0061A7 +S315001F93F0414B6040083A4E00334400364B0000F4A0 +S315001F9400AA60AA6502F203F0D48003640A02D08020 +S315001F9410006404F00602D080F87FD08001030102A9 +S315001F942001613344023A190005F0CD813C460E0214 +S315001F94306444883A0B008E3B090044F13344802B69 +S315001F94402900644400BCFFFF19032400334480270E +S315001F945015000265CD608978FFFFCD8105F03C467A +S315001F94600D026444813A020080371400883A0600D0 +S315001F94708E37100077370E0078370C003C46016494 +S315001F9480404B38F228F008A43340023A03006440E8 +S315001F9490102638FA24604265F5F3A5D3FDA0FFA078 +S315001F94A01D031C0361406E3B190027440CB4083A88 +S315001F94B015000360846538F2146343D1D484644075 +S315001F94C0802B0C000B0E64A417FA0360206316FC96 +S315001F94D0274704BF29FA026414FA5F002BF22740BC +S315001F94E0012731F2EDF16040012653000960006447 +S315001F94F0D08038F209062C45C484D080404A4006E5 +S315001F95006043644454881800604524602464A0D3D3 +S315001F9510F4F300BC6047ECA0330332072C44C4812C +S315001F952002601C65454AD5802C452A06274004271C +S315001F953030002A43D7854548EEF10FF2D3800165E7 +S315001F954001070065B4840FFA006338F228456041AD +S315001F9550D484DF83FC0714FC614401360200093AF8 +S315001F95600600284448882A44C883434AE50017FA58 +S315001F9570046000642745B48429FA284316FC0D00AD +S315001F958038F22C45EEF1C481D1800FF2010601BCE1 +S315001F95900FFA38F217FA016414FA07F0126343D16F +S315001F95A0007F645E51FB6444007EF4FB80F16043E0 +S315001F95B06047D080C065010664440A36706414365D +S315001F95C03864323617643736156450360E646E3675 +S315001F95D00B64448629F207F06040B03A0300403B13 +S315001F95E0010012000CB4083A41002B44012A3E0028 +S315001F95F0F5F317F260400B3607003340013A0400BB +S315001F960000A801A8330332033C4629F04067B08403 +S315001F9610A2DA3340023606002A656040032B246512 +S315001F9620454C24002E656040032B2865454C29F2C6 +S315001F963044F108B028F21A036047E884E884E884F6 +S315001F964003B4D080FFFF12031F6048621F602064AF +S315001F9650A2DB3C445ADB02645ADBFFFF2BFF00648C +S315001F9660405CFCFBCEFEC9600878FFFFF4F12C4579 +S315001F9670644317F251F1C484E084E084E0816340BF +S315001F96803737E1816445D160584D8678FFFFAE823A +S315001F9690FCA20A0363406E3B06006041040D63444F +S315001F96A0807EF4FB6144DC842AF01FFA6444802721 +S315001F96B0340016F20FF0AC842C45290351F1C484F3 +S315001F96C0E084E084E08163403737E18164450FF031 +S315001F96D0D160584D8678FFFFAE82FCA20A03634015 +S315001F96E06E3B06006041040D8067B0840FFA61442B +S315001F96F0DC8421FADE65C4852641E181C5842AFA08 +S315001F97001FF0DE64C0852644E084C48410FA264414 +S315001F97102BF00AA464400126006411FAF4F313FA2D +S315001F9720FFFF0DF228F06047FFB4644120B160418E +S315001F97301002D160584F7878FFFF0B60B464D7F1E1 +S315001F9740A0DD6441D160584F7878FFFF0B60B66487 +S315001F9750A0DD02643BDBCF603978FFFF6644FCFB6C +S315001F976007F00064D080AEF36103D080106141D34F +S315001F97705D03604000365A004DF107F06440022633 +S315001F9780010008000312CC609078FFFFFC0ACD6031 +S315001F97907778FFFF60400136490002364A000336DC +S315001F97A02A0004363B004B00006452FB106141D374 +S315001F97B01261057EA2DB00656543186141D3106106 +S315001F97C000A841D317036047FFB5186141D300BBFB +S315001F97D0FFA007030F06E884A480FFFF0202FB0415 +S315001F97E00900B981E884D981FD040B60C46545D39E +S315001F97F0126141DB1B0052F3FFFFDC8452FBD0F3E7 +S315001F98006045D480FFFF12021F607A620B60B86446 +S315001F9810A2DB03644ADBFFFF04FFC60052F310619D +S315001F9820DC8452FB41D3FFFF037EA1DBCD6077783B +S315001F9830FFFF106141D3FFFF017EA1DBF70010611F +S315001F984041D31861604741D3FFB500A8FFFF080346 +S315001F9850E484A480FFFF0302FB040164010000648B +S315001F986000A8FFFFE602106141D31861604741D38C +S315001F9870FFB500A8FFFF2503E084A480FFFFFC03BC +S315001F9880A1DB01656543186141D3106100A841D36F +S315001F989017036047FFB5186141D300BBFFA007033D +S315001F98A00F06E884A480FFFF0202FB040900B981AA +S315001F98B0E884D981FD040B60C46545D3126141DB81 +S315001F98C0AD00AC00654460400136B00002360100B1 +S315001F98D0AD00106141D3FFFF017EA1DB006565432B +S315001F98E0186141D3106100A841D317036047FFB524 +S315001F98F0186141D300BBFFA007030F06E884A480AD +S315001F9900FFFF0202FB040900B981E884D981FD0427 +S315001F99100B60C46545D3126141DBCD607778FFFFCD +S315001F992007F0106141D3FFFF604001360B0002367E +S315001F99301200033642000436550005360C00CD6072 +S315001F99407778FFFF07F0106141D3FFFF027EA1DB8F +S315001F9950CD607778FFFF07F001656543186141D336 +S315001F9960106100A841D317036047FFB5186141D3A3 +S315001F997000BBFFA007030F06E884A480FFFF0202B7 +S315001F9980FB040900B981E884D981FD040B60C46515 +S315001F999045D3126141DB106141D30063037EA1DB16 +S315001F99A052FD1F607A620B60B864A2DB02644ADB59 +S315001F99B0FFFF04FFCD607778FFFF186141D352F395 +S315001F99C002B0CC840503042852FBCD607778FFFFD5 +S315001F99D0042852FB106141D3FFFF047EA1DBCD603B +S315001F99E07778FFFF106141D3FFFF6047FFB518610E +S315001F99F041D3FFFFFFA0FFFF2D06E884A480FFFFD2 +S315001F9A000202FB042700A1DB01656543186141D3F0 +S315001F9A10106100A841D317036047FFB5186141D3F2 +S315001F9A2000BBFFA007030F06E884A480FFFF020206 +S315001F9A30FB040900B981E884D981FD040B60C46564 +S315001F9A4045D3126141DB106141D30063037EA1DB65 +S315001F9A5052FD4D004C0007F0106141D3FFFF6040DF +S315001F9A600136030002360F004200186141D3FFFF83 +S315001F9A7001B0FFFF3C0207F0106141D3FFFF027EDA +S315001F9A80A1DB3500340007F0106141D31261017E5E +S315001F9A90A2DB6047FFB5186141D3FFFFFFA0FFFFA1 +S315001F9AA0F106E884A480FFFF0202FB04EB00A1DBA2 +S315001F9AB000656543186141D3106100A841D31703A0 +S315001F9AC06047FFB5186141D300BBFFA007030F0610 +S315001F9AD0E884A480FFFF0202FB040900B981E88421 +S315001F9AE0D981FD040B60C46545D3126141DB036454 +S315001F9AF03BDBCAFE4DF10165324004270A002BF2FB +S315001F9B00644502220600604001260300CE6073787A +S315001F9B10FFFF14F2654001261F00604505643BDB0D +S315001F9B206544CC85BCF123606464A0D3FFFFD88055 +S315001F9B30C4840B030705DC80D0800403A2DB090461 +S315001F9B40C6FE07000064B884A2DB8AFF206000758A +S315001F9B5088FFCE605F78FFFF604129F000600C64CC +S315001F9B60A084043602000C3A0300CE605F78FFFF24 +S315001F9B7061456041BCF123606464A0D3FFFFD880B8 +S315001F9B80C4840B030705DC80D0800403A2DB090411 +S315001F9B90C6FE07000064B884A2DB8AFF206000753A +S315001F9BA088FF614008360300CE605F78FFFF14F21E +S315001F9BB01C6560410063CD81C783FD0238F02BF21F +S315001F9BC0C3836040012A2900BCF123606264A0D3CD +S315001F9BD0FFFFDC84DC80D0800403A2DB0824C6FEE2 +S315001F9BE004008AFF2060007588FFBCF1236068644B +S315001F9BF0A0D36345D880C4840B030705DC80D080BF +S315001F9C000403A2DB0904C6FE07000064B884A2DBB6 +S315001F9C108AFF2060007588FF5200BCF123606064D4 +S315001F9C20A0D3FFFFDC84DC80D0800403A2DB0824E2 +S315001F9C30C6FE04008AFF2060007588FFBCF1236002 +S315001F9C406664A0D36345D880C4840B030705DC80F4 +S315001F9C50D0800403A2DB0904C6FE07000064B88493 +S315001F9C60A2DB8AFF2060007588FF15F2FFFF0FB485 +S315001F9C7000A801A824031203BCF123606E64A0D3BD +S315001F9C80FFFFDC84DC80D0800403A2DB0824C6FE31 +S315001F9C9004008AFF2060007588FF1100BCF1236055 +S315001F9CA06C64A0D3FFFFDC84DC80D0800403A2DBBE +S315001F9CB00824C6FE04008AFF2060007588FF04641E +S315001F9CC03BDB1F6048621F602064A2DB3C445ADBFB +S315001F9CD002645ADBFFFF2BFF0064405CFCFBCEFED9 +S315001F9CE0C9600878FFFF0FF015F26441012A0200D0 +S315001F9CF0D6F10200D5F1FFFF6445DC84D48015FA46 +S315001F9D001D076140012A090023609464A0D3FFFF49 +S315001F9D10DC84FFFF0828A2DB080023609664A0D31B +S315001F9D20FFFFDC84FFFF0828A2DB29F00867B08449 +S315001F9D30A2DA00644EFBCA60CD78FFFF00644FFBBA +S315001F9D40BCF123606E64A0D3FFFFDC84DC80D0806F +S315001F9D500403A2DB0824C6FE04008AFF20600075E8 +S315001F9D6088FFBCF123607064A0D3FFFFDC84DC8016 +S315001F9D70D0800403A2DB0824C6FE04008AFF2060ED +S315001F9D80007588FF0DF2D7F1FFFF645F0DFA22F011 +S315001F9D900164B084A2DA29F042F36440402B6300C9 +S315001F9DA03340023A600000EB0960946280FF265C34 +S315001F9DB0A2D9275C5AD9285C5AD9295C5AD92A5C58 +S315001F9DC05AD92B5C5AD92D5C5AD92F5C5AD942F3D2 +S315001F9DD084FF04A4A0D3FFFFDC84A2DB4AD31304B1 +S315001F9DE0DC83A2DD4AD30604DC84A2DB03043341F1 +S315001F9DF0E181699344F3FFFF604380FF8C60584FF6 +S315001F9E008F78FFFF84FF44F3FFFF604380FF8D6061 +S315001F9E10584F1178FFFF09609462A2D35AD140466A +S315001F9E2044475AD35AD1404844495AD35AD1404A33 +S315001F9E30444B5AD35AD1404D444F84FF0960746432 +S315001F9E40404A0360FE610E6359D32AD15A8A645F62 +S315001F9E50A1DB644759D3605C645FA1DBF51F016416 +S315001F9E6039FBFFFF1AFFCE605F78FFFFCF60B57823 +S315001F9E70FFFF21643BDB36F30163C4B436FB37FDBA +S315001F9E80CF606C62424099FF304440BC79B4405168 +S315001F9E9098FFA0FE1AFF1F60146408F007F0D08019 +S315001F9EA01F601A621402A2D30163AC8607F20F0366 +S315001F9EB0D08009F2FA0222FC1F6048621F602064EC +S315001F9EC0A2DB66445ADB02645ADBFFFF2BFF3C46CC +S315001F9ED00464A1FF4FFBD33F8760806121F036F3F7 +S315001F9EE09CFE0205D1916040012A1000FEB436FB8C +S315001F9EF000644FFB01644DFB0DF2D7F3FFFF645F58 +S315001F9F000DFA40643BDBCF60B578FFFF022A1200D3 +S315001F9F1041643BDB36F30263FDB436FB0DF24DFDA8 +S315001F9F20FFB5D8F16047D080DC841F036047B48437 +S315001F9F300DFA1B00082A070042643BDB36F3FFFFBE +S315001F9F40F7B436FB1200102A090043643BDB36F3D5 +S315001F9F50FFFFEFB436FBCF603978FFFF44643BDB6E +S315001F9F6036F3FFFFDFB436FB00002A643BDBC86015 +S315001F9F70FB644040CB60AE78FFFF86FF204484FF22 +S315001F9F80202A0400C460584E4978FFFF314001263D +S315001F9F900A0099FF304449BC405198FF99FF30444D +S315001F9FA06DB4405198FFF5F3FFFFFDA0FFFF470378 +S315001F9FB03140042A3D0072F37BF3CC83CC8472FDBF +S315001F9FC07BFB20023140022A130074F375F1CC8407 +S315001F9FD074FB0E0274F9006008653144349177F3FF +S315001F9FE076F100B86445010367456550CC8478FB5C +S315001F9FF02360EC64A0D373F100B87BF903038BF3E2 +S315001FA00072FB060072F38BF100B8FFFF110272F9A3 +S315001FA0103140012A0D00DDFE0B05BAFE10EE83F15D +S315001FA0200260EE64A7FBA8F90464A9FBDFFE19FF13 +S315001FA03014603E62A2D3FFFFCC84FF2BA2DB31400C +S315001FA040012A29009DFE2704260A9FFE240585FF57 +S315001FA050204484FF40261F003F40202B1C003869E8 +S315001FA060FFFF6844802BFD00012A15002360A064B2 +S315001FA070A0D3FFFFDC84FFFF0828A2DB83F1026069 +S315001FA080EE64A7FBFFFF80600064B084A8FB046436 +S315001FA090A9FBDFFE19FF10643BDB84F37345E084E5 +S315001FA0A0E084E084E084C493C493C9FE4FF33C4626 +S315001FA0B000BCCC8431034FFB2F0231400126FFFF2A +S315001FA0C030F1E0646440012A030008F108FB9EF9A1 +S315001FA0D0D160716440420064FCFB405C37FB82FF29 +S315001FA0E0404784FF62FF23609064A0D3FFFFDC8498 +S315001FA0F0FFFF0828A2DB22F00164B084A2DA1F60EA +S315001FA10048621F602064A2DB66445ADB02645ADB86 +S315001FA110FFFF2BFFC1FECEFE6FF3FFFF6041FDB4B5 +S315001FA120A2DB614401B002B00C030B029DFE0904C1 +S315001FA1301F607A621460A664A2DB02644ADBFFFF1B +S315001FA14004FFF5F386FF03A8204484FF1B02042B9C +S315001FA1500C00BBFECAFE1F607A6214606A64A2DB33 +S315001FA16002644ADBFFFF04FF0D00DBFE63F11F6085 +S315001FA17048621F600264A2DB5AD904645ADBFFFFE0 +S315001FA1802BFFC1FEC9600578FFFF4CF34BF100BCE6 +S315001FA19000630602B084FFFF03020B60B462A2D302 +S315001FA1A04BFB4CFD604125643BDB2744EFB4404726 +S315001FA1B000B97140802701121C03D060EB6284FF37 +S315001FA1C0424282FF99FF304414BC405198FF240A33 +S315001FA1D0A1FFFFFFD13F7044AC801E0A20117140C2 +S315001FA1E08027F6124BF3450200A8CC8402034BFBD3 +S315001FA1F0EF02080A99FF3044FBB4405198FFF860FC +S315001FA2007778FFFF84FFD060C564404282FF99FFC5 +S315001FA210304414BC405198FF8A60B678FFFF8860AF +S315001FA2201978FFFF3C44AC8037F12B0364400722AB +S315001FA2302800F8605578FFFF99FF30441CBCDFB437 +S315001FA240405198FF3140082AED0078F376F100A0BF +S315001FA250DC8005030803CC8478FB67500A00CC8496 +S315001FA26078FB645006003144FF60F7653144249142 +S315001FA270080028643ADB99FF304470BCF3B44051A0 +S315001FA28098FFA1FFFFFFD13F28643BDB0B60B6653C +S315001FA290A5D3324002271B0000A84CFB1803D16030 +S315001FA2A05D6484FF404282FF99FF304414BCF7B4BB +S315001FA2B0405198FFA1FFFFFFD13F7044AC804CF384 +S315001FA2C0AB0AD70200A8CC8402034CFBF30284FF1F +S315001FA2D0D1607164404282FF274408BC40477BE13E +S315001FA2E004003AE1314001267BE1F8604C78FFFF1C +S315001FA2F040600B652E440063E880F8840224948432 +S315001FA300F383CD81FFFFF8022F58404E0062016490 +S315001FA310D480E0841A03D480E0841503614411615C +S315001FA320E084CD81FD040100E084F282FFFF022458 +S315001FA330C6820228D682E280CD81022801BCF402A1 +S315001FA340012AC6820300E981F28261442D58FFFF6C +S315001FA35069E1A1FFFFFFD43FFB001F603862A2D354 +S315001FA360FFFF00A860460FF2F30300BCFFFF0402C5 +S315001FA3700829470043FFEC00022638003D41664589 +S315001FA380D580FFFF08283D0008253A00042A020051 +S315001FA39003232200012B35006A000FF240FF6040A5 +S315001FA3A0042605000227030049E1A1FF0FF2082535 +S315001FA3B027006040022B0E001D4A40252400D26054 +S315001FA3C06F78FFFF38F20465C4834AE1B3FFFF606D +S315001FA3D05978FFFF042A150008BC02BC007F38F01D +S315001FA3E00FFA64473FFABCFE0064404A43FF09F276 +S315001FA3F040FF00BE0FF2CBFE00BCAA03A903BC00A0 +S315001FA40043FF7064EA00402904001DF3FFFFDC844C +S315001FA4101DFB84E2006422FA99FF0760FE633A403F +S315001FA42080270700FC1F4FF301636040FF264FFD87 +S315001FA430F40098FF00EB43FF40FFB0FF0164B1FF3C +S315001FA44048FB2A4607F02943FF230C002264C085D8 +S315001FA4500960A261056459D1CC84BDD9FC0259D1CA +S315001FA460A5D9006343490FF2BCFEF7B4B6000063DB +S315001FA470F5F3434929F060400B362400AEF330F064 +S315001FA48064A406A46043644520612FF0BED3A3D302 +S315001FA490D480D0800D02BFD32EF00502D080AEF33C +S315001FA4A00202FAA30B002FF0CD8164A3EF02030073 +S315001FA4B0CD8164A3EB02AEF3FFFF604307FCD160BF +S315001FA4C0CD78FFFFAEF307FA04652EF044D92FF0BF +S315001FA4D0FFFF58D930F058D9D160CD78FFFFF5F37B +S315001FA4E007F26045AEF11BF2D0801AF06540033AC1 +S315001FA4F00603604020275000334001360300D36017 +S315001FA5007678FFFF05600063A3D3FFFF645FBDDBA3 +S315001FA510A3D16444645EBDDB1BF0A3D3FFFF645F5E +S315001FA520BDDB0860B465644702FEF484F484F484DA +S315001FA53003B4404DE084E084E084E084C482A2D367 +S315001FA5405A8BE881D88580608064B485A3D32BD1CC +S315001FA5505A8B645FBDDBA3D16444645ECD81BDDBD2 +S315001FA560F502A3D32BD1FFFF645FA3DB99FF3A4408 +S315001FA57098FF802B15000825130000EA654400EBA1 +S315001FA58099FF405B98FF606000EBA16000EBD16014 +S315001FA59000EBD160E278FFFF1BF033450236030064 +S315001FA5A0D3607678FFFF6447C0B4E484F484F484F0 +S315001FA5B0404D33458061CC84E181FD0DA5801AF0A5 +S315001FA5C01BF23803645F35FAAEF3604522A4A0D1AF +S315001FA5D02D440161CC84E181FD0DE981218C91849B +S315001FA5E00403A2DB0960AE64A0D92D43E383E38392 +S315001FA5F0E383E383AEF130A3C383BED336FABFD161 +S315001FA600424B3AF2A3D1D08039F202030C076C04F5 +S315001FA610D080BED3020307076704D4802C440304EB +S315001FA62063020F226200F5F3006360400B3A0300DA +S315001FA630434D180057002C440F261400454C654403 +S315001FA64000BCCC840F0339F23AF00302B084FFFF3B +S315001FA65009032B41A1D359D3D08039F00304D080ED +S315001FA6602D431C07454C2D4307F0E383E383E38308 +S315001FA670E38324A3C38343490960A2610564BDD153 +S315001FA680CC8459D9FC022D4380FF22F207F004BC6B +S315001FA69022FA8B60584E2778FFFF85FF2D4308252A +S315001FA6A04D0022F280FF08BC22FA8B60584EA67816 +S315001FA6B0FFFF85FF99FF3A4498FF802B1700082557 +S315001FA6C03D0000EA80608F6400EB99FF405B98FFB6 +S315001FA6D0606000EBA16000EBD16000EB98FFD160DA +S315001FA6E0E278FFFF22640200FFFF42642A460FF250 +S315001FA6F040FF60400426040009E1A1FFFFFF40FF61 +S315001FA7000064082522FA43FFB0FF0164B1FF48FB2E +S315001FA71007F02943FF230C002264C0850960A2614C +S315001FA720056459D1CC84BDD9FC0259D1A5D9006382 +S315001FA7304349BCFE7064D160ED78FFFFD260037899 +S315001FA740FFFF83F1DDFE10EEDDFE010510EE204456 +S315001FA75020BC40404345204460BC40400260EE643C +S315001FA760A7FBA8F90564A9FBDFFE19FFD360BC642C +S315001FA770AAFBD160A878FFFF2543020002EEBDFEAB +S315001FA780D460AD78FFFF204420BC40404345A4D190 +S315001FA790DA83C3852500DDFE14EE0961CD81FFFF37 +S315001FA7A0FD0210EE4345204460BC40400260EE634C +S315001FA7B083F3A7FD407FA8FB0564A9FBDFFE19FFF6 +S315001FA7C0D360E664AAFBD160A878FFFF14EE096187 +S315001FA7D0CD81FFFFFD0210EE1F60D86320604A6522 +S315001FA7E0BDD3FFFF6048604780BC007F604AD780AB +S315001FA7F06840802BFD00F40220604A6321604C658F +S315001FA800BDD3FFFF6048604780BC007F604AD7808A +S315001FA8106840802BFD00F4023F44022B0600AD6802 +S315001FA820836AFFFF6840802BFD00012B060000682E +S315001FA830906AFFFF6840802BFD0003270600016812 +S315001FA840916AFFFF6840802BFD00202B1200846851 +S315001FA8508F6AFFFF6840802BFD000F68CD6AFFFFE0 +S315001FA8606840802BFD000068F66AFFFF6840802B5A +S315001FA870FD000168FF6A254324400C3A6E0002EE74 +S315001FA880BDFE6B0080E10116FE006448926AA1FFBF +S315001FA890FFFF684023608E64A0D3FFFFDC84FFFFA9 +S315001FA8A00828A2DB5A0080E10116FE000168A76A8C +S315001FA8B0A1FFFFFF68405100204420BC404080E1BB +S315001FA8C064460116FE002169A1FFFFFF685E01169F +S315001FA8D0FE002269A1FFFFFF685F25FA20F201161D +S315001FA8E0FE003A69A1FFFFFF685F26FA3600204483 +S315001FA8F020BC40404345BED5A4D25A86EFA0116165 +S315001FA900010660411F60B66380E1BDD32642011672 +S315001FA910FE006049A1FFFFFF6844CD81A2DA5A8677 +S315001FA920F40225431A003F40202B17000116FE0094 +S315001FA9303869A1FFFFFF6844012A0F002360A06446 +S315001FA940A0D3FFFFDC84FFFF0828A2DB83F1806012 +S315001FA9500064B09CD360A478FFFF21E1ABF199FF9F +S315001FA960445798FF0064BFDB2044202A070007B422 +S315001FA9700436C3FE0636CCFE0736D5FE2044D8B4B1 +S315001FA98040402044402A07009FFE2405BFB4404094 +S315001FA990AAF7FFFFFFFF1F605A62A2D3DA8300A840 +S315001FA9A002611B02DB825AD3DA8300A802611502F9 +S315001FA9B0DB825AD3DA8300A804610F02DB825AD3E3 +S315001FA9C0DA8300A806610902DB825AD3DA8300A85C +S315001FA9D007610302D160A878FFFFA3D140446243F9 +S315001FA9E0204407B5D485358024451F60906444D71D +S315001FA9F0FFFFFFFF80E14345204420BC40406443E6 +S315001FAA00BDD3BDD140441027180000E660413F402A +S315001FAA1000360200076003E6FF607F65ABF3244044 +S315001FAA20082BA48499FF405798FF0116FE0064491E +S315001FAA306844802BFD00007FA3DB25438E0080E149 +S315001FAA404345204420BC40406443BDD3BDD1404450 +S315001FAA50102B3300A3D3FFFF6041244007271F009D +S315001FAA60AA6000793F40003A09006159FFFF79400B +S315001FAA70802BFD00244420271F001B00806010ED43 +S315001FAA806159FFFF7940802BFD00244420271400C5 +S315001FAA90806018ED806019ED806018ED0A00AC60CB +S315001FAAA000796159FFFF7940802BFD002444202740 +S315001FAAB00300A86000790000190000E63F40003639 +S315001FAAC00200076003E6FF607F65ABF32440082B97 +S315001FAAD0A48499FF4057A3D398FF6048644480BC61 +S315001FAAE0FFB4604AFFFF6840802BFD002543A60088 +S315001FAAF046431F607861A1D3006300A859D1140291 +S315001FAB0059D3006300A859D10F0259D3006300A877 +S315001FAB1059D10A022346C9600578FFFFD6603878E7 +S315001FAB20FFFFD6601278FFFF49DD60400236F9004D +S315001FAB300336F40001366F00053ADB00A4D35AD35F +S315001FAB409C85A484A2DBD50024E20460007A4643D8 +S315001FAB502CF32BF300BDCC8408032BFB06026544A4 +S315001FAB602BFB8AFF8060007588FF28440036120081 +S315001FAB70CC844048003A1D00012B0A0099FFBF658F +S315001FAB803C44604701BC249C98FF01644048110067 +S315001FAB9040FB0F0040F3FFFF00BCFFFF0A030160ED +S315001FABA00A64404899FF3C44604741BC007F405CB3 +S315001FABB098FF01605861A1D3614300A86041040258 +S315001FABC02346C9600578FFFF59D3006600A8CC84C9 +S315001FABD00203A1DBF50049D3A3DB00A860435BD3C7 +S315001FABE0060300A8CC84020201660100A3DB06A1AE +S315001FABF0A1D359D16045A5D359D1B084A5DB6444EF +S315001FAC000636CDFE0736D6FE6640003AAE00234610 +S315001FAC10C9600578FFFF016058610064A1DBD5603C +S315001FAC207978FFFFD66017644045444924000160C8 +S315001FAC305866A6D304A16043A1D3C981604500BB52 +S315001FAC40A1DBBED30903D4849C84DC84FFFF040EDE +S315001FAC50A3D163466443F2009C84DC8549DD6144CD +S315001FAC6000BBA6DB02036544BEDBD5607978FFFF18 +S315001FAC70D5607964404501605866A6D3FFFF00A8DA +S315001FAC80D080100302036046F80058D3A4D3604552 +S315001FAC900063A4DD58D302A8C4830103A2DD624466 +S315001FACA0C884A6DB255829417F6701612358FFFF0A +S315001FACB0A2FF464502F009603C64D08000F401F013 +S315001FACC02546490264407827460000F004F80464CC +S315001FACD003FA0EF2006307FC0DFC0EFC6040F03B0E +S315001FACE016003244B4F301B0F6A008242205DC8313 +S315001FACF0F0670EFA1F6038642BDB66445ADB02646A +S315001FAD005ADBB4FD2BFFFE643B424ADB4900B5F319 +S315001FAD100A65D480DC830D051F602C642BDB66441B +S315001FAD205ADB02645ADBB5FD2BFFFD643B424ADB4F +S315001FAD303600B1F3FFFFD8A0FFFF0D041F60446468 +S315001FAD402BDB66445ADB02645ADBFFFF2BFFFC64D6 +S315001FAD503B424ADB2500464500642BDB25445ADB74 +S315001FAD6002645ADBFFFF2BFF00F2A2FF00BE01F0B9 +S315001FAD700B037867A080F8670703C08401FA25468E +S315001FAD80006400FA254405FAFF60584E1078FFFF4D +S315001FAD90D1FEA3FFFF643B424ADB20440126D1FEBE +S315001FADA0A3FF2D58FFFF1F6032644047584F0D0009 +S315001FADB01F6026644047584F1A001F603E64404775 +S315001FADC0584F0300D760EB78FFFF27D3FFFFAC86F2 +S315001FADD00EF20B036040012A08001F605464404BAB +S315001FADE0D660584D5878FFFFF0002F58FFFF27D326 +S315001FADF0FFFFAC860EF214036040012A110002F019 +S315001FAE0009603C64D080A2FFB5F30202CC84B5FB77 +S315001FAE101F605464404BD660584D5878FFFFE700BB +S315001FAE202F58FFFF02640100016440553BFFD760A6 +S315001FAE30EB78FFFFB2FEF805B3FEF405B0FEB305CF +S315001FAE40B1FE0305D760EB78FFFFFB643A424ADB8E +S315001FAE50A2FFB8F3B4F3CC80FAA0010D1E05FE6065 +S315001FAE60584D2678FFFFA2FF1803F0670EFA1F60E2 +S315001FAE7054621F603864A2DB66445ADB02645ADBE5 +S315001FAE80FFFF2BFFF6643A424ADBB8F3B4F3CC83D9 +S315001FAE90DC84010EB8FDB4FBD1FEB7F3B5F300A8F1 +S315001FAEA0B6F10302D080FFFF1E05FE60584D2678BF +S315001FAEB0FFFFA2FF18030063B7F30EFCCC84FF3A13 +S315001FAEC0B7FB1F6054621F602C64A2DB66445ADB0B +S315001FAED002645ADBFFFF2BFFF7643A424ADBB5F3E6 +S315001FAEE0D1FEDC84B5FB1F602C64A3FFA0D30061D9 +S315001FAEF000BE0EF22A0340B000A8040201026641FA +S315001FAF0009F2F600F9643A424ADB664500B909F2CE +S315001FAF10070200BE0EF2190300A809F2FA026641E3 +S315001FAF20614620640EFA00F2006300FC05F06546D8 +S315001FAF3000FA04FA08640EFA05F806F80464405588 +S315001FAF403BFFD1FEF8643A424ADBA2FF2040012AAA +S315001FAF502600FA643A424ADBC860584E3378FFFF30 +S315001FAF601E03464509603C63FE60584E8C78FFFF02 +S315001FAF7003603C6401FA40640EFA1F6054621F604E +S315001FAF802C64A2DB66445ADB02645ADBFFFF2BFFED +S315001FAF90B6F3D1FEDC84B6FB2044FEB44040A3FFCB +S315001FAFA0D760EB78FFFF27F328F14044444529F18A +S315001FAFB02AF1444644473FB4E0851A60A46444D747 +S315001FAFC05843FFFF6143604524443FB4B484FF27C1 +S315001FAFD005FD04FB1075A1FFFFFFD63FB4FEE30579 +S315001FAFE0B5FE0224A5F7FFFFFFFFB7FE0505B6FE58 +S315001FAFF0F200B8FEB9FEEF003644007FFCA06045A4 +S315001FB00005051B60286444D7FFFFFFFFE4007F6030 +S315001FB010C064244501370500A4807F670261510281 +S315001FB02033001064404028E230F1FF60FD6133F3C6 +S315001FB03099FF4050219498FFFFFFFFFF00600C63AC +S315001FB04000603E613E600066C460386458D059D9BE +S315001FB050FD1F0264405061FF046440502440012BD1 +S315001FB06010001E60F061706000660E60D665066394 +S315001FB07050FE59D3A5D0DA85D080FB1F020101648B +S315001FB080405000661C7842FE1064404030F1026456 +S315001FB09040506440012A0B0000603663FF60FE616A +S315001FB0A03E600066C460006458D059D9FD1F61FF19 +S315001FB0B033F399FF405098FF036440508060137824 +S315001FB0C0FFFF2358FFFF7F60C0642445A4807F676E +S315001FB0D00261240200614156C7FED760EB78FFFF6D +S315001FB0E03647FF230400007F60417F671700204417 +S315001FB0F080BC4040334400361000324408BC4052E6 +S315001FB1003344023A040044F1DC609F7864432560AF +S315001FB1109064A0D1DB60FF78644300672358FFFF6C +S315001FB1207F60C0642445A4807F670261300202618C +S315001FB1304156C7FED760EB78FFFFA3F1204464405A +S315001FB140FF2624007FB440400064405E82FF4041DA +S315001FB1502644FDB4404687FF30F1E0646440012A6F +S315001FB160030008F108FB9EF962FF00631F60386247 +S315001FB170A2D3FFFF00A86046040309F20FFCAC86AA +S315001FB180FB001F6072620664A2DB2DFF0067235857 +S315001FB190FFFF7060C0642445A4807F6702610702B9 +S315001FB1A00661204080260300DE60FB78FFFF2358E0 +S315001FB1B0FFFF7F60C0642445A4807F67026113027E +S315001FB1C02044012A03007F6707610D00096044655B +S315001FB1D02544A0FBD4807F6705610507204401BC79 +S315001FB1E04040D1FE00672358FFFF7C60C0642445A2 +S315001FB1F0A48002610602C860584F0478FFFF0361EE +S315001FB20003037F672358FFFF1F602C61A1D3FFFF36 +S315001FB210AC860EF20802254608F0FFFFD1800F61AB +S315001FB220F0030361EE0020B009F2F20346486644BC +S315001FB2302440012B254405FB0B6404FB1075244099 +S315001FB240012B1700254605F000F2006300FC406342 +S315001FB2500EFC284600FA04FA05F8D1FE06F84261EC +S315001FB2603A63254659D02846A1D8FB1F08450064D6 +S315001FB2704048254638F228FA3FF006B4FF7F10BC37 +S315001FB2800626FD7F0EFA28F2FFFF6041644738FA53 +S315001FB29060452360E862A2D3006322FC2AFC11FCEE +S315001FB2A0D480E060E165A5800104070322F00864ED +S315001FB2B0B084A2DAD960D178FFFFDE60584F947848 +S315001FB2C0FFFF140422F00464B084A2DABCF12360E9 +S315001FB2D08264A0D3FFFFDC84DC80D0800403A2DB62 +S315001FB2E00824C6FE0200206000755B002440022B66 +S315001FB2F01D0038F2407CD080FFFF180461401026E5 +S315001FB30008A43CA46040012601A44046C860584FCB +S315001FB3101378FFFFA1D02546CA60FE64D0800105C1 +S315001FB320050322F01064B084A2DA3B00F5F3AEF1F8 +S315001FB33007B4FDA02BF22B0201B064433102F5F3D3 +S315001FB340FFFFFDA0FFFF230216603C652DF210FED6 +S315001FB3506047007FE08444D3046500B8C4811303AB +S315001FB360604350FEA1D32BF059D3D0802CF059D374 +S315001FB370D0802DF0FFFFD080FFFF0801A3D3FFFF72 +S315001FB38000B8C481ED02AEF3FFFF60430901F5F378 +S315001FB3906461FEA0C183040722F00464B084A2DAAC +S315001FB3A007FC22F2FFFF00A8FFFF21022360EA62CB +S315001FB3B0A2D3FFFF6040003A0D001F6054621E605B +S315001FB3C0FC64A2DB66445ADB02645ADBFFFF2BFFD9 +S315001FB3D0C1FE19001F6054621F600E64A2DB664423 +S315001FB3E05ADB02645ADBFFFF2BFFC8FE0C001F60EF +S315001FB3F054621F602064A2DB66445ADB02645ADB78 +S315001FB400FFFF2BFFCEFE2844AC86FFFF21034645D8 +S315001FB4101F6054620064A2DB25445ADB02645ADBB8 +S315001FB420FFFF2BFF00F2A2FF00BE01F00B037867A0 +S315001FB430A080F8670703C08401FA2546006400FA56 +S315001FB440254405FAFF60584E1078FFFFD1FEA3FF73 +S315001FB450D760EB78FFFF7C60C0642445A4807F67BC +S315001FB46002631C02204480B07F67066317022440D4 +S315001FB470032F120028E230F1FF60FD6133F399FFBD +S315001FB4804050219498FFFFFFFFFF0264405061FF69 +S315001FB490016440501C7842FE7F670E632358FFFFEE +S315001FB4A04060C0642445A4807F67026111021F604B +S315001FB4B072621A64A2DB00604E635ADDDA6065644D +S315001FB4C0A5FB2DFFD760EB78FFFF29F305FB006770 +S315001FB4D02358FFFF4060C0642445A4807F67026134 +S315001FB4E00F021F6072621C64A2DB00604E635ADD8E +S315001FB4F0DA607F64A5FB2DFFD760EB78FFFF00673F +S315001FB5002358FFFF7F60C0642445A48002613C026C +S315001FB5102545F1600064D480FFFF0B03F1600164D1 +S315001FB520D480FFFF0603F1600264D480FFFF31035E +S315001FB5302A002560D662A2D11A609A61BFF36445BC +S315001FB540A484A1DB25451E60BA630261BDD3BDD1AC +S315001FB550D480BDD3BDD5CD8102031503F700A2FF4D +S315001FB560A6D3404C00A867430C02A2DD42486441A3 +S315001FB570FE60584D4D78FFFF664428DB02032C58AA +S315001FB580A3FF0C61030004617F6701000067235856 +S315001FB590FFFF2560D662A2D11A609A61BFF3644588 +S315001FB5A0A484A1DB1A609E610164A1DBFFFFC4FEB8 +S315001FB5B0ED00C6FEEB007E60C0642445A4800261D8 +S315001FB5C024022545FC2B20006744D4801B602C6376 +S315001FB5D01F035B61244401270F00BDD3A3D1D48071 +S315001FB5E0CD810824645808A3F8022DF5006422FAB9 +S315001FB5F025445ADA00670A00BDD3BED1D480CD8157 +S315001FB6000824645808A3F80204617F672358FFFFC4 +S315001FB6102DF50F6422FA674423FA62413E600065E6 +S315001FB6200C63C3604264654658D02DF559D8FB1F7D +S315001FB6300C63C360F264654658D02DF559D8FB1FBD +S315001FB64000672358FFFF4BD32DF56041E884DC8448 +S315001FB65022FA254423FABFD148656443584F610037 +S315001FB66000672358FFFF034EDB6058434878FFFFF0 +S315001FB6702560B46125609262A2D3A1DBCC84A88326 +S315001FB680050E2560926458D159D9FD1F0E43160029 +S315001FB6902DF524F2FFFFE0A02064010624FA2DF504 +S315001FB6A022F2DFD1CC84E0850906BFD16441D58063 +S315001FB6B06443010665414865584F5000006723588B +S315001FB6C0FFFF2DF5026422FA2543F5F323FC07B489 +S315001FB6D024FA00672358FFFF2460D063BFD32DF5DC +S315001FB6E06041E884DC8422FA254423FADA85584F20 +S315001FB6F0180000672358FFFF2460D0632DF522F240 +S315001FB700C065CC84E0810A04BFDBD5800703010630 +S315001FB71065416144BFDB4865584F200000672358C9 +S315001FB720FFFF414B00A1806417036542D4852B415F +S315001FB730558BFFFF0204654102000064404BCA841B +S315001FB740BDD1C98158D8FC022B4100A1D88504035D +S315001FB75000F47C650462EB002F58FFFF414B6542E6 +S315001FB7608064D4852B4100A1558B0D0302046541CE +S315001FB77002000064404BCA8458D0C981BDD9FC025F +S315001FB78000F40465EC002F58FFFF2DF5256090612E +S315001FB79024F2A1DB02FE6043F884F884F88446FB9A +S315001FB7A02E002DF52560DC64A0D1A4F90464404B5E +S315001FB7B048650860B261A5D2DA8500BC59DB030271 +S315001FB7C00D7CA2D901006744A4F105636440022AD7 +S315001FB7D0A1DD0C63A5D0DA857FB2A09C030200F41D +S315001FB7E002F0DA8559D9F61F2B444C8BFFFFE30273 +S315001FB7F025609064A0D3FFFFF9A060433103E38364 +S315001FB800E383E383E3830860B46547D3DA8500BC2B +S315001FB8106043260302A4807F47FBFDA304600162E9 +S315001FB820A2D3FFFF007FA2DB5AD3FFFF007FA2DB5D +S315001FB8305AD36241007FA2DB59D3A5D1DA85645F53 +S315001FB840A1DB644759D3605C645FA1DBF51F59D246 +S315001FB850A5D1FFFF645FA1DB016439FBFFFF1AFF60 +S315001FB860006700612358FFFF2560DC64A0D1A4F99F +S315001FB8706440012AF5001A60A0651864A5DB0960FB +S315001FB8803E652DF54864A0D2FFFF404B802B12006A +S315001FB890FFB4404B44FB604102FEF884F884F884F1 +S315001FB8A043FBE181E181E181E181C58342FD3347AC +S315001FB8B080BF40532B438061CF83E181FD0DAEF3E3 +S315001FB8C0335C31932EA52B44FFB4E084E084E084DF +S315001FB8D0E084C481486458D0A1D958D0FFFF59D9F4 +S315001FB8E058D059D90860F4652B44FFB4E084E0842E +S315001FB8F0E084E084C481C98150640E6358D059D94D +S315001FB900FD1F09603E652B44E084E084E084E084EB +S315001FB910C4810064A1DB59DBDC8459DB2B41AEF10A +S315001FB9200164CD81E084FD0DE8842261C18120631D +S315001FB930E383A1D164A1B09CA2D9FB1F2B43FFB304 +S315001FB940434B3340023A2B0044F32B5CD0800360F9 +S315001FB950FE61250280FF8C60584F8F78FFFF87FF9F +S315001FB9602B43FFB380FF8D60584F1178FFFF87FF72 +S315001FB9700360FE61096074660E6359D3A6D1DA8629 +S315001FB980645FA1DB644759D3605C645FA1DBF51F6D +S315001FB99080600F6447FB016439FBFFFF1AFF0067D6 +S315001FB9A000612358FFFF2DF522F224F002A800673D +S315001FB9B00E0244F1644403B43343D0808061020213 +S315001FB9C0E383EB83CC84E181FD0D9D85279300677F +S315001FB9D02358FFFF2DF50060F16422FA254423FA50 +S315001FB9E00160A864404B04600065466136634545A7 +S315001FB9F025D35AD3FFB5FFB7B4845A8559DAF81F32 +S315001FBA002B4100B984A1070304240061414B00F4B4 +S315001FBA1002617A63ED0000672358FFFF3E600064F2 +S315001FBA20404B4BD32DF56041E884DC8422FA254434 +S315001FBA3023FABFD3C983C881466466452B4659D0AE +S315001FBA40654658D8FB1F00672358FFFF2DF5026474 +S315001FBA5022FAFCA3A3D32543A0D323FCDC8424FA18 +S315001FBA6000672358FFFF2DF5026422FA254423FAA7 +S315001FBA7001649DFE0228026424FA00672358FFFF13 +S315001FBA802DF5026422FA2560DC62A2D3254323FC2E +S315001FBA9001B424FA00672358FFFFFCA3A3D12DF599 +S315001FBAA0026422FA254423FAA4D3006360400A37AE +S315001FBAB0016314370263323705635037086337371C +S315001FBAC006636E370B6324FC00672358FFFF2DF5B3 +S315001FBAD0046422FA254423FA86FF294487FF24FAA1 +S315001FBAE05AF358F18065C487007F25FA6444C487DA +S315001FBAF0007F26FA00672358FFFF2DF524F02560E7 +S315001FBB00D86522F2A5D902A864410A0200B9BFF37B +S315001FBB100703CD81E884FD02030424603862A2D99D +S315001FBB2000672358FFFF2DF520632460926146644A +S315001FBB3058D059D9FD1F24F02064D081FFFF02077A +S315001FBB4024FA0F0024609663C383012A0600CF835D +S315001FBB50A3D3CD81007FBDDB04030064C981BDDB98 +S315001FBB60FD0200672358FFFF2DF522F224F002A8DD +S315001FBB700160D6620902A2D96441324402B500B9F6 +S315001FBB80D484082802BC405200672358FFFF256053 +S315001FBB90DC64A0D3FFFF6040802713002DF522F23F +S315001FBBA024F002A80160E2620C02A2D96441324469 +S315001FBBB040B500B9D4840824030040BC02B5D48420 +S315001FBBC0405200672358FFFF2DF522F224F0016033 +S315001FBBD0E065A5D9AEF12061414B6443F0F363459F +S315001FBBE0106145D160400136060002360400043656 +S315001FBBF00200053A0200006401000164A1DB7DF327 +S315001FBC007EF1FFFFA084654302027DF3FFFF6041C3 +S315001FBC100B60D065F0F3FFFFE08444D36145A48039 +S315001FBC20FFFF0402E884A480FFFFFC03A4847FFBBC +S315001FBC3063456047106145D1FFFF9084A1DB6047D4 +S315001FBC4060458064E884A480FFFFFC03A4846345E9 +S315001FBC50186145D1A1DB0061E884FFFF0205DD8184 +S315001FBC60FB00E1810B60C46545D31261634545DB6B +S315001FBC702B414D8B64A3B20200672358FFFF2DF59E +S315001FBC8022F224F002A8006702022CF92BF923588E +S315001FBC90FFFF2DF524603E6122F224F202A800A8C0 +S315001FBCA009020703D0A030650304A7A05965010642 +S315001FBCB06544A1DB00672358FFFF2DF522F224F010 +S315001FBCC002A86444070201A802A802030103020096 +S315001FBCD0F2F900672358FFFF26601C64A0D32DF5D9 +S315001FBCE06040012601A46041E884D88422FA2544D5 +S315001FBCF023FA26601E63486502A1DB60584F9178C0 +S315001FBD00FFFF00672358FFFF2DF52460426522F2CF +S315001FBD1024F002A8006706026444CC84DC84010375 +S315001FBD200102A5D92358FFFF28F2D1F108B019F84F +S315001FBD305F02F5F3FFFF06A8604124020160BA63A4 +S315001FBD40BDD12BF8BDD1FFFF2CF8A3D12DF8FFFFD6 +S315001FBD50DAF12EF8DBF1FFFF2FF8DCF130F8FFFFE9 +S315001FBD6039F031F83AF0FFFF32F83BF033F8FFFFB6 +S315001FBD703CF035F83DF0FFFF36F83EF037F803602C +S315001FBD800864350050FE3CF0DAF32EF8D0803DF003 +S315001FBD90DBF32FF8D0803EF0DCF330F8D08061441F +S315001FBDA0020142FE2600032A110039F02BF83AF051 +S315001FBDB0FFFF2CF83BF02DF8FFFF85F131F886F1D8 +S315001FBDC0FFFF32F887F133F80864110039F031F8B4 +S315001FBDD03AF0FFFF32F83BF033F8FFFF85F12BF8FF +S315001FBDE086F1FFFF2CF887F12DF80160086429FA08 +S315001FBDF002FE2F58FFFF01600064604107FB16001B +S315001FBE000400036000646041170004600064604121 +S315001FBE1007FB05600064604107FB06600064604124 +S315001FBE2007FB0067010001672358FFFF01F306FBAD +S315001FBE30FFFF02F305FBE40082FF40630061A3D10D +S315001FBE4001644441A3DBA3D1FFFFD080E084050238 +S315001FBE50F90441402144A3DB040087FF036000610E +S315001FBE60E200006400F100FB444020F120FB444146 +S315001FBE700161614600F000FAE1816146444200F02B +S315001FBE8000FAE1816146444300F000FAE181614610 +S315001FBE90444400F000FAE1816146444500F000FA8F +S315001FBEA0E1816146444600F000FAE181614644475C +S315001FBEB000F000FAE1816146444800F000FAE18192 +S315001FBEC06146444900F000FAE1816146444A00F0A8 +S315001FBED000FAE1816146444B5A600F6420FB20F152 +S315001FBEE00161D08000F36702D080FFFF6403010069 +S315001FBEF0E181614600F2FFFFD080FFFF5C0320F265 +S315001FBF00FFFFD08061445703022BF200006420FB21 +S315001FBF100165654600F800F36541D08000F24B03CA +S315001FBF20D080FFFF4802E18104270D00614600F221 +S315001FBF30FFFFD080FFFF3F03B58600F2FFFFD080D3 +S315001FBF4061443903F000006400FA6544E0856540EA +S315001FBF50042BDF0002FE204400FB214420FB01616D +S315001FBF606146224400FAE1816146234400FAE181D9 +S315001FBF706146244400FAE1816146254400FAE181C5 +S315001FBF806146264400FAE1816146274400FAE181B1 +S315001FBF906146284400FAE1816146294400FAE1819D +S315001FBFA061462A4400FAE18161462B4400FA87FF65 +S315001FBFB0DF600578FFFF87FF03600161DF6013788D +S315001FBFC0FFFF00644051584F1800314507260300F4 +S315001FBFD0DF600978FFFFB581DF601378FFFF80649C +S315001FBFE04051584F0A00314507260400DF600D787F +S315001FBFF0FFFFB581DF601378FFFF08609064A0DD47 +S315001FC00030F1E0646440012A030008F108FB9EF941 +S315001FC01062FFE0601163A5FDFFFF1AFFD760EB7893 +S315001FC020FFFFF860296308609064A0DD30F1E064CB +S315001FC0306440012A030008F108FB9EF962FF31459F +S315001FC0402F58FFFFE0602E64A5FB1F6072620C6411 +S315001FC050A2DBFFFF2DFFD760EB78FFFF3869FFFFDD +S315001FC06068440116FD006844032A0100070003B552 +S315001FC07006600061B581DF601378FFFFDF6011780E +S315001FC080FFFF27F3FFFF60470FB46800FF672358C2 +S315001FC090FFFF1F6072650464A5DB12001F607265D7 +S315001FC0A00C64A5DB0D001F6072650664A5DBFFFF30 +S315001FC0B02DFF00672358FFFF1F6072650864A5DB0D +S315001FC0C0E060AB64A5FBFFFF2DFFD760EB78FFFF9A +S315001FC0D028F383FBA8FB0260EE64A7FB0764A9FB9A +S315001FC0E0E060AB64A5FBFFFFDFFE006419FFD760AE +S315001FC0F0EB78FFFF8D60C06308609064A0DD30F1B0 +S315001FC100E0646440012A030008F108FB9EF962FF00 +S315001FC110E0609063A5FDFFFF1AFFD760EB78FFFF76 +S315001FC120F860296308609064A0DD30F1E064644024 +S315001FC130012A030008F108FB9EF962FF28F51F601C +S315001FC14054631F602664BDDB6644BDDB0264A3DB4C +S315001FC150FFFF2BFFD3FE00672358FFFF0036990012 +S315001FC16001369C0002369F000336A6000436C20025 +S315001FC1700536C00006364A000736BC000836A8003A +S315001FC18009360C000A360D000B360E000C3644001D +S315001FC1900D3635000E3653000F36660002600064FA +S315001FC1A03000046000642D000064B4F1B5FB444BFD +S315001FC1B01F602C62A2D3FFFF00A860460EF21A036F +S315001FC1C020B02B410F02F0670EFA1F6054621F60EA +S315001FC1D03864A2DB66445ADB02645ADBFFFF2BFF7F +S315001FC1E05D8BE6001F605464404BD660584D5878EF +S315001FC1F0FFFFDE002B44B4FB0060016402002060D9 +S315001FC20000643245349200672358FFFF8E60B66381 +S315001FC21008609064A0DD05008E609B6308609064D3 +S315001FC220A0DD30F1E0646440012A030008F108FB39 +S315001FC2309EF962FFFFFF1AFF00672358FFFF116079 +S315001FC24002E88E60816308609064A0DD30F1E064CF +S315001FC2506440012A030008F108FB9EF962FFFFFFF5 +S315001FC2601AFF00672358FFFF116003E8D960FE64B9 +S315001FC2703245249299FF3547FFB407FB98FFF860B4 +S315001FC280296308609064A0DD30F1E0646440012AF0 +S315001FC290030008F108FB9EF962FF00672358FFFFA2 +S315001FC2A0020000FD8813040001FD6000000000204D +S315001FC2B039305554303130303030303001000100C4 +S315001FC2C000000000050002FD150001000400040027 +S315001FC2D0060003FD0000030002000100010000002C +S315001FC2E0060001000100010000000100010001001D +S315001FC2F00100060004FD0100020001000200060005 +S315001FC30001000200060001000200060001000200F3 +S315001FC31006000100020006000100020006000100DF +S315001FC32002000600010002000600010002000600CE +S315001FC33001000200060000000200010002000200C8 +S315001FC3400800FFFF5072696D6172792046277320BE +S315001FC350200001000100010001000400020001008D +S315001FC3600400030003000400040006000600050085 +S315001FC3700600060006000600060001000200010076 +S315001FC380020006001F000200090030000000040022 +S315001FC39001001000100002003031000000000000F4 +S315001FC3A000000100010001000200020040003200EF +S315001FC3B032000A00020006004000320036000A0062 +S315001FC3C00200060040003B00400017000700070060 +S315001FC3D04A0040004A001E000C00080057004D008E +S315001FC3E057002B00190008005D0053005D00310047 +S315001FC3F01F00080052323039343830302E48455825 +S315001FC400000090FF82609A7820FE91FF82609D78DF +S315001FC41020FEE000FFFFFFFFFFFF93FF83606578AD +S315001FC42020FE94FF83607E7820FEDE00FFFFFFFF65 +S315001FC430FFFF96FF8360BD7820FE9A829D82E9FFEB +S315001FC44065837E83F3FFBD830000000000000000AC +S315001FC45001000A0000000200FDFF00080200FCFFA9 +S315001FC4601001100100000000000000000000000085 +S315001FC4700000000000000000000000000000000097 +S315001FC4800000000000000000000000000000030084 +S315001FC4900000000000000000000000000000000077 +S315001FC4A000000000000000000000001B0000001B31 +S315001FC4B0001B000000000000000000000200020038 +S315001FC4C00000000000000000000000000000000047 +S315001FC4D00000000000000000000000000000000037 +S315001FC4E00000000000000000000000000000000027 +S315001FC4F00000000003000000000014000000000000 +S315001FC5000000000000000000000000000000000006 +S315001FC51000008213821300000000000000000000CC +S315001FC52000000000000000000000000000000000E6 +S315001FC53000000000000000000000000000000000D6 +S315001FC54000000000000000000000000000000000C6 +S315001FC5500000000020000000000000000000000096 +S315001FC56000000A000A000200000000000000000090 +S315001FC570000000EA00000000FF1F010064006400C5 +S315001FC580102710271400D007D00710272F003200BE +S315001FC59032000500020002001027050000020002FB +S315001FC5A013000A00070007000500080032000000FC +S315001FC5B00000000000000000000003000000010052 +S315001FC5C0000001004000320032000A00020006008F +S315001FC5D0000000002A092B092B0903000000010097 +S315001FC5E0006E0014010000000000000000000000A3 +S315001FC5F00000000000000000000000000000000016 +S315001FC6000000000000000000000000000000000005 +S315001FC61000000000000000000000000000000000F5 +S315001FC62000000000000000000000000000000000E5 +S315001FC63000000000000000000000000000000000D5 +S315001FC64000000000000000000000000000000000C5 +S315001FC65000000000000000000000000000000000B5 +S315001FC66000000000000000000000000000000000A5 +S315001FC67000000000000029F8000A100168A4B0019C +S315001FC6808401303331334444303331333033313323 +S315001FC6903233323390007804AEE40D000000000000 +S315001FC6A0000000000000000000000D000000000058 +S315001FC6B0000000000000000000000D000000000048 +S315001FC6C0000000000000000000000D000000000038 +S315001FC6D00000000000000000000000000000000035 +S315001FC6E00000000000000000000000000000000025 +S315001FC6F00000000000000000000000000000000015 +S315001FC7000000000000000000000000000000000004 +S315001FC71000000000000000000000000000000000F4 +S315001FC72000000000000000000000000000000000E4 +S315001FC73000000000000000000000000000000000D4 +S315001FC74000000000000000000000000000000000C4 +S315001FC75000000000000000000000000000000000B4 +S315001FC76000000000000000000000000000000000A4 +S315001FC7700000000000000000000000000000000094 +S315001FC7800000000000000000000000000000000084 +S315001FC79000000000000000000000A5C684F899EE06 +S315001FC7A08DF60DFFBDD6B1DE549150600302A9CEA2 +S315001FC7B07D5619E762B5E64D9AEC458F9D1F408958 +S315001FC7C087FA15EFEBB2C98E0BFBEC4167B3FD5F22 +S315001FC7D0EA45BF23F75396E45B9BC2751CE1AE3D4A +S315001FC7E06A4C5A6C417E02F54F835C68F45134D112 +S315001FC7F008F993E273AB53623F2A0C0852956546BC +S315001FC8005E9D2830A1370F0AB52F090E36249B1BB4 +S315001FC8103DDF26CD694ECD7F9FEA1B129E1D7458A4 +S315001FC8202E342D36B2DCEEB4FB5BF6A44D7661B723 +S315001FC830CE7D7B523EDD715E9713F5A668B900006B +S315001FC8402CC160401FE3C879EDB6BED4468DD967AB +S315001FC8504B72DE94D498E8B04A856BBB2AC5E54F68 +S315001FC86016EDC586D79A55669411CF8A10E9060428 +S315001FC87081FEF0A04478BA25E34BF3A2FE5DC0808B +S315001FC8808A05AD3FBC21487004F1DF63C17775AFE0 +S315001FC890634230201AE50EFD6DBF4C8114183526F4 +S315001FC8A02FC3E1BEA235CC88392E5793F25582FC91 +S315001FC8B0477AACC8E7BA2B3295E6A0C09819D19E25 +S315001FC8C07FA366447E54AB3B830BCA8C29C7D36BAD +S315001FC8D03C2879A7E2BC1D1676AD3BDB56644E7429 +S315001FC8E01E14DB920A0C6C48E4B85D9F6EBDEF43C5 +S315001FC8F0A6C4A839A43137D38BF232D5438B596ED0 +S315001FC900B7DA8C0164B1D29CE049B4D8FAAC07F30C +S315001FC91025CFAFCA8EF4E9471810D56F88F06F4A36 +S315001FC920725C2438F157C773519723CB7CA19CE8BF +S315001FC930213EDD96DC61860D850F90E0427CC47139 +S315001FC940AACCD890050601F7121CA3C25F6AF9AEDE +S315001FC950D06991175899273AB92738D913EBB32BB2 +S315001FC9603322BBD270A98907A733B62D223C921555 +S315001FC97020C94987FFAA78507AA58F03F8598009DD +S315001FC980171ADA6531D7C684B8D0C382B029775A49 +S315001FC990111ECB7BFCA8D66D3A2C000000000000B0 +S315001FC9A000000000000000000000010A021405320A +S315001FC9B00B3708500B6E0000010002003F000C00F1 +S315001FC9C0300003000F003E003C00020004000A0076 +S315001FC9D00B00100016000000000000000000000001 +S315001FC9E00000000000000000000000000000000022 +S315001FC9F00000000000000000000000000000000012 +S315001FCA000000000000000000000000000000000001 +S315001FCA1000000000000000000000000000000000F1 +S315001FCA2000000000000000000000000000000000E1 +S315001FCA3000000000000000000000000000000000D1 +S315001FCA4000000000000000000000000000000000C1 +S315001FCA5000000000000000000000000000000000B1 +S315001FCA6000000000000000000000000000000000A1 +S315001FCA700000000000000000000000000000000091 +S315001FCA800000000000000000000000000000000081 +S315001FCA900000000000000000000000000000000071 +S315001FCAA00000000000000000000000000000000061 +S315001FCAB00000000000000000000000000000000051 +S315001FCAC00000000000000000000000000000000041 +S315001FCAD00000000000000000000000000000000031 +S315001FCAE00000000000000000000000000000000021 +S315001FCAF00000000000000000000000000000000011 +S315001FCB000000000000000000000000000000000000 +S315001FCB1000000000000000000000000000000000F0 +S315001FCB2000000000000000000000000000000000E0 +S315001FCB3000000000000000000000000000000000D0 +S315001FCB4000000000000000000000000000000000C0 +S315001FCB5000000000000000000000000000000000B0 +S315001FCB6000000000000000000000000000000000A0 +S315001FCB700000000000000000000000000000000090 +S315001FCB800000000000000000000000000000000080 +S315001FCB900000000000000000000000000000000070 +S315001FCBA00000000000000000000000000000000060 +S315001FCBB00000000000000000000000000000000050 +S315001FCBC00000000000000000000000000000000040 +S315001FCBD00000000000000000000000000000000030 +S315001FCBE00000000000000000000000000000000020 +S315001FCBF00000000000000000000000000000000010 +S315001FCC0000000000000000000000000000000000FF +S315001FCC1000000000000000000000000000000000EF +S315001FCC2000000000000000000000000000000000DF +S315001FCC3000000000000000000000000000000000CF +S315001FCC4000000000000000000000000000000000BF +S315001FCC5000000000000000000000000000000000AF +S315001FCC60000000000000000000000000000000009F +S315001FCC70000000000000000000000000000000008F +S315001FCC80000000000000000000000000000000007F +S315001FCC90000000000000000000000000000000006F +S315001FCCA0000000000000000000000000000000005F +S315001FCCB0000000000000000000000000000000004F +S315001FCCC0000000000000000000000000000000003F +S315001FCCD0000000000000000000000000000000002F +S315001FCCE0000000000000000000000000000000001F +S315001FCCF0000000000000000000000000000000000F +S315001FCD0000000000000000000000000000000000FE +S315001FCD1000000000000000000000000000000000EE +S315001FCD2000000000000000000000000000000000DE +S315001FCD3000000000000000000000000000000000CE +S315001FCD4000000000000000000000000000000000BE +S315001FCD5000000000000000000000000000000000AE +S315001FCD60000000000000000000000000000000009E +S315001FCD70000000000000000000000000000000008E +S315001FCD80000000000000000000000000000000007E +S315001FCD90000000000000000000000000000000006E +S315001FCDA0000000000000000000000000000000005E +S315001FCDB0000000000000000000000000000000004E +S315001FCDC0000000000000000000000000000000003E +S315001FCDD0000000000000000000000000000000002E +S315001FCDE0000000000000000000000000000000001E +S315001FCDF0000000000000000000000000000000000E +S315001FCE0000000000000000000000000000000000FD +S315001FCE1000000000000000000000000000000000ED +S315001FCE2000000000000000000000000000000000DD +S315001FCE3000000000000000000000000000000000CD +S315001FCE4000000000000000000000000000000000BD +S315001FCE5000000000000000000000000000000000AD +S315001FCE60000000000000000000000000000000009D +S315001FCE70000000000000000000000000000000008D +S315001FCE80000000000000000000000000000000007D +S315001FCE90000000000000000000000000000000006D +S315001FCEA0000000000000000000000000000000005D +S315001FCEB0000000000000000000000000000000004D +S315001FCEC0000000000000000000000000000000003D +S315001FCED0000000000000000000000000000000002D +S315001FCEE0000000000000000000000000000000001D +S315001FCEF0000000000000000000000000000000000D +S315001FCF0000000000000000000000000000000000FC +S315001FCF1000000000000000000000000000000000EC +S315001FCF2000000000000000000000000000000000DC +S315001FCF3000000000000000000000000000000000CC +S315001FCF4000000000000000000000000000000000BC +S315001FCF5000000000000000000000000000000000AC +S315001FCF60000000000000000000000000000000009C +S315001FCF70000000000000000000000000000000008C +S315001FCF80000000000000000000000000000000007C +S315001FCF90000000000000000000000000000000006C +S315001FCFA0000000000000000000000000000000005C +S315001FCFB0000000000000000000000000000000004C +S315001FCFC0000000000000000000000000000000003C +S315001FCFD0000000000000000000000000000000002C +S315001FCFE0000000000000000000000000000000001C +S315001FCFF0000000000000000000000000000000000C +S315001FD00000000000000000000000000000000000FB +S315001FD01000000000000000000000000000000000EB +S315001FD02000000000000000000000000000000000DB +S315001FD03000000000000000000000000000000000CB +S315001FD04000000000000000000000000000000000BB +S315001FD05000000000000000000000000000000000AB +S315001FD060000000000000000000000000000000009B +S315001FD070000000000000000000000000000000008B +S315001FD080000000000000000000000000000000007B +S315001FD090000000000000000000000000000000006B +S315001FD0A0000000000000000000000000000000005B +S315001FD0B0000000000000000000000000000000004B +S315001FD0C0000000000000000000000000000000003B +S315001FD0D0000000000000000000000000000000002B +S315001FD0E0000000000000000000000000000000001B +S315001FD0F0000000000000000000000000000000000B +S315001FD10000000000000000000000000000000000FA +S315001FD11000000000000000000000000000000000EA +S315001FD12000000000000000000000000000000000DA +S315001FD13000000000000000000000000000000000CA +S315001FD14000000000000000000000000000000000BA +S315001FD15000000000000000000000000000000000AA +S315001FD160000000000000000000000000000000009A +S315001FD170000000000000000000000000000000008A +S315001FD180000000000000000000000000000000007A +S315001FD190000000000000000000000000000000006A +S315001FD1A0000000000000000000000000000000005A +S315001FD1B0000000000000000000000000000000004A +S315001FD1C0000000000000000000000000000000003A +S315001FD1D0000000000000000000000000000000002A +S315001FD1E0000000000000000000000000000000001A +S315001FD1F0000000000000000000000000000000000A +S315001FD20000000000000000000000000000000000F9 +S315001FD21000000000000000000000000000000000E9 +S315001FD22000000000000000000000000000000000D9 +S315001FD23000000000000000000000000000000000C9 +S315001FD24000000000000000000000000000000000B9 +S315001FD25000000000000000000000000000000000A9 +S315001FD2600000000000000000000000000000000099 +S315001FD2700000000000000000000000000000000089 +S315001FD2800000000000000000000000000000000079 +S315001FD2900000000000000000000000000000000069 +S315001FD2A00000000000000000000000000000000059 +S315001FD2B00000000000000000000000000000000049 +S315001FD2C00000000000000000000000000000000039 +S315001FD2D00000000000000000000000000000000029 +S315001FD2E00000000000000000000000000000000019 +S315001FD2F00000000000000000000000000000000009 +S315001FD30000000000000000000000000000000000F8 +S315001FD31000000000000000000000000000000000E8 +S315001FD32000000000000000000000000000000000D8 +S315001FD33000000000000000000000000000000000C8 +S315001FD34000000000000000000000000000000000B8 +S315001FD35000000000000000000000000000000000A8 +S315001FD3600000000000000000000000000000000098 +S315001FD3700000000000000000000000000000000088 +S315001FD3800000000000000000000000000000000078 +S315001FD3900000000000000000000000000000000068 +S315001FD3A00000000000000000000000000000000058 +S315001FD3B00000000000000000000000000000000048 +S315001FD3C00000000000000000000000000000000038 +S315001FD3D00000000000000000000000000000000028 +S315001FD3E00000000000000000000000000000000018 +S315001FD3F00000000000000000000000000000000008 +S315001FD40000000000000000000000000000000000F7 +S315001FD41000000000000000000000000000000000E7 +S315001FD42000000000000000000000000000000000D7 +S315001FD43000000000000000000000000000000000C7 +S315001FD44000000000000000000000000000000000B7 +S315001FD45000000000000000000000000000000000A7 +S315001FD4600000000000000000000000000000000097 +S315001FD4700000000000000000000000000000000087 +S315001FD4800000000000000000000000000000000077 +S315001FD4900000000000000000000000000000000067 +S315001FD4A00000000000000000000000000000000057 +S315001FD4B00000000000000000000000000000000047 +S315001FD4C00000000000000000000000000000000037 +S315001FD4D00000000000000000000000000000000027 +S315001FD4E00000000000000000000000000000000017 +S315001FD4F00000000000000000000000000000000007 +S315001FD50000000000000000000000000000000000F6 +S315001FD51000000000000000000000000000000000E6 +S315001FD52000000000000000000000000000000000D6 +S315001FD53000000000000000000000000000000000C6 +S315001FD54000000000000000000000000000000000B6 +S315001FD55000000000000000000000000000000000A6 +S315001FD5600000000000000000000000000000000096 +S315001FD5700000000000000000000000000000000086 +S315001FD5800000000000000000000000000000000076 +S315001FD5900000000000000000000000000000000066 +S315001FD5A00000000000000000000000000000000056 +S315001FD5B00000000000000000000000000000000046 +S315001FD5C00000000000000000000000000000000036 +S315001FD5D00000000000000000000000000000000026 +S315001FD5E00000000000000000000000000000000016 +S315001FD5F00000000000000000000000000000000006 +S315001FD60000000000000000000000000000000000F5 +S315001FD61000000000000000000000000000000000E5 +S315001FD620000000004018000000000000000000007D +S315001FD63000000000000000000000000000000000C5 +S315001FD64000000000000000000000000000000000B5 +S315001FD65000000000000000000000000000000000A5 +S315001FD660000000000000000000000000000006008F +S315001FD6700000000000000000000000000000000085 +S315001FD6800000000000000000000000000000000075 +S315001FD6900000000000000000000000000000000065 +S315001FD6A00000000000000000000000000000000055 +S315001FD6B00000000000000000000000000000000045 +S315001FD6C00000000000000000000000000000000035 +S315001FD6D00000000000000000000000000000000025 +S315001FD6E00000000000000000000000000000000015 +S315001FD6F00000000000000000000000000000000005 +S315001FD70000000000000000000000000000000000F4 +S315001FD71000000000000000000000000000000000E4 +S315001FD72000000000000000000000000000000000D4 +S315001FD73000000000000000000000000000000000C4 +S315001FD74000000000000000000000000000000000B4 +S315001FD75000000000000000000000000000000000A4 +S315001FD7600000000000000000000000000000000094 +S315001FD7700000000000000000000000000000000084 +S315001FD7800000000000000000000000000000000074 +S315001FD7900000000000000000000000000000000064 +S315001FD7A00000000000000000000000000000000054 +S315001FD7B00000000000000000000000000000000044 +S315001FD7C00000000000000000000000000000000034 +S315001FD7D00000000000000000000000000000000024 +S315001FD7E00000000000000000000000000000000014 +S315001FD7F00000000000000000000000000000000004 +S315001FD80000000000000000000000000000000000F3 +S315001FD81000000000000000000000000000000000E3 +S315001FD82000000000000000000000000000000000D3 +S315001FD83000000000000000000000000000000000C3 +S315001FD84000000000000000000000000000000000B3 +S315001FD85000000000000000000000000000000000A3 +S315001FD8600000000000000000000000000000000093 +S315001FD8700000000000000000000000000000000083 +S315001FD8800000000000000000000007D863D890D8F1 +S315001FD890C9D854D654D654D654D654D654D6D9D815 +S315001FD8A0F5D854D654D654D654D654D682DA54D62E +S315001FD8B054D654D654D654D654D654D654D654D6F3 +S315001FD8C054D654D654D654D654D654D6DBDA2BDA7D +S315001FD8D054D654D654D654D654D654D654D654D6D3 +S315001FD8E054D654D654D654D654D650DA6ADA54D6A9 +S315001FD8F054D654D654D654D654D641E054D654D6BC +S315001FD90054D654D654D654D654D6F7BCCBBC70D89E +S315001FD9109DD801FD0EDD04DBAAC2060000FD0EDD4B +S315001FD92004DBA4C2020002FD0EDD04DBC8C2080030 +S315001FD93003FD0EDD04DBD4C20A0004FD0EDD04DB8D +S315001FD940F6C20A000AFD0EDD04DBB0C20C000BFD99 +S315001FD9500EDD04DBBCC2080009FD0EDD04DBDEC2E2 +S315001FD9600A000CFD0EDD04DBE8C20A000DFD0EDD0C +S315001FD97004DB36C30A00E0FC23DB3FDE580002004F +S315001FD980FDFF23DB04DB60000200FCFF23DB04DB5F +S315001FD99066000200F9FF23DB4FDB08010200F7FFD9 +S315001FD9A023DB4FDB2C240600F0FF23DB04DB000008 +S315001FD9B00002F6FF23DB4FDB7C000200F4FF23DBB4 +S315001FD9C04FDBDA010200F5FF23DB49DE3E240200AE +S315001FD9D0FAFF23DB84DE4224020003FC23DB7DDD0A +S315001FD9E0D825020004FC23DB48DB4624220006FC64 +S315001FD9F023DB4FDB4024020007FC23DB4FDB8A249B +S315001FDA0002000EFC23DB93DD94242200B0FCF5DA22 +S315001FDA10D1DB00000000B1FC23DBC5DB9025020033 +S315001FDA20B4FCF5DA34DC00000000B6FCF5DAD3DC12 +S315001FDA3000000000B5FC23DB5DDEE401020020FCD4 +S315001FDA4023DB4FDBBC24020021FC23DB4FDBBE2480 +S315001FDA50020023FC23DB4FDBC224020025FC23DB51 +S315001FDA604FDBC624020026FC23DB4FDBC824020043 +S315001FDA7027FC23DB4FDBCA240200B2FC23DB48DB77 +S315001FDA80B4252200C2FC23DB4FDBD625020000FC97 +S315001FDA9023DB4FDB4424020001FC23DB4FDB2C245A +S315001FDAA0060002FC23DB33DB9225220005FC23DB69 +S315001FDAB04FDB3A24020008FC23DB4FDB322406002F +S315001FDAC009FC23DB4FDB8C2402000BFC23DB4FDB23 +S315001FDAD08E2402000CFC23DB4FDB902402000DFC7E +S315001FDAE023DB4FDB9224020080FC6CDB7CDBD02423 +S315001FDAF0C00081FC23DB4FDBD801020083FC23DB44 +S315001FDB004FDBDC01020084FC23DBE4DDE0010200C5 +S315001FDB1085FC23DBB4DDD601020086FC23DBC7DDD3 +S315001FDB20E201020028FC23DB4FDBCC24020087FC2A +S315001FDB3023DB4FDB8826220310FD23DB04DB7E015C +S315001FDB40020011FD0EDD04DB96C30C0012FD0EDD77 +S315001FDB5004DBA2C3020014FD23DB04DBDA25060067 +S315001FDB6013FDEADC04DB0004E00145FD23DB04DBD7 +S315001FDB700801020047FD23DB04DB8201020048FD8A +S315001FDB8026DD04DBAA01020049FD26DD04DBAC010C +S315001FDB9002004AFD23DB04DBA20102004BFD23DB4F +S315001FDBA004DBA40102004DFD0EDD04DBA4C304004B +S315001FDBB04FFD40DD04DBDC250200C0FD0EDD04DB6E +S315001FDBC0A8C30200C1FD23DB04DB06010200C2FD60 +S315001FDBD033DD04DB00000200C3FD0EDD04DBAAC338 +S315001FDBE00200C6FD23DB04DBE4250A0088FD23DBD8 +S315001FDBF004DB0001020020FD0EDD04DB84C30800E8 +S315001FDC0021FD0EDD04DB8CC30A0022FD0EDD04DBC5 +S315001FDC1052C3280023FD0EDD04DB7AC30A0040FD34 +S315001FDC2061DB04DBEA01020041FD23DB04DBF8258F +S315001FDC30220042FD23DB04DB0A01060043FD67DDEC +S315001FDC4004DB0000060044FD4DDD04DBE601020097 +S315001FDC5046FD23DB04DBCA010C004CFD23DB04DB82 +S315001FDC601A26020050FD23DB04DBFC00020051FDD7 +S315001FDC7023DB04DBFE00020052FD23DB04DBC801AD +S315001FDC8002008CFD6CDE04DB000000008DFD23DB33 +S315001FDC9004DB7626120091FD23DB04DBFA1E02004D +S315001FDCA000F14600D9DA420101F10407D7DA44012F +S315001FDCB0050244C3F4C380010601B4010A014601EB +S315001FDCC0EA0160236401FA1E206400003C1600006E +S315001FDCD040185E010A00C6005031303130343030F2 +S315001FDCE0000000000000000000000000000000000F +S315001FDCF000000000000000000000000000000000FF +S315001FDD0000000000000000000000000000000000EE +S315001FDD1000000000000000000000000000000000DE +S315001FDD2000000000000000000000000000000000CE +S315001FDD3000000000000000000000000000000000BE +S315001FDD4000000000000000000000000000000000AE +S315001FDD50000000000000000000000000000000009E +S315001FDD60000000000000000000003FFFB9FEA9C828 +S315001FDD70B3C8CBFE46C831FFBED3CBD33FD4A1D346 +S315001FDD80D2D3CBD342D453D453D453D45CD477D425 +S315001FDD90FAD41FD5A4D3C3D393D400001000120006 +S315001FDDA01300200021002200300031003200330012 +S315001FDDB03400350036003700380039003A000000BD +S315001FDDC01401140114011401140114011401140186 +S315001FDDD0F302AA0360040405070608070A081609C2 +S315001FDDE0440A040B400C800D000EBF0F01101011CA +S315001FDDF00214402032213222042301240F2500263B +S315001FDE00002700280029002A012B062C003800397C +S315001FDE10D63A003B003C143D7F3E003F68407541AB +S315001FDE200742074300453B4A004B004C024D027513 +S315001FDE3080003F013F013F013F013F013F013F017D +S315001FDE403F013F013F013F013F013F013F013F01AD +S315001FDE503F013F013E013E013D013D013C013C01A9 +S315001FDE603B013B013A013A013901390138013801B9 +S315001FDE7037013701360136013501350134013401C9 +S315001FDE8033013301320132013101310130013001D9 +S315001FDE907B017B017A017A01790179017801780189 +S315001FDEA07701770176017601750175017401740199 +S315001FDEB073017301720172017101710170017001A9 +S315001FDEC068016801670167016601660165016501F1 +S315001FDED05701570156015601550155015401540169 +S315001FDEE05301530152015201510151015001500179 +S315001FDEF048014801470147014601460145014501C1 +S315001FDF0044014401430143014201420141014101D0 +S315001FDF1040014001400140014001400140014001D4 +S315001FDF2040014001400140014001400140014001C4 +S315001FDF30400180128012801280128012801280127D +S315001FDF40801280128012801280128012801280131B +S315001FDF508013801380138013801380138013801304 +S315001FDF6080138013801380138013514451445144EE +S315001FDF7051445144514451445144514451445144D4 +S315001FDF8051445144514419461946194619461946D2 +S315001FDF901946194619461946194619461946194664 +S315001FDFA01946144714471447144714471447144770 +S315001FDFB01447154715471547154715471547B648BB +S315001FDFC0E4481348414870489E48CD48FB482A48B4 +S315001FDFD058488748B648E448544857495749584906 +S315001FDFE05849584958495849584959495949594901 +S315001FDFF0594959495A49224622462246224622460D +S315001FE00022462246224622462246224623462346A9 +S315001FE01023461C471C471C471C471C471C471C47BD +S315001FE0201C471C471C471C471C471C471D479A4833 +S315001FE030DA481A485A489A48DA481A485A489A48AB +S315001FE040DA481A485A489A483348784978497949E4 +S315001FE0507949794979497A497A497A497A497B4985 +S315001FE0607B497B497C4900008000C4000000810079 +S315001FE070140000008100640000008100B40000004D +S315001FE0808200040000008200540000008200A400E9 +S315001FE09000008200F400000083004400000083009B +S315001FE0A0940000008300E400000084003400000098 +S315001FE0B0840084000000850044000C00040000005A +S315001FE0C02200040000001A000400000036000400AD +S315001FE0D000000100040000002900040000001500D4 +S315001FE0E0040000003D00040000000B0004000000B7 +S315001FE0F02700040000001F000400000030008400F9 +S315001FE10000000400840000000A00840000003200A2 +S315001FE11046005A006E0082009600AA00BE00D2007A +S315001FE120E600FA000E01220152010100020003005F +S315001FE130040005000600070000000100020003009E +S315001FE140040005000600000000000000000000009B +S315001FE150000000000000000000000000000000009A +S315001FE160000000000000000000000000000000008A +S315001FE170000000000000000000000000000000007A +S315001FE1800000000000000000030015006E6F6E2DDA +S315001FE190737065636966696564205353494420211A +S315001FE1A021202020202020202020202001000020A8 +S315001FE1B0202020202020202020202020202020203A +S315001FE1C02020202020202020202020202020000961 +S315001FE1D0000001006400640000004845524D45538D +S315001FE1E02049002020202020202020202020202001 +S315001FE1F020202020202020202020010000000100B8 +S315001FE20000000100010002000100000001000100E2 +S315001FE21001000000000000000000000000000300D5 +S315001FE22000000100000001000000030015006E6FD2 +S315001FE2306E2D73706563696669656420535349441F +S315001FE24020212120202020202020202020200100E6 +S315001FE2502020202020202020202020202020202099 +S315001FE2602020202020202020202020202020202089 +S315001FE2700009000001006400640000004845524D7B +S315001FE2804553204900202020202020202020202008 +S315001FE29020202020202020202020202001000000D8 +S315001FE2A00100000001000100020001000000010042 +S315001FE2B00100010000000000000000000000000037 +S315001FE2C00000000000000000000000000000000029 +S315001FE2D00000000000000000000000000000000019 +S315001FE2E00000000000000000000000000000000009 +S315001FE2F000000000000000000000000000000000F9 +S315001FE30000000000000000000000000000000000E8 +S315001FE31000000000000000000000000000000000D8 +S315001FE32000000000000000000000000000000000C8 +S315001FE33000000000000000000000000000000000B8 +S315001FE34000000000000000000000000000000000A8 +S315001FE3500000000000000000000000000000000098 +S315001FE3600000000000000000000000000000000088 +S315001FE3700000000000000700000046697273742049 +S315001FE380576176654C414E204949205353494420D5 +S315001FE3902020202020202020202000002020202098 +S315001FE3A02020202020202020202020202020202048 +S315001FE3B020202020202020202020202000000300B5 +S315001FE3C0000000000300000000000200828400001D +S315001FE3D00000000002000204000000000000000010 +S315001FE3E02043757272656E74205365727669636514 +S315001FE3F020536574204964656E7469666965722069 +S315001FE40000000200000000000000000000000000E5 +S315001FE41000000000000000000000000000000000D7 +S315001FE42000000000000000000000000000000000C7 +S315001FE43000000000000000000000000000000000B7 +S315001FE44000000000000000000000000000000000A7 +S315001FE4500000000000000000000000000000000097 +S315001FE4600000000000000000000000000000000087 +S315001FE4700000000000000000000000000000000077 +S315001FE4800000000000000000000000000000000067 +S315001FE4900000000000000000000000000000000057 +S315001FE4A00000000000000000000000000000000047 +S315001FE4B00000000000000000000000000000000037 +S315001FE4C00000000000000000000000000000000027 +S315001FE4D00000000000000000000000000000000017 +S315001FE4E00000000000000000000000000000000007 +S315001FE4F000000000000000000000000000000000F7 +S315001FE50000000000000000000000000000000000E6 +S315001FE51000000000000000000000000000000000D6 +S315001FE52000000000000000000000000000000000C6 +S315001FE53000000000000000000000000000000000B6 +S315001FE54000000000000000000000000000000000A6 +S315001FE5500000000000000000000000000000000096 +S315001FE5600000000000000000000000000000000086 +S315001FE5700000000000000000000000000000000076 +S315001FE5800000000000000000000000000000000066 +S315001FE5900000000000000000000000000000000056 +S315001FE5A00000000000000000000000000000000046 +S315001FE5B00000000000000000000000000000000036 +S315001FE5C00000000000000000000000000000000026 +S315001FE5D00000000000000000000000000000000016 +S315001FE5E00000000000000000000000000000000006 +S315001FE5F000000000000000000000000000000000F6 +S315001FE60000000000000000000000000000000000E5 +S315001FE61000000000000000000000000000000000D5 +S315001FE62000000000000000000000000000000000C5 +S315001FE63000000000000000000000000000000000B5 +S315001FE64000000000000000000000000000000000A5 +S315001FE6500000000000000000000000000000000095 +S315001FE6600000000000000000000000000000000085 +S315001FE6700000000000000000000000000000000075 +S315001FE6800000000000000000000000000000000065 +S315001FE6900000000000000000000000000000000055 +S315001FE6A00000000000000000000000000000000045 +S315001FE6B00000000000000000000000000000000035 +S315001FE6C00000000000000000000000000000000025 +S315001FE6D00000000000000000000000000000000015 +S315001FE6E00000000000000000000000000000000005 +S315001FE6F000000000000000000000000000000000F5 +S315001FE70000000000000000000000000000000000E4 +S315001FE71000000000000000000000000000000000D4 +S315001FE72000000000000000000000000000000000C4 +S315001FE73000000000000000000000000000000000B4 +S315001FE74000000000000000000000000000000000A4 +S315001FE7500000000000000000000000000000000094 +S315001FE7600000000000000000000000000000000084 +S315001FE7700000000000000000000000000000000074 +S315001FE7800000000000000000000000000000000064 +S315001FE7900000000000000000000000000000000054 +S315001FE7A00000000000000000000000000000000044 +S315001FE7B00000000000000000000000000000000034 +S315001FE7C00000000000000000000000000000000024 +S315001FE7D00000000000000000000000000000000014 +S315001FE7E00000000000000000000000000000000004 +S315001FE7F000000000000000000000000000000000F4 +S315001FE800FFFF84605A78FFFFFFFFFFFFFFFFFFFF39 +S315001FE810FFFF84605B7841FFFFFFFFFFFFFFFFFFE6 +S315001FE820FFFF84606078C4E2FFFFFFFFFFFFFFFF6B +S315001FE830FFFFF860067843FFFFFFFFFFFFFFFFFFA5 +S315001FE840FFFF44FF84607F78FFFFFFFFFFFFFFFF8F +S315001FE850FFFF8460827844E2FFFFFFFFFFFFFFFF99 +S315001FE860FFFF8460837846FFFFFFFFFFFFFFFFFF69 +S315001FE870FFFF84608478FFFFFFFFFFFFFFFFFFFF9F +S315001FE880FFFF88602A784C4EFFFFFFFFFFFFFFFF49 +S315001FE890FFFF876096784CE2FFFFFFFFFFFFFFFF3A +S315001FE8A0FFFFC4E284FF225882FFFFFFFFFFFFFF27 +S315001FE8B0FFFFF8605C7843FFFFFFFFFFFFFFFFFFCF +S315001FE8C0FFFF016440408760B178B9F3FFFFFFFF88 +S315001FE8D0FFFFD1601C7864E2FFFFFFFFFFFFFFFF12 +S315001FE8E0FFFF8760F67846FFFFFFFFFFFFFFFFFF73 +S315001FE8F0FFFF87608F7847FFFFFFFFFFFFFFFFFFC9 +S315001FE900FFFFC760A278FFFFFFFFFFFFFFFFFFFFAD +S315001FE910FFFFC760D278FFFFFFFFFFFFFFFFFFFF6D +S315001FE920FFFFC660A97842FFFFFFFFFFFFFFFFFF44 +S315001FE930FFFFC660A97843FFFFFFFFFFFFFFFFFF33 +S315001FE940FFFFC660A97844FFFFFFFFFFFFFFFFFF22 +S315001FE950FFFFFF603B7845FFFFFFFFFFFFFFFFFF46 +S315001FE960FFFFC660AC78FFFFFFFFFFFFFFFFFFFF44 +S315001FE970FFFF00608364802909FB47FFC760667835 +S315001FE980FFFF40FFD5607878FFFFFFFFFFFFFFFF08 +S315001FE990FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF62 +S315001FE9A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF52 +S315001FE9B0FFFFD560A478FFFFFFFFFFFFFFFFFFFFED +S315001FE9C0FFFFCF60BD78FFFFFFFFFFFFFFFFFFFFCA +S315001FE9D0FFFFCF603678FFFFFFFFFFFFFFFFFFFF41 +S315001FE9E0FFFFC860ED78FFFFFFFFFFFFFFFFFFFF81 +S315001FE9F0FFFFA1FFFFFFD33FFFFFFFFFFFFFFFFF4C +S315001FEA00FFFFD160AD7840FFFFFFFFFFFFFFFF0055 +S315001FEA10FFFF41FFFFFFFFFFFFFFFFFFFFFFFF009E +S315001FEA20FFFFD160A878FFFFFFFFFFFFFFFFFF007B +S315001FEA30FFFFB0FFBCFEB1FFD160AD78FFFFFF0047 +S315001FEA40FFFFD160A878FFFFFFFFFFFFFFFFFF005B +S315001FEA50FFFFD460C17845FFFFFFFFFFFFFFFF00E9 +S315001FEA60FFFFD160A87884E2FFFFFFFFFFFFFF00D3 +S315001FEA70FFFFD160A878FFFFFFFFFFFFFFFFFF002B +S315001FEA80FFFF8E60E878FFFFFFFFFFFFFFFFFFFF1F +S315001FEA90FFFFBD60BE78FFFFFFFFFFFFFFFFFFFF0A +S315001FEAA0FFFF8E60F0780079FFFFFFFFFFFFFFFF7C +S315001FEAB0FFFF8E60F07824E2FFFFFFFFFFFFFFFFDF +S315001FEAC0FFFFBC60AC78FFFFFFFFFFFFFFFFFFFFED +S315001FEAD0FFFF8E60F07844E2FFFFFFFFFFFFFFFF9F +S315001FEAE0FFFF8E60F07884E2FFFFFFFFFFFFFFFF4F +S315001FEAF0FFFF8E60F07847FFFFFFFFFFFFFFFFFF5F +S315001FEB00FFFFD7601A78FFFFFFFFFFFFFFFFFFFF23 +S315001FEB10FFFFD760EE78FFFFFFFFFFFFFFFFFFFF3F +S315001FEB20FFFFD760F978FFFFFFFFFFFFFFFFFFFF24 +S315001FEB30FFFF28E2D760EB78FFFFFFFFFFFFFFFF16 +S315001FEB40FFFFD760EB7844FFFFFFFFFFFFFFFFFFCD +S315001FEB50FFFFD760EB7845FFFFFFFFFFFFFFFFFFBC +S315001FEB60FFFFD760EB7846FFFFFFFFFFFFFFFFFFAB +S315001FEB70FFFF00608764802909FB47FFD760EB789A +S315001FEB800000000000000000000000000000000060 +S315001FEB900000000000000000000000000000000050 +S315001FEBA00000000000000000000000000000000040 +S315001FEBB00000000000000000000000000000000030 +S315001FEBC00000000000000000000000000000000020 +S315001FEBD00000000000000000000000000000000010 +S315001FEBE00000000000000000000000000000000000 +S315001FEBF000000000000000000000000000000000F0 +S315001EF000FFFFFFFFFFFFA1FF2C45D03F41FF4551EC +S315001EF0109FFE03048460AA78FFFF29440522F3009D +S315001EF02004260500012AEF008460187844FF08268E +S315001EF030EA0084608578FFFF37F308290A006040DE +S315001EF04007220700FEB437FB274410BCF7B440471F +S315001EF05043FF00643ADB0864314001260A64404CD3 +S315001EF06019FF2044012A03008760B178B9F338F3EB +S315001EF070006100BC00646E022744102613009FFE2A +S315001EF080020402E109003EE13144012A0500070A95 +S315001EF0907FE1314008267FE1A1FFFFFFD13F8A6055 +S315001EF0A0B678FFFF27440826FFFFD060C578FFFF0E +S315001EF0B01AFF88601978FFFF4EF337F1006364402C +S315001EF0C00722430031400826F000C4E244E17041A5 +S315001EF0D0AD8071408027E9120303D1603978FFFFA6 +S315001EF0E0A1FFC4E2E51137FD6040012ADB00006383 +S315001EF0F037FD6C403C4628F229F0274120B920B442 +S315001EF100F7B10B036440082708000B60B463006464 +S315001EF1104BFB4CFBBDDBFFFFA3DBC70A41470D6064 +S315001EF120696B674CBBFF03E13F40003A0200A1FF3B +S315001EF130674C02E10864404C294401BC404919FF52 +S315001EF14084FFD1607164404282FF38F3006100BCC7 +S315001EF150006403038760C578FFFF39F3FFFF00BC19 +S315001EF1600064110339FB1DFF00EB47F300EA334031 +S315001EF17002360F7E99FF405A98FF606000EAA16032 +S315001EF18000EAD16000EA294001260300F8602978CA +S315001EF190FFFF3C44404222460FF0FFFF6440012A17 +S315001EF1A0030089609578FFFF0B643ADB1C422246FA +S315001EF1B013F2FF65604729F240454048042B1500AF +S315001EF1C016F221F240430FF24044255E40450F647D +S315001EF1D014F034F2A0820FB4CA85D48010F2010254 +S315001EF1E02AFA274440BC4047140017F22BF040432E +S315001EF1F01FF221FA40446440012A030000642AFAE1 +S315001EF20005002840A436020011F22AFA2744BFB48C +S315001EF2104047FC60584F5178FFFF2744DFB44047F4 +S315001EF22022462BF0896075786444B5FF016003E8B9 +S315001EF230116003E8A1FF6C400D60696B674CBBFF54 +S315001EF24003E13F40003A0200A1FF674C02E1086459 +S315001EF250404C294401BC404919FFC4E208643ADB0C +S315001EF260254601F26145D49E214616FA2A44DC80C3 +S315001EF27023FA204408240164E88000644040B9F360 +S315001EF28005047245DC84B9FB6055655224FABAF34F +S315001EF2900204DC84BAFB27FABBF30204DC84BBFB44 +S315001EF2A028FA2D440C2203002840A43A0D002146BC +S315001EF2B00FF0264384BBFCB3B3830FFC00644046A9 +S315001EF2C0254406FA015D05FF09643ADB2844A43687 +S315001EF2D0020004265B002744012A130050FE284024 +S315001EF2E0083A12002EF22FF0604330F22246644195 +S315001EF2F02BF02CF0D3802DF0D180D080274409012D +S315001EF3000300274406220500B8B44047026436FBB4 +S315001EF310C0FE0D643ADB214620F280F1FFB4D08098 +S315001EF320FFFF0106644440450A367064143638648D +S315001EF33032361764373A0300047F4045156450364B +S315001EF3400E646E3A0300847F40450B64404400649D +S315001EF3504043006010664642D46429FA21462EF2C6 +S315001EF3602FF0604330F222462BFC2CF82DFA224653 +S315001EF37000632844A4360700042B050035F32445F4 +S315001EF380D484CA65D4838A602678FFFF8860C278D3 +S315001EF390FFFF264402260E003E4609F2414D00BCE2 +S315001EF3A01E4103028A604F78FFFF405E03634AFDDB +S315001EF3B0026440469CFE0105415D2169214600F21C +S315001EF3C046454CE20E64404C19FF03E1A1FF6C4317 +S315001EF3D020643ADB684425FA22692E4420FA3EF15F +S315001EF3E021FCC394CDE22E4414361D000A361A00A3 +S315001EF3F03240012B130050361B006345E383E38323 +S315001EF400C783FFFF32360E003F40022B0700E38301 +S315001EF410C783FFFF373605006E3604008A607A788A +S315001EF420FFFFEB83EB83EB83EB83FFFF8027CF830B +S315001EF4301FFCFCA3BDF14343D380204403048A6012 +S315001EF4408378FFFFE884FFFF0204524A0200524AF5 +S315001EF4507080016457FBA1FF6C4003158A608C788F +S315001EF460FFFF25F2FFFF685F25FA3A6952632644BD +S315001EF47003B412BC404600640FFA22FAA1FF6C4484 +S315001EF480BDDA4048D4360461C4360661B4360A6114 +S315001EF490A4360861414DA1FF6C44BDDA6045802744 +S315001EF4A0006435FB3244012A0300FB60ED78FFFF42 +S315001EF4B02D440C223C00A1FF6C44BDDADAF150FE4D +S315001EF4C0D080006438FA3FFA464EA1FF6C44BDDA7E +S315001EF4D0DBF1006520F2D080685F26FAA1FF6C443E +S315001EF4E0BDDADCF12D41D0802D440301082A0A0025 +S315001EF4F00F001065604006360400043A06002740D9 +S315001EF50040263065FB60C278358D082AFB003065C3 +S315001EF510A1FF6C44BDDA9CFE0305886085718DE2F1 +S315001EF520A1FF6C44BDDAA1FF6C44BDDAEB0050FEB0 +S315001EF530A1FF6C44BDDA6041DC85DAF16040012A28 +S315001EF5400400264420BC40460100D180A1FF6C4425 +S315001EF550BDDA6041DC84DBF1B485D18020F2FFFF89 +S315001EF560685F26FAA1FF6C44BDDA6041DC84348EE6 +S315001EF570DCF1264420261D00D1802D442201324076 +S315001EF580022A070028420CB2083A030010BC404D5E +S315001EF5901A0011BC404D060A2644EFB440468A6046 +S315001EF5A09278FFFF2845BF60FF6424882343F2A399 +S315001EF5B0290026412E4400BCEFB1082440B941461D +S315001EF5C0020030BC404DA1FF6C44BDDA2845402BDD +S315001EF5D025003240082609003340802706002644AF +S315001EF5E001BC4046BF60FF6424889CFE040599FF4B +S315001EF5F03A448027130098FF2D4401BCDFB4404DCA +S315001EF6002343F0A3A1FF6C44FD1F81E10865454C11 +S315001EF61019FFA1FF6C44FB60C278FFFFA1FF6C447B +S315001EF620BDDA98FF01612844032B00616040402724 +S315001EF63002B9414E0FF0A1FF6C44BDDA2840402BA3 +S315001EF6400900264030220600015D0167B0840FFACC +S315001EF650FFFF05FFA1FF6C44BDDA2343E8A338FC78 +S315001EF660A1FF6C4432FA9CFE0305886085718DE20B +S315001EF670A1FF6C4433FA2E4403260500CF83A1FF57 +S315001EF6806C4434FA1600A1FF6C4434FA2E40012A4B +S315001EF6901C0098FFA1FF6C4435FAFAA338FCA1FFA3 +S315001EF6A06C4436FA2E4002260D00CF83A1FF6C4411 +S315001EF6B037FA3F03CF83400E3D03CF83DF833D02E0 +S315001EF6C0A1FF3900A1FF6C4437FAA1FF6C441AFA58 +S315001EF6D0F8A338FC04A3A1FF6C441BFA6040202B40 +S315001EF6E00900A1FF6C4439FAF8A338FC04A3A1FF54 +S315001EF6F06C443AFA0FF0264408BC404630220400F9 +S315001EF70078B702BFB09CDCFEA1FFEC4400F4046295 +S315001EF7107A61A2DA464E2146A1FF0FF805FFEC4498 +S315001EF7202E46B0FF03FACB83C981200EA1FF0C1C07 +S315001EF73013001C001C0014002500A1FF3F400036CC +S315001EF740410000F402627C61EC44C9817ADAFC1C39 +S315001EF750F81D00B90D1E04036C445ADAC981050052 +S315001EF7606C4400F47A6102FA00B90C1EB6FFA1FFC2 +S315001EF7706C440502B7FF00F47A6102FA03005ADAF6 +S315001EF780B7FFC981A1FF6C400865454C19FF464568 +S315001EF7902840402B0200B2FFB1FF83E1A1FF146394 +S315001EF7A00110FE1F0874CDE247FF324001225100B0 +S315001EF7B02644FDB484BC01157FB440466C408B6064 +S315001EF7C02478FFFF00F4026246457C61EC445ADA57 +S315001EF7D0C981A1FFFB1CF61DBC00A1FF6C44BDDA4E +S315001EF7E00070BF60FF652844402B04002488264411 +S315001EF7F001BC4046A1FF6C44BDDA20F21E61685F63 +S315001EF80026FA2840032BFAA161452344D48440439B +S315001EF81028400426006438FA60473FFAA1FF6C446C +S315001EF820BDDA2844D436AE00C436AC00F6A1284450 +S315001EF830B4360200A43A0300066100644043C9813F +S315001EF840A1FF6C44BDDAFB022343CF83FB605978CC +S315001EF850FFFF31400826060070422B45468B31407D +S315001EF860082A67506A40402B03158A60CB786C4085 +S315001EF8706C402840032612003140202A03002840EF +S315001EF880503A0C002D44202A09003A36070D314005 +S315001EF890082601002B50F960157806E18B60187852 +S315001EF8A006E152632246BDD00AE1A1FF37F3FFFFF0 +S315001EF8B0604007220600274410BCF7B44047006488 +S315001EF8C037FB43FF29440126F00043FF03E1A1FF56 +S315001EF8D0644E4448402B4E0033400236420099FF88 +S315001EF8E03A408027110098FF0864404C19FF1AF30E +S315001EF8F02841DC841AFBFFB12744802A4148A1FF18 +S315001EF900674FFD60C678FFFF0460016460FEA0D3EA +S315001EF9105AD120FE0061645F404CDC84F181C02B0D +S315001EF9200400802A02007FA4DC84FF3B030060479C +S315001EF930DC870161C0800036DC8460FE4ADBDA8229 +S315001EF9405AD160474ADBC184F02210A46040F02AD7 +S315001EF950010000645ADB644420FE46F1FFB4308D7C +S315001EF960090099FF09607464A0D158D343F1444C31 +S315001EF970207F308DBDD2A1FF604C264402B4404686 +S315001EF9800161284450360100803604B9414EBDD26D +S315001EF990A1FF604C16603062A2D12444C065C484A7 +S315001EF9A0E884E884E884E884E884C084A2DBBDD2C7 +S315001EF9B0A1FF604CBDD2A1FF604C2844C436100086 +S315001EF9C0D4360E00BDD2A1FF604CBDD2A1FF604C45 +S315001EF9D0BDD2A1FF604C2844B4360200A43A0400EE +S315001EF9E098FFFD60BD78FFFFBDD2A1FF604CFF658D +S315001EF9F0BDD2A1FF604C2E412844032BFEB16040B0 +S315001EFA00402702B9BDD2A1FF604C2344CC84DC84BE +S315001EFA100303030208B9010010B9414EBDD0A1FF70 +S315001EFA20644C2E4403225F00012A0C00BDD2A1FFA6 +S315001EFA30604CBDD2A1FF604CBDD2A1FF604C2E44CE +S315001EFA40022A5100A1FF2C4C6B411060067CB18B23 +S315001EFA5000EB3F6000EAA1FF2D4C2D44202B080031 +S315001EFA6042F3FFFF58D3A1FF604C4AD3A1FF604C5F +S315001EFA701DF203F004F42343644282D2A481E04FB4 +S315001EFA800C0000F401F25AD2A48105003A403A4015 +S315001EFA905AD263400129A1FFE04D6047C9813A4011 +S315001EFAA03A400129A1FF604DF11CEB1D091E020201 +S315001EFAB000F4DA825AD2A1FF604DFFFFFFFFFFFF5F +S315001EFAC0FFFFFFFF0364A1FF006FFFFFCC84FFFF54 +S315001EFAD0FFFFFFFFFFFFA1FF006DF802FFFFFFFF05 +S315001EFAE0FFFFDA824A00182207000826460003F0A6 +S315001EFAF004F46442A2D23F00042A2500234300F4E4 +S315001EFB0001F2FF65A481A1FF02FE102542FE724589 +S315001EFB10654CB9F30404DC84B9FB60556552A1FF3C +S315001EFB20604CBAF30204DC84BAFBA1FF604CBBF343 +S315001EFB300204DC84BBFBA1FF604C2E44FBB4404E8A +S315001EFB40F8A306F20C0003F01DF204F423436442EC +S315001EFB5082D2A481040000F401F25AD2A481A1FF2C +S315001EFB60E04CDA82C98182D2FB1CF51D061E0302F9 +S315001EFB7000F4DA825AD2A1FF604D98FFA1FF674FAB +S315001EFB80624366442246FFFFFFFFFFFFA1FF674D4C +S315001EFB900CFA0BFC0864404C4674A1FF674C19FF17 +S315001EFBA007E13F4000362A00A1FF874DFFFF0425CF +S315001EFBB00100674CA1FF0C74CDE206E1FFFFFFFFBB +S315001EFBC0BCFF2BF0274180B92844402B150064400A +S315001EFBD0012A0300334002360F0047F300EA334082 +S315001EFBE002360F7E99FF405A98FF606000EAA160B8 +S315001EFBF000EAD16000EA7FB141470800A1FF06E195 +S315001EFC00042502000125FC000C74CDE234643ADBA7 +S315001EFC102944F7B440493240202B0F0001160D002F +S315001EFC204DE2027B0229FE0014EE4DE2027B022902 +S315001EFC30FE0044E210EE0168FF6A3BF3A1FF60542A +S315001EFC4006E1C4E2137698FF2F5846FFA2FF1F60F7 +S315001EFC504462A2D3FFFFAC860EF2070300A809F288 +S315001EFC60FA0201670EFA08FE1500B1F3FFFFD8A0CF +S315001EFC7000B4100609603C61414A40A1A2FFFE6025 +S315001EFC80584E6B78FFFFA3FF05032A43FE60584EAE +S315001EFC908C7808FEA3FF2D58FFFF414A40A1A2FF04 +S315001EFCA0FE60584E6B78FFFF06032A43FE60584ED1 +S315001EFCB08C7808FE0D001F604462A2D3FFFFAC863F +S315001EFCC00EF2060300A809F2FA0201670EFA08FEF2 +S315001EFCD0A3FF2D58FFFFB2F37C6300BE40451A03F7 +S315001EFCE000656544DC8584A100F2060601FC00A8B9 +S315001EFCF06046F70240450E00B1F30063D484B1FBA3 +S315001EFD0080607C6401FA00F000FCD380B2F9020226 +S315001EFD10B3F908FE2E58FFFF6644254605FA06FA75 +S315001EFD2001F0036702FCB08400F03C7E01FA046415 +S315001EFD3003FA04F87C641DFA00640C61106359DA38 +S315001EFD40FE1F2E58FFFF274300BB2546BFD30F03BA +S315001EFD50DC84A2DBBED308FC00A8FFFF03022544F9 +S315001EFD60A3DB04000AFA6046254409FABEDB2F58B7 +S315001EFD70FFFF254400A8074C0C03584F2F000C47C5 +S315001EFD801F6038652744D480006401020FFA584F5D +S315001EFD90DA002E58FFFF25D527425AD3254346455E +S315001EFDA0AC810064BFDBA3DBBEDB0302254427DB7D +S315001EFDB0050061440AFA6146254409FA254427438B +S315001EFDC00061604609F208FC00A8DD81FA02BFD177 +S315001EFDD06644BEDBC184BFDB2E58FFFF254608F2F4 +S315001EFDE009F000A840471A0348D36443CC84A2DB1B +S315001EFDF00AF200BB2742DA820824A2DB00A8CA82C6 +S315001EFE000202A2DD0200604609FC00BB634608280A +S315001EFE100AFA2546006409FA0AFA08FA2F58FFFF5D +S315001EFE20006128652543B3F3AF8300BE18030203A2 +S315001EFE3000FC0100B2FD63466544CC8500F2070254 +S315001EFE40B3F5006400FADE60AF6409FB0800664382 +S315001EFE5000BEDD81F102B1F1B3FDC184B1FB2E58A6 +S315001EFE60FFFF006646452943FCA36644BDDB2544C9 +S315001EFE70BDDB0064BDDB03610E651F604C63434939 +S315001EFE80A3D306A300A8CD810402F902C660A978F1 +S315001EFE90FFFF0126E600D4806045E305F6A3BDD12B +S315001EFEA0BDD14447444844451F60846444D7FFFF80 +S315001EFEB0FFFF00F402627C61021D1200A2DA5AD212 +S315001EFEC0C981834060579745FFFF48254B00E05781 +S315001EFED07747B484F31CA2DAEC1D00B9061EE903AB +S315001EFEE07AD2C98160577744A2DA76407145D784A3 +S315001EFEF01EFB84E22A460061021401610100FFFF17 +S315001EFF00007C48FB0FF240FF60400426040009E116 +S315001EFF10A1FF0FF2FFFF08BC00B940FF050322F048 +S315001EFF20C261B19C22F8F7B408251C006041082A5C +S315001EFF3014001A60A064A0D3FFFF00BCCC84020389 +S315001EFF40A2DB0B001BF22B436040202B06003AF26D +S315001EFF50BDDB2C5C39F2BDDBA3D9BCFEB0FFD16084 +S315001EFF60ED786144D2600378FFFF46696C656E6169 +S315001EFF706D653F68657265000000000000000000A8 +S315001EFF80000000000000000000000000000000004D +S315001EFF90000000000000000000000000000000003D +S315001EFFA0000000000000000000000000000000002D +S315001EFFB0000000000000000000000000000000001D +S315001EFFC00000000090FF20FE9DF100F982609A78E5 +S315001EFFD088FF92FF20FE30F39EF198FF012608F956 +S315001EFFE08260B87888FF95FF20FE30F39FF198FF58 +S315001EFFF0012614F98360AC7888FF0000000000001B +S705000F80006B diff --git a/workbench/devs/networks/prism2/firmware/HermesII b/workbench/devs/networks/prism2/firmware/HermesII new file mode 100644 index 0000000000..a880f6e44c --- /dev/null +++ b/workbench/devs/networks/prism2/firmware/HermesII @@ -0,0 +1,4324 @@ +S31500000060000000000000000000000000000000008A +S315000000700000000000000000000000001C0D000051 +S315000000803A0C00003A0C00000000000000000000DE +S31500000090000000000000000000000000000000005A +S315000000A000000000001B00000000001B001B0000F9 +S315000000B00000000000000200020000000000000036 +S315000000C0000000000000000000000000000000002A +S315000000D0000000000000000000000000000000001A +S315000000E00000000000000000000000000A00000000 +S315000000F000000300000000001400000000000000E3 +S3150000010000000000000000000000000000000000E9 +S31500000110861986190000000000000000000000009B +S3150000012000000000000000000000000000000000C9 +S3150000013000000200020002000000000000000000B3 +S3150000014000000000000000000000000000000000A9 +S315000001502000000000000000000000000000060073 +S315000001600600020000000000000000000000000081 +S3150000017000EA0000FF070100640064001027102752 +S315000001801400D007D00710272F00320032000500D8 +S3150000019002000200102705000002000213000A00F8 +S315000001A0070003003200000000002A092B092B0972 +S315000001B003000000006E001401004000320032000F +S315000001C00A00020006000100000004000000010011 +S315000001D00000000000000000000000000000000019 +S30B000001E000000000000013 +S31500000C164BA3000A100168A4B001840130333133B6 +S31500000C264444303331333033313332333233900048 +S31500000C367804AEE4000102030405060708090A0B58 +S31500000C460C0D0E0F00000000000000000000000062 +S31500000C560000000000000000000000000000000088 +S31500000C660000000000000000000000000000000078 +S31500000C760000000000000000000000000000000068 +S31500000C860000000000000000000000000000000058 +S31500000C960000000000000000000000000000000048 +S31500000CA60000000000000000000000000000000038 +S31500000CB60000000000000000000000000000000028 +S31500000CC60000000000000000000000000000000018 +S31500000CD60000000000000000000000000000000008 +S31500000CE600000000000000000000000000000000F8 +S31500000CF600000000000000000000000000000000E8 +S31500000D0600000000000000000000000000000000D7 +S31500000D1600000000000000000000000000000000C7 +S31500000D2600000000000000000000000000000000B7 +S31500000D3600000000000000000000000000000000A7 +S31500000D460000000000000000000000000000000097 +S31500000D560000000000000000000000000000000087 +S31500000D6600000000000000000000A5C684F899EE09 +S31500000D768DF60DFFBDD6B1DE549150600302A9CEA5 +S31500000D867D5619E762B5E64D9AEC458F9D1F40895B +S31500000D9687FA15EFEBB2C98E0BFBEC4167B3FD5F25 +S31500000DA6EA45BF23F75396E45B9BC2751CE1AE3D4D +S31500000DB66A4C5A6C417E02F54F835C68F45134D115 +S31500000DC608F993E273AB53623F2A0C0852956546BF +S31500000DD65E9D2830A1370F0AB52F090E36249B1BB8 +S31500000DE63DDF26CD694ECD7F9FEA1B129E1D7458A8 +S30F00000DF62E342D36B2DCEEB4FB5BA2 +S31500000E00F6A44D7661B7CE7D7B523EDD715E9713BB +S31500000E10F5A668B900002CC160401FE3C879EDB69D +S31500000E20BED4468DD9674B72DE94D498E8B04A8515 +S31500000E306BBB2AC5E54F16EDC586D79A5566941144 +S31500000E40CF8A10E9060481FEF0A04478BA25E34B68 +S31500000E50F3A2FE5DC0808A05AD3FBC21487004F157 +S31500000E60DF63C17775AF634230201AE50EFD6DBFB3 +S31500000E704C81141835262FC3E1BEA235CC88392EF5 +S31500000E805793F25582FC477AACC8E7BA2B3295E6FF +S31500000E90A0C09819D19E7FA366447E54AB3B830BBA +S31500000EA0CA8C29C7D36B3C2879A7E2BC1D1676AD40 +S31500000EB03BDB56644E741E14DB920A0C6C48E4B895 +S31500000EC05D9F6EBDEF43A6C4A839A43137D38BF21C +S31500000ED032D5438B596EB7DA8C0164B1D29CE049A6 +S31500000EE0B4D8FAAC07F325CFAFCA8EF4E947181089 +S31500000EF0D56F88F06F4A725C2438F157C7735197E3 +S31500000F0023CB7CA19CE8213EDD96DC61860D850F16 +S31500000F1090E0427CC471AACCD890050601F7121C59 +S31500000F20A3C25F6AF9AED06991175899273AB927D3 +S31500000F3038D913EBB32B3322BBD270A98907A73359 +S31500000F40B62D223C921520C94987FFAA78507AA56A +S31500000F508F03F8598009171ADA6531D7C684B8D0D5 +S31500000F60C382B029775A111ECB7BFCA8D66D3A2CCA +S31500000F7000300031003300340035003600370038C9 +S31500000F800038003A003B003C003D003E003F003F79 +S31500000F900900000000000000000000000000000042 +S31500000FA00000010A021405320B3708500B6E0000D0 +S31500000FB0010002003F000C00300003000F003E005D +S31500000FC03C00020004000A000B001000160000009E +S31500000FD0000000000000000000000000000000000B +S31500000FE000000000000000000000000000000000FB +S31500000FF000000000000000000000000000000000EB +S3150000100000000000000000000000000000000000DA +S3150000101000000000000000000000000000000000CA +S3150000102000000000000000000000000000000000BA +S3150000103000000000000000000000000000000000AA +S31500001040000000000000000000000000000000009A +S31500001050000000000000000000000000000000008A +S31500001060000000000000000000000000000000007A +S31500001070000000000000000000000000000000006A +S315000010800000000000000000000063006300200074 +S315000010906300630020000000000000000000000064 +S315000010A00100000000000200000000000300000034 +S315000010B0000004000000000005000000000006001B +S315000010C0000000000700000000000800000000000B +S315000010D00900000000000A00000000000B000000EC +S315000010E000000C00000000000D00000000000E00D3 +S315000010F000000000A010EE10A610E810AC10E210E0 +S31500001100B210DC10B810D610BE10D010C410CA1021 +S31500001110070100000A220004080100000A26000454 +S31500001120090100000A2A00040A0100000A2E000430 +S315000011300B010000102404040C0100001028040414 +S315000011400D010000102C04040E01000010300404F0 +S315000011500F010000163408041001000016380804B8 +S3150000116011010000163C0804120100001640080494 +S315000011701301000017640C0B1401000017680C0B18 +S3150000118015010000176C0C0B1601000017700C0BF4 +S315000011901701000017740C0B1801000017780C0BD0 +S315000011A019010000177C0C0B1A01000017800C0BAC +S315000011B01B01000017840C0B1C01000017880C0B88 +S315000011C01D010000178C0C0B1E0100001D95170455 +S315000011D01F0100001D991704200100001D9D170422 +S315000011E0210100001DA11704220100000EA5000028 +S315000011F01011301150117011C811181138115811F1 +S315000012007811D0112011401160118011D8112811C8 +S31500001210481168118811E01190119811A011A811B8 +S31500001220B011B811C011E811000000000000000064 +S3150000123000000000000000000000000000000000A8 +S315000012400000000000000000000000000000000098 +S315000012500000000000000000000000000000000088 +S315000012600000000000000000000000000000000078 +S315000012700000000000000000000000000000000068 +S315000012800000000000000000000000000000000058 +S315000012900000000000000000000000000000000048 +S315000012A00000000000000000000000000000000038 +S315000012B00000000000000000000000000000000028 +S315000012C00000000000000000000000000000000018 +S315000012D00000000000000000000000000000000008 +S315000012E000000000000000000000000000000000F8 +S315000012F000000000000000000000000000000000E8 +S3150000130000000000000000000000000000000000D7 +S3150000131000000000000000000000000000000000C7 +S3150000132000000000000000000000000000000000B7 +S3150000133000000000000000000000000000000000A7 +S315000013400000000000000000000000000000000097 +S315000013500000000000000000000000000000000087 +S315000013600000000000000000000000000000000077 +S315000013700000000000000000000000000000000067 +S315000013800000000000000000000000000000000057 +S315000013900000000000000000000000000000000047 +S315000013A00000000000000000000000000000000037 +S315000013B00000000000000000000000000000000027 +S315000013C00000000000000000000000000000000017 +S315000013D00000000000000000000000000000000007 +S315000013E000000000000000000000000000000000F7 +S315000013F000000000000000000000000000000000E7 +S3150000140000000000000000000000000000000000D6 +S3150000141000000000000000000000000000000000C6 +S3150000142000000000000000000000000000000000B6 +S3150000143000000000000000000000000000000000A6 +S315000014400000000000000000000000000000000096 +S315000014500000000000000000000000000000000086 +S315000014600000000000000000000000000000000076 +S315000014700000000000000000000000000000000066 +S315000014800000000000000000000000000000000056 +S315000014900000000000000000000000000000000046 +S315000014A00000000000000000000000000000000036 +S315000014B00000000000000000000000000000000026 +S315000014C00000000000000000000000000000000016 +S315000014D00000000000000000000000000000000006 +S315000014E000000000000000000000000000000000F6 +S315000014F000000000000000000000000000000000E6 +S3150000150000000000000000000000000000000000D5 +S3150000151000000000000000000000000000000000C5 +S3150000152000000000000000000000000000000000B5 +S3150000153000000000000000000000000000000000A5 +S315000015400000000000000000000000000000000095 +S315000015500000000000000000000000000000000085 +S315000015600000000000000000000000000000000075 +S315000015700000000000000000000000000000000065 +S315000015800000000000000000000000000000000055 +S315000015900000000000000000000000000000000045 +S315000015A00000000000000000000000000000000035 +S315000015B00000000000000000000000000000000025 +S315000015C00000000000000000000000000000000015 +S315000015D00000000000000000000000000000000005 +S315000015E000000000000000000000000000000000F5 +S315000015F000000000000000000000000000000000E5 +S3150000160000000000000000000000000000000000D4 +S3150000161000000000000000000000000000000000C4 +S3150000162000000000000000000000000000000000B4 +S3150000163000000000000000000000000000000000A4 +S315000016400000000000000000000000000000000094 +S315000016500000000000000000000000000000000084 +S315000016600000000000000000000000000000000074 +S315000016700000000000000000000000000000000064 +S315000016800000000000000000000000000000000054 +S315000016900000000000000000000000000000000044 +S315000016A00000000000000000000000000000000034 +S315000016B00000000000000000000000000000000024 +S315000016C00000000000000000000000000000000014 +S315000016D00000000000000000000000000000000004 +S315000016E000000000000000000000000000000000F4 +S315000016F000000000000000000000000000000000E4 +S3150000170000000000000000000000000000000000D3 +S3150000171000000000000000000000000000000000C3 +S3150000172000000000000000000000000000000000B3 +S3150000173000000000000000000000000000000000A3 +S315000017400000000000000000000000000000000093 +S315000017500000000000000000000000000000000083 +S315000017600000000000000000000000000000000073 +S315000017700000000000000000000000000000000063 +S315000017800000000000000000000000000000000053 +S315000017900000000000000000000000000000000043 +S315000017A00000000000000000000000000000000033 +S315000017B00000000000000000000000000000000023 +S315000017C00000000000000000000000000000000013 +S315000017D00000000000000000000000000000000003 +S315000017E000000000000000000000000000000000F3 +S315000017F000000000000000000000000000000000E3 +S3150000180000000000000000000000000000000000D2 +S3150000181000000000000000000000000000000000C2 +S3150000182000000000000000000000000000000000B2 +S3150000183000000000000000000000000000000000A2 +S315000018400000000000000000000000000000000092 +S315000018500000000000000000000000000000000082 +S315000018600000000000000000000000000000000072 +S315000018700000000000000000000000000000000062 +S315000018800000000000000000000000000000000052 +S315000018900000000000000000000000000000000042 +S315000018A00000000000000000000000000000000032 +S315000018B00000000000000000000000000000000022 +S315000018C00000000000000000000000000000000012 +S315000018D00000000000000000000000000000000002 +S315000018E000000000000000000000000000000000F2 +S315000018F000000000000000000000000000000000E2 +S3150000190000000000000000000000000000000000D1 +S3150000191000000000000000000000000000000000C1 +S3150000192000000000000000000000000000000000B1 +S3150000193000000000000000000000000000000000A1 +S315000019400000000000000000000000000000000091 +S315000019500000000000000000000000000000000081 +S315000019600000000000000000000000000000000071 +S315000019700000000000000000000000000000000061 +S315000019800000000000000000000000000000000051 +S315000019900000000000000000000000000000000041 +S315000019A00000000000000000000000000000000031 +S315000019B00000000000000000000000000000000021 +S315000019C00000000000000000000000000000000011 +S315000019D00000000000000000000000000000000001 +S315000019E000000000000000000000000000000000F1 +S315000019F000000000000000000000000000000000E1 +S31500001A0000000000000000000000000000000000D0 +S31500001A1000000000000000000000000000000000C0 +S31500001A2000000000000000000000000000000000B0 +S31500001A3000000000000000000000000000000000A0 +S31500001A400000000000000000000000000000000090 +S31500001A500000000000000000000000000000000080 +S31500001A600000000000000000000000000000000070 +S31500001A700000000000000000000000000000000060 +S31500001A800000000000000000000000000000000050 +S31500001A900000000000000000000000000000000040 +S31500001AA00000000000000000000000000000000030 +S31500001AB00000000000000000000000000000000020 +S31500001AC00000000000000000000000000000000010 +S31500001AD00000000000000000000000000000000000 +S31500001AE000000000000000000000000000000000F0 +S31500001AF000000000000000000000000000000000E0 +S31500001B0000000000000000000000000000000000CF +S31500001B1000000000000000000000000000000000BF +S31500001B2000000000000000000000000000000000AF +S31500001B30000000000000000000000000000000009F +S31500001B40000000000000000000000000000000008F +S31500001B50000000000000000000000000000000007F +S31500001B60000000000000000000000000000000006F +S31500001B70000000000000000000000000000000005F +S31500001B80000000000000000000000000000000004F +S31500001B90000000000000000000000000000000003F +S31500001BA0000000000000000000000000000000002F +S31500001BB0000000000000000000000000000000001F +S31500001BC0000000000000000000000000000000000F +S31500001BD000000000000000000000000000000000FF +S31500001BE000000000000000000000000000000000EF +S31500001BF000000000000000000000000000000000DF +S31500001C0000000000000000000000000000000000CE +S31500001C1000000000000000000000000000000000BE +S31500001C2000000000000000000000000000000000AE +S31500001C30000000000000000000000000000000009E +S31500001C40000000000000000000000000000000008E +S31500001C50000000000000000000000000000000007E +S31500001C60000000000000000000000000000000006E +S31500001C70000000000000000000000000000000005E +S31500001C80000000000000000000000000000000004E +S31500001C90000000000000000000000000000000003E +S31500001CA0000000000000000000000000000000002E +S31500001CB0000000000000000000000000000000001E +S31500001CC0000000000000000000000000000000000E +S31500001CD000000000000000000000000000000000FE +S31500001CE000000000000000000000000000000000EE +S31500001CF000000000000000000000000000000000DE +S31500001D0000000000000000000000000000000000CD +S31500001D1000000000000000000000000000000000BD +S31500001D2000000000000000000000000000000000AD +S31500001D30000000000000000000000000000000009D +S31500001D40000000000000000000000000000000008D +S31500001D50000000000000000000000000000000007D +S31500001D60000000000000000000000000000000006D +S31500001D70000000000000000000000000000000005D +S31500001D80000000000000000000000000000000004D +S31500001D90000000000000000000000000000000003D +S31500001DA0000000000000000000000000000000002D +S31500001DB0000000000000000000000000000000001D +S31500001DC0000000000000000000000000000000000D +S31500001DD000000000000000000000000000000000FD +S31500001DE000000000000000000000000000000000ED +S31500001DF000000000000000000000000000000000DD +S31500001E0000000000000000000000000000000000CC +S31500001E1000000000000000000000000000000000BC +S31500001E2000000000000000000000000000000000AC +S31500001E30000000000000000000000000000000009C +S31500001E40000000000000000000000000000000008C +S31500001E50000000000000000000000000000000007C +S31500001E60000000000000000000000000000000006C +S31500001E70000000000000000000000000000000005C +S31500001E80000000000000000000000000000000004C +S31500001E90000000000000000000000000000000003C +S31500001EA0000000000000000000000000000000002C +S31500001EB0000000000000000000000000BE1E000040 +S31500001EC0000000000000000000000000000000000C +S31500001ED000000000000000000000000000000000FC +S31500001EE000000000000000000000000000000000EC +S31500001EF000000000000000000000000000000000DC +S31500001F0000000000000006000000000000000000C5 +S31500001F100000000000000000740000000000000047 +S31500001F2000000000000000000000000000000000AB +S31500001F30000000000000000000000000000000009B +S31500001F4000000000102529254C25BB24BB24BB24FA +S31500001F508625DC2ABB24BB24BB24CD2DBB24BB2475 +S31500001F60BB24BB24BB246527BB24BB24BB24BB24C6 +S31500001F70BB24BB24BB24BB24BB24BB24BB24BB2463 +S31500001F80BB24BB24BB24BF27BB24BB24BB24BB244C +S31500001F90BB24BB24BB24BB24BB24BB24BB24BB2443 +S31500001FA0BB24BB2433274D27BB24BB24BB24BB2423 +S31500001FB0BB24BB242123A825BB256B266F26BB2467 +S31500001FC0BB241E2721EACFE9000018EA0000000022 +S31500001FD099EA3F2563250000D22A00000000ED2A79 +S31500001FE0E0FC2628A02A5A000200F9FF26283C28F1 +S31500001FF000010200F7FF26283C280C280600F0FF07 +S315000020002628032800000002F6FF26283C286C003C +S315000020100200F4FF26283C28AA010200F5FF262824 +S31500002020A92AFE270200E0FF26283C288A2D020066 +S31500002030E1FF26283C288C2D0200E2FF26283C28BA +S315000020408E2D0200E3FF26283C28862D020003FC85 +S315000020502628F129D22C020004FC2628362814282A +S31500002060220006FC26283C28FC27020007FC26281E +S315000020703C28582802000EFC2628032A6228220043 +S31500002080B1FC2628F72A5E29020020FC26283C28D7 +S315000020908828020025FC26283C289228020026FCD7 +S315000020A026283C289428020027FC26283C28962827 +S315000020B00200B2FC2628362882292200C1FC2628E6 +S315000020C03C28162D2000B0FCF927FC2A0000000051 +S315000020D0C4FCF927C12A00000800C8FCF927BC2A5D +S315000020E000000800B4FCF9273A2B00000000B6FCFB +S315000020F0F927EB2B00000000B7FCF927152C000090 +S315000021000000B8FCF927722C00000000B5FC262858 +S315000021103C28822D0200B9FC26283C28842D02008A +S3150000212090FD26280328882D020023FC26283C281B +S315000021308E28020029FC1E29CB2800000000C2FCC4 +S3150000214026283C28CA2C020032FC26283C28A0015E +S31500002150020033FC26283C28A201020000FC2628A7 +S315000021603C281228020001FC26283C280C280600E0 +S3150000217002FC2628B6286029220005FC26283C28D1 +S315000021800228020008FC26283C280628060009FC2E +S3150000219026283C285A2802000BFC26283C285C28C6 +S315000021A002000CFC26283C285E2802000DFC26288E +S315000021B03C286028020021FC26283C288A280200A8 +S315000021C080FC9228A2289E28C00081FC26283C2854 +S315000021D0A801020083FC26283C28AC01020085FCED +S315000021E02628232AA601020086FC2628352AB201C3 +S315000021F0020028FC26283C289828020087FC26286E +S315000022003C28A829220384FC26284A2AB001020079 +S315000022102BFC26283C28D0300200F8FF26283C2834 +S31500002220CA300200F3FF26283C28D230020020FDE7 +S3150000223057280328FD33080021FD572803280134B9 +S315000022400A0022FD572803280634160023FD5728C6 +S31500002250032811340A0010FD262803287401020001 +S3150000226045FD262803280001020047FD26280328ED +S315000022707801020048FD74290328A001020049FDE7 +S3150000228074290328A20102004AFD26280328980182 +S3150000229002004BFD262803289A0102004DFD57280F +S315000022A00328163404004FFD88290328D62C020083 +S315000022B0C0FD5728032818340200C2FD7E290328D2 +S315000022C000000200C3FD572803281934020040FD10 +S315000022D04F280328B801020024FDA5290328000081 +S315000022E0020091FD26280328DC23020093FD262800 +S315000022F00328E2230200C1FD26280328FE0002006F +S31500002300C6FD84280328E42C0A0089FD3529032804 +S31500002310000000008AFD742803285C2D240041FD7E +S3150000232026280328362D220042FD262803280201EE +S31500002330060043FDB22903280000060044FD922949 +S315000023400328B401020046FD26280328BA010C0022 +S315000023504CFD26280328A629020050FD262803281E +S31500002360F400020051FD26280328F600020052FD63 +S3150000237026280328C60102008FFDC5290328000070 +S31500002380080092FD26280328102D02008CFD19282E +S315000023900328C42D56008DFD192803281E2E14006F +S315000023A000F14600BD273A0101F14407BB273C0175 +S315000023B00003DE671E007601FE00D60102013E0123 +S315000023C0B80130275A01DC2320000000BA1C0000A7 +S315000023D0BE1E54010B00BA00E4003C0000000000E1 +S315000023E000000000000000000000000000000000E7 +S315000023F000000000000000000000000000000000D7 +S3150000240000000000000000000000000000000000C6 +S3150000241000000000000000000000000000000000B6 +S3150000242000000000000000000000000000000000A6 +S315000024300000000000000000000000000000000096 +S315000024400000000000000000000000000000000086 +S315000024500000000000000000000000000000000076 +S31500002460000000000000000000000000C1AF34AF13 +S3150000247040B049B045AFDBAFB3AFF6325932F632B2 +S31500002480CD326332573215332633263326332F3374 +S315000024904A33A733C333CE32E132B53210001200CD +S315000024A013002000210022003000310032003300EA +S315000024B03400350036003700380039003A00000095 +S315000024C0140114011401140114011401140114015E +S315000024D0F302AD0360040405070608070A08160997 +S315000024E0440A040B400C800D000E840F01101011DD +S315000024F00214402032213222042301240F25002613 +S31500002500002700280029002A012B062C0038003954 +S31500002510D63A003B003C143D7F3E003F6840754183 +S315000025200742074300453B4A004B004C0F4D0275DE +S31500002530007680000801090109010A010A010B0160 +S315000025400B010C010C010D010D010E010E010F0115 +S315000025500F011001100111011101120112011301E5 +S3150000256013011401140115011501160116011701B5 +S31500002570170118011801190119014D014D014E01EC +S315000025804E014F014F0150015001510151015201BD +S31500002590520153015301540154016501650166015D +S315000025A066016701670168016801690169016A01DD +S315000025B06A016B016B016C016C016D016D016E01AD +S315000025C06E016F016F01700170017101710172017D +S315000025D0720173017301740174017501750176014D +S315000025E076017701770178017801790179017A011D +S315000025F07A017B017B017C017C017D017D017E01ED +S315000026007E017F017F017F017F017F017F017F01C5 +S315000026107F017F017F017F017F017F017F017F01B4 +S315000026207F017F017F017F017F017F017F017F01A4 +S315000026307F017F0180128012801280128012801228 +S3150000264080128012801280128012801280128012F4 +S3150000265080138013801380138013801380138013DC +S3150000266080138013801380138013801351445144C8 +S3150000267051445144514451445144514451445144AC +S315000026805144514451445144224622462246224650 +S3150000269022462246224622462246224622462346F3 +S315000026A0234623461C471C471C471C471C471C4700 +S315000026B01C471C471C471C471C471C471C471D47FB +S315000026C09A48DA481A485A489A48DA481A485A48F4 +S315000026D09A48DA481A485A489A483348784978490D +S315000026E079497949794979497A497A497A497A49D0 +S315000026F07B497B497B497C49320046005A006E0083 +S3150000270082009600AA00BE00D200E600FA000E0182 +S315000027102201520105000400040004000400030025 +S31500002720030003000300030002000200020002008F +S315000027300000000000000000000000000000000093 +S315000027400000000000000000000000000000000083 +S315000027500000000000000000000000000000000073 +S315000027600000000000000000000000000000000063 +S315000027700000030015006E6F6E2D73706563696649 +S3150000278069656420535349442021212020202020BC +S315000027902020202020200100002020202020202092 +S315000027A02020202020202020202020202020202023 +S315000027B020202020202020200009000001006400A5 +S315000027C0640000004845524D455320320020202029 +S315000027D020202020202020202020202020202020F3 +S315000027E0202020200100000000000100010002005E +S315000027F001000000010001000100000001000000CE +S3150000280004000000010000000000000000000000BD +S315000028100000030015006E6F6E2D737065636966A8 +S31500002820696564205353494420212120202020201B +S3150000283020202020202001002020202020202020D1 +S315000028402020202020202020202020202020202082 +S315000028502020202020202020000900000100640004 +S31500002860640000004845524D455320320020202088 +S315000028702020202020202020202020202020202052 +S3150000288020202020010000000000010001000200BD +S31500002890010000000100010001000000000000002E +S315000028A00000000000000000000000000000000022 +S315000028B00000000000000000000000000000000012 +S315000028C00000000000000000000000000000000002 +S315000028D000000000000000000000000000000000F2 +S315000028E000000000000000000000000000000000E2 +S315000028F000000000000000000000000000000000D2 +S3150000290000000000000000000000000000000000C1 +S3150000291000000000000000000000000000000000B1 +S3150000292000000000000000000000000000000000A1 +S315000029300000000000000000000000000000000091 +S315000029400000000000000000000000000000000081 +S315000029500000000000000000000000000000000071 +S315000029600000466972737420576176654C414E20AB +S31500002970494920535349442020202020202020204C +S315000029802020000020202020202020202020202081 +S315000029902020202020202020202020202020202031 +S315000029A02020202028000000000000000000000079 +S315000029B00000000000000000000000000000000011 +S315000029C00000000000000000000000000000000001 +S315000029D000000000000000000000000000000000F1 +S315000029E000000000000000000000000000000000E1 +S315000029F000000000000000000000000000000000D1 +S31500002A0000000000000000000000000000000000C0 +S31500002A1000000000000000000000000000000000B0 +S31500002A2000000000000000000000000000000000A0 +S31500002A300000000000000000000000000000000090 +S31500002A400000000000000000000000000000000080 +S31500002A500000000000000000000000000000000070 +S31500002A600000000000000000000000000000000060 +S31500002A700000000000000000000000000000000050 +S31500002A800000000000000000000000000000000040 +S31500002A900000000000000000000000000000000030 +S31500002AA00000000000000000000000000000000020 +S31500002AB00000000000000000000000000000000010 +S31500002AC00000000000000000000000000000000000 +S31500002AD000000000000000000000000000000000F0 +S31500002AE000000000000000000000000000000000E0 +S31500002AF000000000000000000000000000000000D0 +S31500002B0000000000000000000000000000000000BF +S31500002B1000000000000000000000000000000000AF +S31500002B20000000000000000000000000000000009F +S31500002B30000000000000000000000000000000008F +S31500002B40000000000000000000000000000000007F +S31500002B50000000000000000000000000000000006F +S31500002B60000000000000000000000000000000005F +S31500002B70000000000000000000000000000000004F +S31500002B80000000000000000000000000000000003F +S31500002B90000000000000000000000000000000002F +S31500002BA0000000000000000000000000000000001F +S31500002BB0000000000000000000000000000000000F +S31500002BC000000000000000000000000000000000FF +S31500002BD000000000000000000000000000000000EF +S31500002BE000000000000000000000000000000000DF +S31500002BF000000000000000000000000000000000CF +S31500002C0000000000000000000000000000000000BE +S31500002C1000000000000000000000000000000000AE +S31500002C20000000000000000000000000000000009E +S31500002C30000000000000000000000000000000008E +S31500002C40000000000000000000000000000000007E +S31500002C50000000000000000000000000000000006E +S31500002C60000000000000000000000000000000005E +S31500002C70000000000000000000000000000000004E +S31500002C80000000000000000000000000000000003E +S31500002C90000000000000000000000000000000002E +S31500002CA0000000000000000000000000000000001E +S31500002CB0000000000000000000000000000000000E +S31500002CC000000000000000000000000000000000FE +S31500002CD000000400000000002B00000000000000BF +S31500002CE000001900020182848B96000000001E85F8 +S31500002CF000000000000000001800000000000000B6 +S31500002D0000000000000000000000000000000000BD +S31500002D100100000000002000200010000800000153 +S31500002D20000100010001000000000000000000009A +S31500002D3000000000000000002043757272656E748A +S31500002D40205365727669636520536574204964650E +S31500002D506E746966696572200000000006DD005029 +S31500002D60F20101000050F20502000050F20200508C +S31500002D70F20402000050F2000050F20106000000CA +S31500002D80000002000000000000000000000000003B +S31500002D90000000000000000000000000000000002D +S31500002DA0000000000000000000000000000000001D +S31500002DB0000000000000000000000000000000000D +S31500002DC000000000000000000000000000000000FD +S31500002DD000000000000000000000000000000000ED +S31500002DE000000000000000000000000000000000DD +S31500002DF000000000000000000000000000000000CD +S31500002E0000000000000000000000000000000000BC +S31500002E1000000000000000000000000000000000AC +S31500002E20000000000000000000000000000000009C +S31500002E30000000000000000000000000000000008C +S31500002E40000000000000000000000000000000007C +S31500002E5000001500140015003600100010001000C8 +S31500002E6014001100360001000400362DE42CC82E93 +S31500002E70CC2ED02E5C2DFFFFFFFF00000000822924 +S31500002E80E42CFFFF0000362DE42CC82ECC2ED02ECD +S31500002E905C2DFFFFFFFF00000000362DE42CFFFF36 +S31500002EA0A22DF02C00000000000000000000000031 +S31500002EB0000000000000000000000000000000000C +S31500002EC000000000000000000103030002060000ED +S31500002ED006070000000000000000000000000000DF +S31500002EE000000000000000000000000000000000DC +S31500002EF000000000000000000000000000000000CC +S31500002F0000000000000000000000000000000000BB +S31500002F1000000000000000000000000000000000AB +S31500002F20000000000000000000000000000000009B +S31500002F30000000000000000000000000000000008B +S31500002F40000000000000000000000000000000007B +S31500002F50000000000000000000000000000000006B +S31500002F60000000000000000000000000000000005B +S31500002F70000000000000000000000000000000004B +S31500002F80000000000000000000000000000000003B +S31500002F90000000000000000000000000000000002B +S31500002FA0000000000000000000000000000000001B +S31500002FB0000000000000000000000000000000000B +S31500002FC000000000000000000000000000000000FB +S31500002FD000000000000000000000000000000000EB +S31500002FE000000000000000000000000000000000DB +S31500002FF000000000000000000000000000000000CB +S3150000300000000000000000000000000000000000BA +S3150000301000000000000000000000000000000000AA +S31500003020000000000000000000000000000000009A +S31500003030000000000000000000000000000000008A +S31500003040000000000000000000000000000000007A +S31500003050000000000000000000000000000000006A +S31500003060000000000000000000000000000000005A +S31500003070000000000000000000000000000000004A +S31500003080000000000000000000000000000000003A +S31500003090000000000000000000000000000000002A +S315000030A0000000000000000000000000000000001A +S315000030B0000000000000000000000000000000000A +S315000030C000000000000000000000000000000000FA +S315000030D001000500000000000000000000000000E4 +S30F000030E000000000000000000000E0 +S315001E30EA00E130400236A1FF83FF8DFF5C445C433C +S315001E30FA5C425C415C40ACFFADFFE7E1AD60057822 +S315001E310AFFFF304402A800E1030228E240FFA1FFA6 +S315001E311A84FFBB6014644042B06094644040BDF3B1 +S315001E312A80FB0F609A63CAF3BDDB00609A64BDDB3F +S315001E313A0264BDDB0464A3DB5C490A64404B5C5C27 +S315001E314A016039E20460007A89FF0360FF7388FF13 +S315001E315AB0609478FFFF304402A800E1060240FFE1 +S315001E316A42FF43FF44FF45FFA1FF88FF85FF21E17A +S315001E317A5C40BB601C78FFFFA2FF304402A800E138 +S315001E318A0102A1FF86FF88FF5C465C495C40E76038 +S315001E319A584F0178FFFFC760584FFA78FFFFCA607B +S315001E31AA584F8778FFFFDD60584F6B78FFFF1B600D +S315001E31BA584F1578FFFFEC60584F4578FFFFE060C1 +S315001E31CA584F2278FFFFE460584FE378FFFFF360FB +S315001E31DA584FBF78FFFF13E1A3FFBF60EF78FFFFCB +S315001E31EA03E1A3FFFEFCFFFC2360B06317FDAEFFDF +S315001E31FA2460EB78FFFF2AF2FFFF604008261A00BA +S315001E320A803A150081F132F233F2D08082F10F0232 +S315001E321AD08034F283F10B02D080FFFF0802DF60F2 +S315001E322A584F5678FFFF2060584F9D78FFFF19604A +S315001E323AC678FFFF00F4AA60AA6509F25AD0D4809E +S315001E324A03641202D0801D6060650E025AD2FFFF09 +S315001E325AD4800160006508025AD2FFFFD480FFFFA0 +S315001E326A03021960C678FFFF0160D665A5D15AD139 +S315001E327A44485AD1444A26463FF200F4444CD8835F +S315001E328A70616865D780FFFF070E08F20800686539 +S315001E329AD780FFFF010E03001960DC78FFFF584F27 +S315001E32AA79009C800165020200650200FF3BF70158 +S315001E32BA584F70009C804542EA02584F6B009C800C +S315001E32CAFFFFE502584F66009C80FFFF030200655A +S315001E32DA4542F801FF3A29006047FFB52844FFB464 +S315001E32EA9480FFFFD402604528472A5F40482A4732 +S315001E32FA2C5F404A2C47655F404C10644042284565 +S315001E330A0500584F4700948028452602584F42000A +S315001E331A94802A452102584F3D009480FFFF1C02C5 +S315001E332A22444C822C453103EC0110654542284540 +S315001E333A94802A452102584F2D0094802C451C0242 +S315001E334A584F28009480FFFF170222444C822845B4 +S315001E335A1C03584F1F00EC01404B284740482A477A +S315001E336A404A2C4760452A5E404C2A44285E404AFB +S315001E337A2844655E40482B446865D780FFFF170EB2 +S315001E338A90012646C5605E78FFFFB9FF2646C560D0 +S315001E339A5E78FFFFC981CB83071C011D080000F456 +S315001E33AA01F2FFFFFFB4D8815AD22F58FFFF2646D5 +S315001E33BAC560584F7B78FFFF0260006300F4846580 +S315001E33CA7861A5D0DA85803A020000F40465644461 +S315001E33DA007FCD81BDDB05036447007FCD81BDDB42 +S315001E33EAF0021C60AC632960A8640865C481614446 +S315001E33FAA3DB1C60AA610064A1DB2960A861A1D3B4 +S315001E340AFFFF60431C60B061A1DD1C60B061A1D3E1 +S315001E341AFFFF60451C60AA61A1D3FFFFD480FFFF90 +S315001E342A010303001A60B478FFFF1C60A8610164D9 +S315001E343AA1DB02600061414C03600061414A1C60C7 +S315001E344AAC61A1D3FFFF40481C60B26328410665E2 +S315001E345AD581A1D3FFFF6040012601A46041A3DBEB +S315001E346A2A432845A5D1DA856444007FCD81BDDB72 +S315001E347A05036447007FCD81BDDBF40228411C602B +S315001E348AB263A3D3FFFF6045458B1C60AE612BD387 +S315001E349AA1DB2C4128424AD3FFFF6045458C007F9B +S315001E34AA017E40481C60B261A1D3FFFF60450064DD +S315001E34BAD480FFFF43036544FFA4A1DB1C60AE61F3 +S315001E34CAA1D32845A480FFFF07032CD32AD3604520 +S315001E34DAD480FFFF010314002844E084FFFF022460 +S315001E34EA010008002B44588B1C60AE632BD3A3DB4A +S315001E34FA007F017E40482A44588A2C44588CD201A1 +S315001E350A1C60A8610064A1DB1C60AC61A1D3FFFF2D +S315001E351A6045FAA46041A1D3FFFF6041C58106A199 +S315001E352A41486541FCA1A1D328416040012601A458 +S315001E353A6045C58161431C60AC61A1DD1C60A86142 +S315001E354AA1D3FFFF604001260D001C60AA61A1D30C +S315001E355AFFFF01A4A1DBFFFF1A600A78FFFF1960AD +S315001E356AC678FFFF1960CA78FFFF00660160BA6156 +S315001E357A1F600863A1D304A1207FBDDB327E217F93 +S315001E358ABDDBA1D3FFFF227FA3DB10000160BA6158 +S315001E359A1F600863A1D30066207FBDDB59D3FFFFD8 +S315001E35AA217FBDDB59D3FFFF227FA3DB0F60D862C3 +S315001E35BAA2D19F60FF64A084A2DBDEFE0B040F600D +S315001E35CADA6240600064A2DB1A60DB645ADBCFFE55 +S315001E35DA2F58FFFF246056621F600664A2DB206412 +S315001E35EA4ADBFFFF2DFF0F60DA6220600064A2DB52 +S315001E35FA1B6003645ADBCFFE2F58FFFF0F60D8628B +S315001E360AA2D19F60FF64A084A2DBBEFE0F60D062B9 +S315001E361AA2D140600064B084A2DBCFFE2E58FFFF03 +S315001E362A10601E621E60D264A2DB1A608A62006481 +S315001E363AA2DB06A210604064A2DB06645ADB5ADBD2 +S315001E364A1A6096620064A2DB06A210604464A2DBBC +S315001E365A06645ADB5ADB1A60A2620064A2DB06A261 +S315001E366A10604864A2DB06645ADB5ADBC0F11A6094 +S315001E367AA662A2D910603E6220607764A2DB106041 +S315001E368A426220608164A2DB1060466220608B64FF +S315001E369AA2DB00607061AE60584DC178FFFF6644BA +S315001E36AA63FB046403FAA9F307FA00643EFA3FFAB7 +S315001E36BA0F60DA6200600264A2DB1B6068645ADB72 +S315001E36CACFFE2F58FFFF0F60D8620064A2DB036489 +S315001E36DA6AFB0F4EE060584F9578FFFF0E4F006447 +S315001E36EA6CFB63F5EBF32FFAECF330FAEDF331FAD2 +S30B001E36FA81F32CFA32FAE0 +S315001E370082F32DFA33FA83F32EFA34FABCF319FA3E +S315001E3710066080640EFA2060584E4F78FFFFF760F1 +S315001E3720FF65204424800F60D062A2D180600064B1 +S315001E3730B084A2DBCFFE0F60D862A2D1FF608F6479 +S315001E3740A084A2DBC1F11A609A62A2D924606662C5 +S315001E37501A609664A2DB02644ADBFFFF04FF006464 +S315001E37606CFB0F60DA6200607464A2DB1B60BC64D3 +S315001E37705ADBCFFE2F58FFFF0F60D862A2D1006022 +S315001E37800464A0809C840503A084A2DB1E60D278FC +S315001E3790FFFF00604064A0809C840303A084A2DB1C +S315001E37A0E00100602064A0809C841103A084A2DB3B +S315001E37B020405027D601AFF3FFFFFEA0FFFFD10624 +S315001E37C06CF3FFFFF6A0DC840105A2DBCA010060D4 +S315001E37D01064A0809C84CE03A084A2DB0000E0F3CC +S315001E37E02945D4806CF303041C603378FFFFF6A0D2 +S315001E37F0FFFF03041C603378FFFF0F60DA62006070 +S315001E38006464A2DB1C6008645ADBCFFE2F58FFFFE0 +S315001E38100F60D862A2D100600464A0809C84050358 +S315001E3820A084A2DB1E60D278FFFF00604064A080E9 +S315001E38309C840303A084A2DBD20100602064A080C6 +S315001E38409C84E403A084A2DB20405027DF01AFF353 +S315001E3850FFFFFEA0FFFFC3066CF3FFFFF6A0DC848E +S315001E38600105A2DBBC010F60D8620064A2DB20400A +S315001E3870402B0B000F60DA6280600064A2DB1C60C6 +S315001E388033645ADBCFFE2F58FFFF1C60926501641E +S315001E3890A5DBC2F11A609A62A2D90C6453FB1C60A6 +S315001E38A055646BFB1F605078FFFF246066621A60CA +S315001E38B0A264A2DB03644ADBFFFF04FF0F60D8622B +S315001E38C0A2D1FF60DF64A084A2DB88F11960866343 +S315001E38D0D38068FD5F0368F3E2F160432944A3D3F6 +S315001E38E0C085D4805BD35606604308A3BED383F13E +S315001E38F0A3D3D08082F10502BFD3D08081F101020D +S315001E3900D080F8A32B021C6089646BFB1F600778AE +S315001E3910FFFF01B084F33E0363F5487E2AFA246056 +S315001E392030622360E464A2DB66445ADB02645ADB1F +S315001E3930FFFF2BFFC1FE0F60DA6200600164A2DB8F +S315001E39401C60A6645ADBCFFE2F58FFFF0F60D8629D +S315001E3950A2D1FF60FE64A084A2DB1C002D6036652A +S315001E3960A5D3654110A301A4FEB4C485FEA1BDD393 +S315001E397059D1FFFFD080D58005020103F8011E60D4 +S315001E3980C678FFFF68F388F104A4D080FFFF020308 +S315001E399068FBA101E0F32945D480FFFF0C072460D4 +S315001E39A066621A609664A2DB03644ADBFFFF04FFAD +S315001E39B01B608F78FFFFE1F32945D480FFFF1706B2 +S315001E39C00465E960584E4B78FFFF0564DCFBF2F395 +S315001E39D0FFFF01BCF2FB246066621A609664A2DBDE +S315001E39E003644ADBFFFF04FF1D604B78FFFF0F6079 +S315001E39F0DA6200607464A2DB1D6002645ADBCFFECD +S315001E3A002F58FFFF0F60D862A2D100600464A08009 +S315001E3A109C840503A084A2DB1E60D278FFFF006093 +S315001E3A204064A0809C840503A084A2DB1C6065788C +S315001E3A30FFFF00602064A0809C841703A084A2DB85 +S315001E3A4020405027A701AFF36CF3FEA0F6A00A068E +S315001E3A500304006455FB40496CF3FFFFF6A0DC84AB +S315001E3A600105A2DB1C606578FFFF00601064A08064 +S315001E3A709C84C603A084A2DB246066621A60A264CC +S315001E3A80A2DB03644ADBFFFF04FF1C603378FFFFE3 +S315001E3A901C60CA78FFFF0F60D8620064A2DB20405C +S315001E3AA0402B0B000F60DA6280600064A2DB1D6093 +S315001E3AB04B645ADBCFFE2F58FFFF1C6092650064D5 +S315001E3AC0A5DBC3F11A609A62A2D91F603C64A0D31B +S315001E3AD0FFFF08B401BC2902A2DB0F60D862006496 +S315001E3AE0A2DB0F4EE560584F0278FFFF0E4F0F60A8 +S315001E3AF0DA6210600064A2DB1D6082645ADBCFFEB0 +S315001E3B002F58FFFF1F603C64A0D3FFFF60400C26AA +S315001E3B100C00246066621A609664A2DB02644ADBAD +S315001E3B20FFFF04FF1E607578FFFF01643060E662CA +S315001E3B30A2DB0D6453FB1D60A1646BFB1F605078F6 +S315001E3B40FFFF246066621A60A264A2DB03644ADB7E +S315001E3B50FFFF04FF0F60D862A2D1FF60DF64A0845E +S315001E3B60A2DB88F119608663D38068FD01024300DB +S315001E3B7068F32941A0D158D3D180644560430F050F +S315001E3B8008A3BED383F1A3D3D08082F10502BFD38F +S315001E3B90D08081F10102D080F8A3070245491E603C +S315001E3BA008646BFB1F600778FFFF2D603665A5D383 +S315001E3BB0654110A301A4FEB4C485FEA1BDD359D18F +S315001E3BC0FFFFD080D5800F02F9020565E960584EC9 +S315001E3BD04B78FFFF0464DCFBF2F3FFFFFEB4F2FB3F +S315001E3BE01E60C678FFFF68F388F104A4D080FFFF2D +S315001E3BF0020368FBBD01E1F32945D480FFFF75056D +S315001E3C001E6008636BFD1A604C631F600778FFFF1A +S315001E3C10246066621A609664A2DB03644ADBFFFFB9 +S315001E3C2004FF0565E960584E4B78FFFF1F600E6165 +S315001E3C300064A1DB0464DCFBF2F3FFFFFEB4F2FBBF +S315001E3C4084F363F5487E2AFA0260006520443480B8 +S315001E3C50246030622360E464A2DB66445ADB02649D +S315001E3C605ADBFFFF2BFFC1FE0F60DA6200600164A4 +S315001E3C70A2DB1E603F645ADBCFFE2F58FFFF0F608C +S315001E3C80D862A2D1FF60FE64A084A2DB1A609A628B +S315001E3C9000603264A2DB246066621A609664A2DB50 +S315001E3CA002644ADBFFFF04FF0F60DA6200601064E5 +S315001E3CB0A2DB1E605F645ADBCFFE2F58FFFF0F602C +S315001E3CC0D862A2D1FF60EF64A084A2DBFD60FF650F +S315001E3CD0204424800F60D062A2D180600064B0842C +S315001E3CE0A2DBCFFE1B608F78FFFF0F60DA620060DB +S315001E3CF07464A2DB1E6080645ADBCFFE2F58FFFF62 +S315001E3D000F60D862A2D100600464A0809C84050363 +S315001E3D10A084A2DB1E60D278FFFF00604064A080F4 +S315001E3D209C840503A084A2DB1D60B178FFFF0060A2 +S315001E3D302064A0809C841703A084A2DB2040502709 +S315001E3D40DD01AFF36CF3FEA0F6A00A0603040064C1 +S315001E3D5055FB40496CF3FFFFF6A0DC840105A2DB90 +S315001E3D601D60B178FFFF00601064A0809C84C603AE +S315001E3D70A084A2DB246066621A60A264A2DB0364CE +S315001E3D804ADBFFFF04FF1D604B78FFFF08600065DE +S315001E3D90204434800F60EA62A2D100602064B084A1 +S315001E3DA0A2DBCFFE246066621A608A64A2DB03640D +S315001E3DB04ADBFFFF04FF246066621A609664A2DB7C +S315001E3DC003644ADBFFFF04FF246066621A60A26476 +S315001E3DD0A2DB03644ADBFFFF04FF0F60D8620064A8 +S315001E3DE0A2DB5ADB00646AFB0F60D062A2D10260BE +S315001E3DF00064B084A2DBCFFE0F60DA62006002644C +S315001E3E00A2DB1B6068645ADBCFFE2F58FFFFA3D3CD +S315001E3E107FF17EFBD080006440030F60D862A2D182 +S315001E3E20BF60FF64A084A2DBDEFE0B040F60DA62B5 +S315001E3E3040600064A2DB1F600D645ADBCFFE2F5864 +S315001E3E40FFFF0F60D862A2D1DF60FF64A084A2DBF1 +S315001E3E507EF17FF924605662A2D91E644ADBFFFFFB +S315001E3E602DFF0F60DA6220600064A2DB1F603C64D7 +S315001E3E705ADBCFFE2F58FFFFBEFE0F60D862A2D1BF +S315001E3E80DF60FF64A084A2DB0F60D062A2D1406017 +S315001E3E900064B084A2DBCFFE01646BF7FFFFFFFF59 +S315001E3EA002600065204434800F60D862A2D17F6014 +S315001E3EB0FF64A084A2DB204051230B000F60DA6250 +S315001E3EC080600064A2DB1F6054645ADBCFFE2F584D +S315001E3ED0FFFF0F60D862A2D17F60FF61A1845AD115 +S315001E3EE04ADBA1845ADB40600065204434800264AC +S315001E3EF08CFBFFFFC1FE8CF30065D480FFFF12030F +S315001E3F000F60D862A2D17F60FF64A084A2DB0F601F +S315001E3F10DA6280600064A2DB1F6077645ADBCFFE24 +S315001E3F202F58FFFF2D60366454FB0F60D862A2D156 +S315001E3F30EF60FF64A084A2DB1A60584EBA78FFFFBA +S315001E3F400F4EEC60584F8978FFFF0E4F0F60DA62F6 +S315001E3F5010600064A2DB1F60B1645ADBCFFE2F58CF +S315001E3F60FFFF1A60584ECB78FFFF246066621A6008 +S315001E3F709664A2DB02644ADBFFFF04FF0F60D86271 +S315001E3F80A2D1EF60EF64A084A2DB01648CFBBF604C +S315001E3F90FF652044248001601462A2D1126046632C +S315001E3FA0C385C6A33AA3D780AFF30904FEA06CF35C +S315001E3FB03A06F6A00064370455FB4049340008A3B0 +S315001E3FC0BED383F1A3D3D08082F10502BFD3D080A6 +S315001E3FD081F10102D080F8A3E502BED35AD1604713 +S315001E3FE0404A644740482060584E2378FFFF0A48DF +S315001E3FF02060584E3378FFFF2060584E4F78FFFFE3 +S315001E400001602E656CF3A5D3F6A040BC0604A5DBA5 +S315001E40106AF1FF60FB64A0846AFB6CF3FFFF00B8C5 +S315001E4020CC840103A2DBFD60FF65204424800F6063 +S315001E4030D062A2D180600064B084A2DBCFFEC1FE36 +S315001E40406BF7FFFFFFFF55F12844D08403A4030E30 +S315001E4050E884E8840400FAA4E884E887C0BFC08424 +S315001E4060A2DB2E58FFFF56F12844D0841FA4060E4D +S315001E4070E884E884E884E884E8840700C2A4E88427 +S315001E4080E884E884E884E887F8BFC0845CF156FBC0 +S315001E4090D080FFFF0105644452FB2E58FFFF2040CF +S315001E40A0202A08000060B865A5D3FFFFD0806445AE +S315001E40B0010660452F67D480FFFF0106604555F156 +S315001E40C08B67D080604102246441D5848065C48795 +S315001E40D001050064FFB440492040202A06002E43F5 +S315001E40E0F360584E7C78FFFF434E2E58FFFF0F603D +S315001E40F0D862A2D100600864B084A2DBCFFE2F581E +S315001E4100FFFF0F60D862A2D100601064B084A2DBEC +S315001E4110CFFE2F58FFFF0F60D862A2D10060206429 +S315001E4120B084A2DBCFFE0F60F662A2D100604064AF +S315001E4130B084A2DBCFFE2F58FFFF264627F2706300 +S315001E414060400A36060014360A00373604006E36FC +S315001E41500400D063040033630200216300001F6065 +S315001E41601661A1DD2646BFF201600065F4A1D58069 +S315001E417000F40224654141481E6502600063A5D015 +S315001E4180DA85803A020000F404656444007FCD811E +S315001E4190BDDB05036447007FCD81BDDBF0020260F7 +S315001E41A000632841BDD3BDD1FDA0FFFF07036444B4 +S315001E41B0E085D181FEA1C783F50D04001A604C610E +S315001E41C0A3D3A1DB314006265800006470FB0260B3 +S315001E41D000632841BDD3BDD1FCA0FBA00803280364 +S315001E41E06444E085D181FEA1C783F40D4600BDD38C +S315001E41F0BDD300B870FB6FFBBDD33F02A3D3604592 +S315001E42006047B48460413FB5E884E884E884E88466 +S315001E4210E884E88472FB6547E084E08471FB6444AD +S315001E4220E085FAA3C7831A6044626144A2DBD20109 +S315001E4230BDD3A3D300B86EFB74FB1F0287F170F3C8 +S315001E42406DF904656040003A06653144B4844051F8 +S315001E4250022A0B0008BC405172F371F100B8644586 +S315001E4260010367456550CC8473FB0F60EA62A2D1D9 +S315001E427001600064B084A2DBCFFE0F60EC62A2D3A5 +S315001E4280FFFF6040802A84001F600E610164A1DB6F +S315001E42902260584E1C78FFFF264600F40DF280FB66 +S315001E42A0006486FB0F60EA62A2D100608064B0845F +S315001E42B0A2DBCFFE26463FF200F41E65F4A4D4A070 +S315001E42C0604101062C61414802600063A5D0DA8573 +S315001E42D0803A020000F404656444007FCD81BDDB94 +S315001E42E005036447007FCD81BDDBF00202600063DB +S315001E42F02841BDD3BDD101A8C98106036444D1811D +S315001E4300E0854206C783F50143482C60E663434AAF +S315001E4310644128430065454C655CBDD3614000364B +S315001E43202700CD81604002366045043660458236E0 +S315001E43306045843660450B3660458B3660451636BD +S315001E434060459636604565400036E7016444DC9C50 +S315001E43502C44003A0200454CE0012C5E655F006568 +S315001E4360454C43482A43BDDBFFFF434A2843D5013C +S315001E43702C60E46460FEA0D9FFFF20FE6440013A73 +S315001E438039002A436544A3DB350023600E78FFFF00 +S315001E4390DCF3FFFF03A802A802034102F6010F6029 +S315001E43A0EA62A2D1FF60FB64A084A2DB246066627F +S315001E43B01A606664A2DB02644ADBFFFF04FF264620 +S315001E43C01F601661A1D325F2604524F000F46443F4 +S315001E43D0C7836041022401A10AF009F2D180FFFFC2 +S315001E43E0090704046345D480FFFF04062260584E65 +S315001E43F01C78FFFF264626F0FF672088645F404A2A +S315001E44002060584E2378FFFF0A482060584E3378A6 +S315001E4410FFFF2060584E4F78FFFF2F58FFFF0F609B +S315001E4420DA62A2D3FFFF60404022AF0101602E6216 +S315001E4430A2D3FFFFBFB4A2DB1F601661A1D326461F +S315001E444060451E60FE6300F409F2BDDBFFFF0AF243 +S315001E4450BDDB0BF2FFFFBDDB0CF2A3DBFAA3264688 +S315001E4460A3D324F00061D084F181D484F181BDDB15 +S315001E4470A3D303B103A925F042FE0103CC84F18127 +S315001E4480D084F181BDDBA3D303B103A928F042FE7C +S315001E44900103CC84F181D084F181BDDBA3D303B1AA +S315001E44A003A929F00103CC84D084A3DB1F600E610F +S315001E44B0A1D3FFFF02A8FFFF02022E58FFFFF5FE43 +S315001E44C01E60FE64A0D106A4A0D364456040802B66 +S315001E44D00300FF60FF64948500609664D480FFFF2E +S315001E44E00B061F600E61A1D36AF300A804B0040276 +S315001E44F003032260EA78FFFF264600F409F25AD229 +S315001E45004048404A5AD25AD2404C60415AD080F94D +S315001E45104063AD80F0A309023C032C412A44404C63 +S315001E45202844404A00644048F401D1800102310407 +S315001E453010A380600065A580CF830802284460888A +S315001E45402A44708A2C44708CF181F501E7A36444D9 +S315001E455000A80062020200611C00E084DE82FD04E7 +S315001E456042FEF8846245C783604502FED584020575 +S315001E457001056144CF8360410803284460882A44AC +S315001E4580708A2C44708CF181F101CE82E981FD0284 +S315001E4590F18109F2FFFF6047E884E8845AD23FB5ED +S315001E45A0E084E084E084E084E084E084B4846145B1 +S315001E45B0D484C084E084E084E084E0931F600E61AE +S315001E45C0A1D3FFFF00A8FFFF02032E58FFFF1065B1 +S315001E45D07344D4936AF3264604BCA2DB26F0FF6717 +S315001E45E02088645F404A2060584E2378FFFF0A48A1 +S315001E45F02060584E3378FFFF2060584E4F78FFFFDD +S315001E46006CF3FFFF00B8CC840103A2DB0F60D862F7 +S315001E4610A2D100604064B084A2DBCFFE2460666235 +S315001E46201A60A264A2DB03644ADBFFFF04FF0F606D +S315001E4630D862A2D1FF60DF64A084A2DB26462F5873 +S315001E4640FFFF28F3FFFF60470FB45900FF6723588B +S315001E4650FFFF24605A650464A5DB120024605A65B8 +S315001E46600C64A5DB0D0024605A650664A5DBFFFFFE +S315001E46702DFF00672358FFFF24605A650864A5DBDB +S315001E468023607B64A1FBFFFF2DFF2460EB78FFFFF9 +S315001E469029F37FFBA4FB0260EE64A3FB0764A5FB64 +S315001E46A023607B64A1FBFFFFDFFE006419FF24600D +S315001E46B0EB78FFFF2360E7630C601664A0DD62FFE4 +S315001E46C023606863A1FDFFFF1AFF2460EB78FFFFDE +S315001E46D0A3604B630C601664A0DD62FF29F524609F +S315001E46E0366324600864BDDB6644BDDB0264A3DB5F +S315001E46F0FFFF2BFFF9FE00672358FFFFA7010036B9 +S315001E4700A8010136AB010236AE010336B5010436E9 +S315001E4710D1010536CF010636F1010736CB01083623 +S315001E4720B70109360C000A360D000B360E000C3684 +S315001E473017000D360D000E361E000F3632000260B3 +S315001E47400064080004600064050000600164020045 +S315001E4750206000643245B485455200672358FFFF2A +S315001E47602460AB630C601664A0DD62FFFFFF1AFFB8 +S315001E477000672358FFFF3F40022B0500906000E8AC +S315001E47802360E7630400916000E82460956328E8CF +S315001E47900C601664A0DD62FFFFFF1AFF0067235838 +S315001E47A0FFFF916000E828E8D960FE643245A485C3 +S315001E47B0455299FFA54FFFB407FB98FFA3604B63B5 +S315001E47C00C601664A0DD62FF00672358FFFF08E138 +S315001E47D0A1FFFFFF43FF016000E128F347FF604092 +S315001E47E007374B00053B0400FF0A80E1A1FFFFFFD0 +S315001E47F029F52AF347FF3FF0011B01646056ADE21F +S315001E4800B5FF6C4040E1A1FF00F46E611262644385 +S315001E481001E10364E2D0C981644CCC84DA82FA02D7 +S315001E48200160006B9AFFCA82030000F481F2FFFF4B +S315001E48307AD0A1FF644CFC1CF81D00B9061E0202AC +S315001E484000F4DA825AD2A1FF604D3F40022B0800C7 +S315001E485028F3A560C46560400E3B0200804CFE0135 +S315001E4860A1FF874E874C874C874C874C674CFFFFB2 +S315001E4870BCFF00E1D5FEA1FFFFFF0064404660417C +S315001E4880B5FFB7FFB4FF29F53FF024F24443404479 +S315001E489000F4F360A06510625AD2D981D480FFFF5E +S315001E48A0FB0261452444D484E084E084E084FDA5B3 +S315001E48B048600064C49D0D60006B2444C083BBFF2A +S315001E48C029F501E100F46C611062050000F401F2A5 +S315001E48D0FFFF60410462A1FFFFFF01101A0026447C +S315001E48E001260C002444C884404402036C45F3018F +S315001E48F00315016405FA15006C45ED012344C884B1 +S315001E4900404302036C45E7010064011501646C45D2 +S315001E491005FBE2D2DA82C981604CDD1CD703BCFFDF +S315001E4920DA0100E1D5FEA1FFFFFF08E1A1FF674CFA +S315001E493043FFAD4F02BC007FA05D01E10160696BC4 +S315001E4940A560C464604CBBFFA1FFFFFF604CA1FFC6 +S315001E4950FFFF604CFC0129F32AF107B504E165410E +S315001E49606454CDE29581A15DA1FFFFFFF90161446B +S315001E4970FEFBFFFDFF017F6701612358FFFFB1FEAE +S315001E49800805B0FE0905B2FEB3FE78430161246038 +S315001E4990B7782D603778FFFF28F329F14044444548 +S315001E49A02AF12BF1444644473FB4E0851F60446418 +S315001E49B044D75843FFFF60451C60B47CA4D36143B3 +S315001E49C004B42444020313FF06003FB4B484FF2735 +S315001E49D005FD04FB1075A1FFFFFF863EB4FE0B0509 +S315001E49E0B5FE0224A1F7FFFFFFFFB7FE07057843BA +S315001E49F001612460B7782D607278FFFF3644007F10 +S315001E4A00F2A0604505051F60D26444D7FFFFFFFF75 +S315001E4A10784301612460B778784301612460B778D2 +S315001E4A207F60C0642445A4807F6702611002106403 +S315001E4A3040400264405061FF3F404026040010E0A3 +S315001E4A40466009E0000027F10066207842FE2358E2 +S315001E4A50FFFF7F60C0642445A4807F6702611A023F +S315001E4A601C60B463A3D3077C20B50CB504030302F4 +S315001E4A70DCF900670F0000614156C7FEAC013647E0 +S315001E4A80FF230400007F60417F670400204480BC32 +S315001E4A90404000672358FFFF7F60C0642445A48002 +S315001E4AA07F67026131021C60B463A3D3017C20B50B +S315001E4AB00CB503030202DCF9FFFF02614156C7FE75 +S315001E4AC02460EB78FFFF9FF120446440FF261B0005 +S315001E4AD07FB440405C5E82FF2644FDB440465C4186 +S315001E4AE087FF62FF006324601A62A2D3FFFF00A83D +S315001E4AF06046040309F20FFCAC86FB0124605A6271 +S315001E4B000664A2DB2DFF00672358FFFF00672040C7 +S315001E4B10802A02007F67066160451C60B47CA4D3B0 +S315001E4B20614304B42444020313FF55013FB4B48405 +S315001E4B30FF2705FD04FB2040802A02001075070092 +S315001E4B402D6058620164A2DBFFFF086010754301E9 +S315001E4B50254601F208F0604703B403AC7F67036184 +S315001E4B60080224603664404B2C60584DB278FFFF15 +S315001E4B7000672358FFFF2440012B490025441FB41C +S315001E4B80E0852560C564C498FFFFC0FE3D00C1FEDA +S315001E4B903B00C2FE3900C3FE3700C4FE3500C5FE0B +S315001E4BA03300C6FE3100C7FE2F00C8FE2D00C9FE0B +S315001E4BB02B00CAFE2900CBFE2700CCFE2500CDFE0B +S315001E4BC02300CEFE2100CFFE1F00D0FE1D00D1FE0B +S315001E4BD01B00D2FE1900D3FE1700D4FE1500D5FE0B +S315001E4BE01300D6FE1100D7FE0F00D8FE0D00D9FE0B +S315001E4BF00B00DAFE0900DBFE0700DCFE0500DDFE0B +S315001E4C000300DEFE0100DFFE00672358FFFF00647F +S315001E4C109FFEF084FFFF9EFEF084FFFF9DFEF08444 +S315001E4C20FFFF9CFEF084FFFF9BFEF084FFFF9AFEB3 +S315001E4C30F084FFFF99FEF084FFFF98FEF084FFFFCD +S315001E4C4097FEF084FFFF96FEF084FFFF95FEF0842C +S315001E4C50FFFF94FEF084FFFF93FEF084FFFF92FE9B +S315001E4C60F084FFFF91FEF084FFFF90FEF08406FBAA +S315001E4C708FFEF084FFFF8EFEF084FFFF8DFEF08414 +S315001E4C80FFFF8CFEF084FFFF8BFEF084FFFF8AFE83 +S315001E4C90F084FFFF89FEF084FFFF88FEF084FFFF8D +S315001E4CA087FEF084FFFF86FEF084FFFF85FEF084FC +S315001E4CB0FFFF84FEF084FFFF83FEF084FFFF82FE6B +S315001E4CC0F084FFFF81FEF084FFFF80FEF08405FB6B +S315001E4CD000672358FFFF5C5C00672358FFFF2440D4 +S315001E4CE0012755000560006305FD3044BDDB3144D8 +S315001E4CF0BDDB3244BDDB3344BDDB3444BDDB354452 +S315001E4D00BDDB3644BDDB3744BDDB3844BDDB394431 +S315001E4D10BDDB3A44BDDB3B44BDDB3C44BDDB3D4411 +S315001E4D20BDDB3E44BDDB3F44BDDB02616144023652 +S315001E4D3082FF033683FF043684FF053685FF06365B +S315001E4D4086FF073687FF2044BDDB2144BDDB224498 +S315001E4D50BDDB2344BDDB2444BDDB2544BDDB26442D +S315001E4D60BDDB2744BDDB2844BDDB2944BDDB2A440D +S315001E4D70BDDB2B44BDDB2C44BDDB2D44BDDB2E44ED +S315001E4D80BDDB2F44BDDBDD81083AD0015400274030 +S315001E4D9010263000264401362D00023682FF0336C9 +S315001E4DA083FF043684FF053685FF063686FF2544B7 +S315001E4DB000364440013644410236444203364443DB +S315001E4DC004364444053644450636444607364447AB +S315001E4DD008364448093644490A36444A0B36444B7B +S315001E4DE00C36444C0D36444D0E36444E0F36444F4B +S315001E4DF087FF210025441036445011364451123681 +S315001E4E0044521336445314364454153644551636F6 +S315001E4E1044561736445718364458193644591A36C6 +S315001E4E20445A1B36445B1C36445C1D36445D1E3696 +S315001E4E30445E1F36445F00672358FFFF2546AE605B +S315001E4E40584F6C78FFFF03617F670B0200F02460EA +S315001E4E5036620464A2DB5AD90A645ADBFFFF2BFFB3 +S315001E4E6000672358FFFF4060C0642445A4807F6707 +S315001E4E700261110224605A621A64A2DB006050634A +S315001E4E805ADD27604864A1FB2DFF2460EB78FFFFE7 +S315001E4E902AF305FB00672358FFFF4060C0642445C4 +S315001E4EA0A4807F6702610F0224605A621C64A2DB23 +S315001E4EB0006050635ADD27606264A1FB2DFF2460EB +S315001E4EC0EB78FFFF00672358FFFF7F60C064244511 +S315001E4ED0A48002613E0225452044802A3A00F160E4 +S315001E4EE00064D480FFFF0B03F1600164D480FFFFD2 +S315001E4EF00603F1600264D480FFFF300329002C6094 +S315001E4F00CA62A2D1BAF31F603E61A084A1DB254509 +S315001E4F102360A0630261BDD3BDD1D480BDD3BDD5F0 +S315001E4F20CD8102031503F701A2FFA6D3404C00A8AC +S315001E4F3067430C02A2DD42486441AE60584DC178FB +S315001E4F40FFFF664428DB02032C58A3FF0C610300F7 +S315001E4F5004617F67010000672358FFFF2C60CA6249 +S315001E4F60A2D1BAF31F603E61A084A1DB1F6042611D +S315001E4F700164A1DBFFFFC4FEEE01C6FEEC017E60EE +S315001E4F80C0642445A48002613F022545F82B3B00E0 +S315001E4F902EF56744D4801F60E063390360612444A4 +S315001E4FA001272900A3FCA4F8BDD3A3D1D480CD81AB +S315001E4FB00824645808A3F80208600063BDD3A3D171 +S315001E4FC0FEA0FA600064D0801402130204A3BED3AE +S315001E4FD0BDD10F18D4800D180303C383C383F701F5 +S315001E4FE06441DD81E181CB8346652E60584FDB78B7 +S315001E4FF0FFFF00670A00BDD3BED1D480CD81082431 +S315001E5000645808A3F80204617F672358FFFF0F64E4 +S315001E501023FA674424FA62413C6000651A6367609E +S315001E5020DC64654658D02EF559D8FB1F00672358F9 +S315001E5030FFFFCB83BFD14A656443BDD3FFFF6041EB +S315001E50400126DC81E984DC8423FA09004BD3FFFFA9 +S315001E50506041E884DC8423FABFD14A6564432E602E +S315001E5060584FDB78FFFF00672358FFFF25F2FFFF2F +S315001E5070E0A02064010625FA23F2DFD1CC84E08568 +S315001E50800B06BFD16441D5806443010665414A655E +S315001E50902960584F5D78FFFF00672358FFFFDCF33A +S315001E50A0026323FC07B425FA00672358FFFF4BD380 +S315001E50B0BFD36041C983E981DD81A3FAE0813C60EB +S315001E50C00067022402A46047404BC9814A65AB466D +S315001E50D059D0AB46A5D8DA85803A020000F404659D +S315001E50E0F61F00672358FFFFFCA3A3D14C65A4D36C +S315001E50F0DA83604725FA007E60470126DC8460411C +S315001E5100E884D88423FAAB01FCA3A3D14C65A4D3AF +S315001E5110DA83007F25FA60410126DD81E984D88481 +S315001E512023FA9D0128609E63BFD3FFFF6041E8847A +S315001E5130DC8423FA4A652E60584FDB78FFFF006732 +S315001E51402358FFFF28609E6323F2C065CC84E0814E +S315001E51500A04BFDBD5800703010665416144BFDB38 +S315001E51604A65584FAA0000672358FFFF034E286062 +S315001E517058433678FFFF2960826129606062A2D398 +S315001E5180A1DBCC84A88305042960606458D159D953 +S315001E5190FD1F0E43810123F21C608E6560411C605B +S315001E51A02A63A3DBFFA1486458D07EA85BD90202FE +S315001E51B000F40264FFA1D78002030103F5012EF558 +S315001E51C000602F6525F20063CC8403A3FD054A64A7 +S315001E51D0D7801B60C6612F05A1DDE383FEA358D0D1 +S315001E51E07EA859D9020200F40264F91F006359DD34 +S315001E51F02EF51B60C66425F0A0D3D38001B0040330 +S315001E520001A40303A2DB0100A2DD1B60CE631060B6 +S315001E52105A65BDD3BDD1E084C48210607A65076429 +S315001E522064415ADBD680CD810603FB0225F202A31A +S315001E5230CC84A2DAEC0200672358FFFF1C602A61A9 +S315001E5240A1D323FAE0834A650402026323FCA5FC6C +S315001E52500900DB8359D1A5D8DA85803A020000F40D +S315001E52600465F81F00672358FFFF1B60C662A2D3A2 +S315001E5270006102A4FEA023FA1B03FAA4FDA401A149 +S315001E5280FD07614323F225FCE08302A31B60C66172 +S315001E529000604A6459D158D87E3A020000F402646E +S315001E52A0F91F25F223F201B0CC84040223FA020070 +S315001E52B0006425FA00672358FFFF414B6542806450 +S315001E52C0D4852B4100A1558B0D03020465410200B6 +S315001E52D00064404BCA8458D0C981BDD9FC0200F473 +S315001E52E00465EC012F58FFFFFCA3A3D3027CA0D3B9 +S315001E52F023F8DC8425FA00672358FFFF026423FA8D +S315001E530001649DFE0228026425FA00672358FFFFEA +S315001E53102C60D662A2D3027C23F801B425FA00675C +S315001E53202358FFFFFCA3A3D1026423FAA4D3006370 +S315001E533060400A37016314370263373706636E37D8 +S315001E53400B6325FC00672358FFFF026423FA88FFC0 +S315001E535075448DFFE887E884E88403B425FA006760 +S315001E53602358FFFF046423FA86FF294487FF25FA84 +S315001E537055F352F18065C487007F26FA6444C487BC +S315001E5380007F27FA00672358FFFF056423FA52633E +S315001E5390B7F34BDAB6F34BDAB5F34BDA604188FF57 +S315001E53A0725C89FF4AD8A24820230E0064408027DB +S315001E53B01500DC84BDDABDD21104DC84A2DAA3D2C8 +S315001E53C00D04DC84A3DA0A005263B7F34BDAB6F394 +S315001E53D04BDAB5F34BDA54904C63E0020067235860 +S315001E53E0FFFF25F02C60D26523F2A5D902A86444DE +S315001E53F0070200BCF2A40403030728600062A2D9B8 +S315001E540000672358FFFF206328606061486458D0F8 +S315001E541059D9FD1F25F02064D081FFFF020725FA0A +S315001E54200F0028606463C383012A0600CF83A3D3BB +S315001E5430CD81007FBDDB04030064C981BDDBFD0297 +S315001E544000672358FFFF23F225F002A80160A6621B +S315001E54500902A2D96441324402B500B9D48408288F +S315001E546002BC405200672358FFFF23F225F002A814 +S315001E54700160B2620C02A2D96441324440B500B941 +S315001E5480D4840824030040BC02B5D484405200676D +S315001E54902358FFFF23F225F00160B063A3D9A9F1BB +S315001E54A02061414B6443D8F36345664165468CFAD9 +S315001E54B06040013606000236040004360200053A34 +S315001E54C002000064010001646FFA79F37AF1FFFFAE +S315001E54D0A0846543020279F3FFFF60410F60AE654B +S315001E54E0D8F3FFFFE08444D36145A480FFFF040286 +S315001E54F0E884A480FFFFFC03A4847BFB6FF0604757 +S315001E550090846FFA604760458064E884A480FFFF3C +S315001E5510FC03A48470F070FA0061E884FFFF0205A4 +S315001E5520DD81FB01E1810F60A26545D30EFA66435C +S315001E55300CF42B414D8B02A3B60200672358FFFFC6 +S315001E554023F225F002A8006702022DF92CF9235832 +S315001E5550FFFF2760FE6123F225F202A800A80902BA +S315001E55600703D0A030650304A7A05965010665444C +S315001E5570A1DB00672358FFFF3060E8610164A1DBF1 +S315001E558004003060E8610064A1DB7E60C0642445CF +S315001E5590A4807F6702610E0206614156C7FE246023 +S315001E55A0EB78FFFF3647FF230400007F60417F67CD +S315001E55B0010000672358FFFF7E60C0642445A48057 +S315001E55C07F67026112022D6014616543A1DD0C61C5 +S315001E55D04156C7FE2460EB78FFFF3647FF230400C3 +S315001E55E0007F60417F67010000672358FFFF25F09B +S315001E55F029605E62A2D919002C60D664A0D1A0F9DA +S315001E56000C603862406300645ADBFE1F6440012A48 +S315001E56100C0004650C60386148643E637CA858D053 +S315001E562059D9020200F40264F91F29605E62A2D1F2 +S315001E56300D601C6502FE6444F884F884F887604198 +S315001E56406444E084E084C4843EFB6042614403A259 +S315001E565060FEA2DBFFFF20FE64440C603A65E08418 +S315001E5660E084E084E084C48440FBFFFF00670061A1 +S315001E56702358FFFF2C60D664A0D1A0F900644041D8 +S315001E56806440012AA4004A64A0D2FFFF4042802B38 +S315001E56900400FFB4404201644041A9F3464B6046F4 +S315001E56A02063E383AB4626F0AB4655F8AB4627F0A0 +S315001E56B0AB4656F8AB4628F0AB4657F8664402A6EC +S315001E56C0F11FA9F3FFFF6046AB460C607A652244C4 +S315001E56D0FFB4E084E084E084E084C481C98152641E +S315001E56E00E6358D059D9FD1F2144012A0800AB4626 +S315001E56F0F0A16E640E6359D158D8FD1FAB462244E5 +S315001E5700FFB4E084E084E0840C60DC65C4816045FF +S315001E5710C9816264066358D059D9FD1F2144012AE6 +S315001E57200800AB46F8A1AE64066359D158D8FD1FD2 +S315001E5730AB4665440C60FC65C481C9816A64066318 +S315001E574058D059D9FD1F2244FFB4E084E085C48495 +S315001E57500C60C265C4817264046358D059D9FD1F9A +S315001E5760AB462144012A0600FAA18864046359D176 +S315001E577058D8FD1F37F02144012A130022443DFB51 +S315001E5780604102FEF884F884F8843CFB0C60BE631C +S315001E579088FFCD8106A3FD0D8DFF3BFD644780BFAF +S315001E57A0605C2243806188FFCF83E181FD0D8DFF02 +S315001E57B061473191B18437FA1F63E383664402A6BB +S315001E57C037F06644B19C37F802A6FA1FAB4600674F +S315001E57D000612358FFFF23F225F002A8006722026C +S315001E57E03DF1644403B44042D080A9F3FFFF6046F6 +S315001E57F0B7F480610202E383EB83224488FFCC84E4 +S315001E5800E181FD0D8DFF614731919D85A78337FC93 +S315001E58101F63E383664402A6B7F26644A581B7FA00 +S315001E582002A6FA1F00672358FFFF2C60D664A0D17C +S315001E5830A0F96440012A4E0027F21C60BA65604733 +S315001E5840007FE08444D366416046604305F2161825 +S315001E5850614627F06346D08004F20C02614626F0AC +S315001E58606346D08003F20602614625F06346D08069 +S315001E5870FFFF070380F4FFFF6346E81BA9F308FE3C +S315001E58806043614601032A00434BAB4637F28060F4 +S315001E5890307CB084A2DA4E616E640E63AB4659D07C +S315001E58A0AB4658D8FB1F88640463AB4659D0AB463B +S315001E58B058D8FB1FD98198640463AB4659D0AB46B2 +S315001E58C058D8FB1FD981AE640E63AB4659D0AB4682 +S315001E58D058D8FB1F006700612358FFFF0167206130 +S315001E58E02358FFFF2C60D664A0D1A0F96440012A7C +S315001E58F0310027F21C60BA656047007FE08444D3FE +S315001E590066416046604305F21618614627F06346F7 +S315001E5910D08004F20C02614626F06346D08003F264 +S315001E59200602614625F06346D080FFFF070380F41A +S315001E5930FFFF6346E81BA9F308FE604361460103A9 +S315001E59400D00434BAB4637F2806030619D85A484C3 +S315001E5950A2DAAB46006700612358FFFF016720618C +S315001E59602358FFFFA2FF464502F009600864D08057 +S315001E597000F401F2665C2546560270275400126436 +S315001E598003FA04F80EF287FC8DFC8EFCDA82166191 +S315001E59900063C9815ADCFD026040F03B16003244AA +S315001E59A0AFF301B0FAA008242C05DC83F0670EFACB +S315001E59B024601A642BDB66445ADB02645ADBAFFD95 +S315001E59C02BFFFE643B424ADB4F00B0F30665D480D4 +S315001E59D0DC831705B0FD98FE0404007F087E0EFAD0 +S315001E59E03BFF24600E642BDB66445ADB02645ADBE3 +S315001E59F00EF22BFF60400826F7FEFD643B424ADB93 +S315001E5A003200ACF3FFFFD8A0FFFF0D04246026640E +S315001E5A102BDB66445ADB02645ADBFFFF2BFFFC645A +S315001E5A203B424ADB2100464500642BDB25445ADBFC +S315001E5A3002645ADBFFFF2BFFA2FF00F401F00A18D7 +S315001E5A407067A080F0670603C08401FA25462544C8 +S315001E5A5080FC05FAAF60584E9278FFFFD4FEA3FF76 +S315001E5A60FF643B424ADBD4FEA3FF2D58FFFF246092 +S315001E5A7014644047584F0D00246008644047584F31 +S315001E5A801800246020644047584F03002460EB78BA +S315001E5A90FFFF27D50EF20B186040012A080024606E +S315001E5AA03664404B2C60584DB278FFFFF2012F58DA +S315001E5AB0FFFF27D50EF214186040012A110002F0CE +S315001E5AC009600864D080A2FFB0F30202CC84B0FB4A +S315001E5AD024603664404B2C60584DB278FFFFE901B6 +S315001E5AE02F58FFFFFB643A424ADBA2FFB3F3AFF324 +S315001E5AF0CC80FDA001141E05AE60584D9878FFFFA0 +S315001E5B00A2FF1803F0670EFA2460366224601A6438 +S315001E5B10A2DB66445ADB02645ADBFFFF2BFFF664E8 +S315001E5B203A424ADBB3F3AFF3CC83DC840115B3FDF3 +S315001E5B30AFFBD4FEB2F3B0F300A8B1F10302D080DE +S315001E5B40FFFF2705AE60584D9878FFFFA2FF210381 +S315001E5B500063B2F30EFCCC84FF3AB2FB98FE03043C +S315001E5B6008BB0EFC3BFF2460366224600E64A2DB7B +S315001E5B7066445ADB02645ADBFFFF2BFFF7643A4288 +S315001E5B804ADBB0F30EF2DC8308B0B0FD0828F7FE40 +S315001E5B90D4FEA3FF2460EB78FFFFB9FE13FF24405B +S315001E5BA0802B0B00A2FF254609F40EF2051808BC31 +S315001E5BB00EFAFFFFF7FE0100D8FEA3FF25463EF2B2 +S315001E5BC000F408F0254606B4FF7F10BC0626FD7FAE +S315001E5BD00EFA3EF23FF26041082A64473FFA6045DC +S315001E5BE02760B862A2D3A3FCABFC91FCD480C06034 +S315001E5BF0E165A5800104070323F00864B084A2DAD8 +S315001E5C002E609F78FFFF2E60584FE978FFFF140421 +S315001E5C1023F00464B084A2DAB8F127605264A0D3DC +S315001E5C20FFFFDC84DC80D0800403A2DB0824C6FED2 +S315001E5C300200206000758300DCF3A9F107B46443FB +S315001E5C40FDA02CF2710201B0644378022EF21C6094 +S315001E5C50BA656047007FE08444D366416046604370 +S315001E5C6005F2161861462EF06346D08004F20C0229 +S315001E5C7061462DF06346D08003F2060261462CF083 +S315001E5C806346D080FFFF070380F4FFFF6346E81BD1 +S315001E5C90A9F308FE604361465103634680F6254616 +S315001E5CA043182EF266411C60BA656047007FA9F153 +S315001E5CB0E08444D364431118604600F2FFFFFC1BC8 +S315001E5CC06644644680F0604680F86546654380F00B +S315001E5CD001FA80FC644680F80B006446624300F2BB +S315001E5CE0A3DB604680F081FC80FC644680F860433E +S315001E5CF06146434B2CF0ADF02EF2AB4603F884F80A +S315001E5D0005FA036406FAAB461E60BC61A1D31E608B +S315001E5D10FE7CD080FFFF0703A0DDDA9CA1D949D304 +S315001E5D20FFFFDC84A1DB0A00DCF302A3FEA0F9A0C0 +S315001E5D300106040223F00464B084A2DA07FC23F2EF +S315001E5D40FFFF271B2760BA62A2D3FFFF6040003AFF +S315001E5D501000246036622360DE64A2DB66445ADBD2 +S315001E5D6002645ADBFFFF2BFF0EF2C1FE10AC0EFAC9 +S315001E5D701F00246036622360F064A2DB66445ADB91 +S315001E5D8002645ADBFFFF2BFF0EF2C8FE10AC0EFAA2 +S315001E5D900F002460366224600264A2DB66445ADB6E +S315001E5DA002645ADBFFFF2BFF0EF2CEFE10AC0EFA7C +S315001E5DB02460EB78FFFFCB84C983FFFF080458D10C +S315001E5DC0A5D8DA85803A020000F40465F81F2F581C +S315001E5DD0FFFF3EF2CCF108B019F83B02EBF12FF8AB +S315001E5DE0ECF330FA6045EDF331FA464A00F46043AF +S315001E5DF005F206F2D08007F00502D480D380020297 +S315001E5E00DCF30303AA4642FE25006040032A100067 +S315001E5E1002F203F004F26043AA462CFC2DF82EFA79 +S315001E5E2081F132F882F133F883F134F808641000F8 +S315001E5E3002F203F004F26043AA4632FC33F834FA47 +S315001E5E4081F12CF882F12DF883F12EF80160086499 +S315001E5E502AFA02FE2F58FFFF304402A800E1030271 +S315001E5E6042FF47FFA1FF80FF90FF98FF88FF84E156 +S315001E5E70FFFF0000A1FFFFFF873E2D605864A0D3E1 +S315001E5E80FFFF011BF70187FF204480FF604080262D +S315001E5E90F101C06040ECC06000EDC06080EEAC4F0A +S315001E5EA0BFB4A05C2C60D662A2D1FFFF644002275D +S315001E5EB0060028E224E2BFFFFFFF7540100028E21D +S315001E5EC024E200600061006094E0BFFFFFFFA15066 +S315001E5ED07540FFFFFFFFFFFFFFFF006010E02D6014 +S315001E5EE058620064A2DB016039E20460007AAC4F9E +S315001E5EF040BC007FA05CC060D9ECC0600FEDC060E6 +S315001E5F008FEEAE4F04BC007FA05E2661CD81FFFFE3 +S315001E5F10FD02AE4FFBB4A05EAD0180FF90FF98FF61 +S315001E5F202F6010632044BDDB2144BDDB2244BDDB54 +S315001E5F302344BDDB2444BDDB2544BDDB2644BDDB3B +S315001E5F402744BDDB2844BDDB2944BDDB2A44BDDB1B +S315001E5F502B44BDDB2C44BDDB2D44BDDB2E44BDDBFB +S315001E5F602F44BDDB2F600464A0DD306030632F60DC +S315001E5F700664A0DD2F6008633044A3DB2F600A632E +S315001E5F803144A3DB2F600C633244A3DB2F600E6308 +S315001E5F903344A3DB81FF91FF58514B0082FF92FFD2 +S315001E5FA05851470083FF93FF5851430084FF94FFC7 +S315001E5FB058513F0085FF95FF58513B0086FF96FFBF +S315001E5FC05851370087FF97FF5851330080FF90FFC7 +S315001E5FD099FF2F600464A0D130446443BDDB314475 +S315001E5FE0BDDB3244BDDB3344BDDB3444BDDB35444F +S315001E5FF0BDDB3644BDDB3744BDDB3844BDDB39442F +S315001E6000BDDB3A44BDDB3B44BDDB3C44BDDB3D440E +S315001E6010BDDB3E44BDDB3F44BDDBEF6004640AFBD3 +S315001E60204021FE0180FF90FF98FF88FFA1FFFFFF22 +S315001E6030873E425040532F600662A2D3FFFF405256 +S315001E604033443242A2DBDA82A2DDDA836544BDDB4B +S315001E60506144BDDB6644BDDBBDD93044BDDB99FF63 +S315001E6060A44CBDDBA54CBDDBA04CBDDBA14CBDDBF2 +S315001E607098FF2F600664A0DD2F600862A2D3FFFF83 +S315001E608040502F600C62A2D3FFFF40522F600E625B +S315001E6090A2D3FFFF405331412F600A62A2D3FFFFF6 +S315001E60A040512F600462A2D3FFFF60432044BDDB34 +S315001E60B02144BDDB2244BDDB2344BDDB2444BDDBC2 +S315001E60C02544BDDB2644BDDB2744BDDB2844BDDBA2 +S315001E60D02944BDDB2A44BDDB2B44BDDB2C44BDDB82 +S315001E60E02D44BDDB2E44BDDB2F44BDDB2F60046477 +S315001E60F0A0DD6158FFFF24E22DF32CF300BDCC84F6 +S315001E610008032CFB060265442CFB8AFF8060007583 +S315001E611088FFF2F33140012A4400604304B002B006 +S315001E6120082416022944FFFF00A8CC810E0341490C +S315001E613037026340082A0900F7B33060DA7CA4D11F +S315001E6140AD4FFDB4A05D44492B006340022A1400E6 +S315001E61503060DC64A0D33060D87CA4DB404930605C +S315001E6160DE64A0D33060DA7CA4DB0CBBFDB3AD4F7E +S315001E617002BC007FA05D14003060E064A0D33060D6 +S315001E6180D87C0E18A4DB40493060E264A0D3306090 +S315001E6190DA7CA4DB08BBFBB3AD4F02BC007FA05D5F +S315001E61A0F2FD01604E61A1D36143171858D36241B7 +S315001E61B00318CC84A1DB110049D3A3DB06A1A1D30E +S315001E61C059D16045A5D359D1B084A5DB64440636A2 +S315001E61D0CDFE0736D6FEE5012346B060A178FFFF49 +S315001E61E0464324606061A1D359D1061B59D359D1A8 +S315001E61F0031B59D359D1F018006349DD604002369E +S315001E620011000336320001360800053AEA01A4D30E +S315001E62105AD39C85A484A2DBE40101604E6100640E +S315001E6220A1DBDF01316016644045220001604E6627 +S315001E6230A6D304A16043A1D3C981604500BBA1DBDF +S315001E6240BED30903D4849C84DC84FFFF040EA3D131 +S315001E625063466443F2019C84DC8549DD614400BBD0 +S315001E6260A6DB02036544BEDBBC013060F16440451B +S315001E627001604E66A6D3FFFFD0800F18020360464C +S315001E6280F90158D3A4D360450063A4DD051858D37D +S315001E6290FFFFC483A2DDCA84A6DB255864410060C5 +S315001E62A04674CDE204E1026000E13F4440260B0045 +S315001E62B0012A0500426009E060601CE0040042609D +S315001E62C009E080601CE00429FE01C4E243643ADB57 +S315001E62D0A4F3FFFF60413F4402278400202BFF01E9 +S315001E62E080E1956080E76140402B0D0005633260BA +S315001E62F0584F4478FFFF2863FFFFFE1F016332607D +S315001E6300584F4478FFFFFFB1CD81E1852660F864C2 +S315001E631044D1FFFF64433260584F4478FFFF00604C +S315001E632000633260584F4478FFFF2760146129606E +S315001E6330A462A2D345D147BCE0846245645FE8836C +S315001E63403260584F4478FFFFA3F3CDE2605404E158 +S315001E63500429FE01C4E21560A2E73869FFFF6844FE +S315001E63600116FD01012A36000360807CA383296085 +S315001E6370A462A2D143BBB383956080E73260584FB7 +S315001E63804478FFFFE3831560A2E73869FFFF684183 +S315001E63900116FD0163476140012A0300003ACC84C1 +S315001E63A00200073ADC84FFB4A5DB6047E884476534 +S315001E63B02960A462A2D3B485B48380E1956080E788 +S315001E63C03260584F4478FFFFA3F3CDE26054042990 +S315001E63D0FE01C4E2A4F3FFFFFFFF802B0400326020 +S315001E63E01D78FFFFFF01A4F380E1CC84E0851560D4 +S315001E63F0A2E726603464584F4F0026605064584FFB +S315001E64004B0026606C64584F470026608864584FC0 +S315001E641043002660A464584F3F002660C064584F50 +S315001E64203B002660DC64584F37000168FF6AFFFF99 +S315001E64300116FE013F44202700003F40402608006B +S315001E644000601864006000659484A0501D6019E207 +S315001E6450C4E20063A3FD327B4DE2BFFEC4E241FFF0 +S315001E6460E0FEE1FEE2FE43FF44FF46FFA5F362FFA8 +S315001E6470604005362DFF0736D5FE08E1886085711A +S315001E64808DE2A2601678FFFF50EC634AFFFF0116ED +S315001E6490FE0140EC2F58FFFF44D3807C60486047C6 +S315001E64A0007FB08AFFFF0116FE012F58FFFF42FF35 +S315001E64B040FFDDFEAD4F007F01BCA05D00EE196101 +S315001E64C0CD81FFFFFD024345204460BC4040026073 +S315001E64D0EE637FF3A3FD407FA4FB0564A5FBDFFEF1 +S315001E64E019FF2460B7643F40012B020032607C64B2 +S315001E64F0A6FBBB601C78FFFF04EEAD4F007F01BC00 +S315001E6500A05D1961CD81FFFFFD02AD4F007F01BC6D +S315001E6510A05D00EE1560A2E72460BE6325603265AD +S315001E6520DFFE80E1BDD3FFFF6048604780BC007F71 +S315001E6530604AD780A1FFFFFFF50225603263266001 +S315001E65403465BDD3FFFF6048604780BC007F604A4C +S315001E6550D780A1FFFFFFF5023F40202B00000168F8 +S315001E6560FF6ABFFE33606478FFFF3F40202BAD00FD +S315001E65700116FE013869A1FFFFFF6844012AA50026 +S315001E658027607064A0D3FFFFDC84FFFF0828A2DB10 +S315001E65907FF180600064B09C01007FF1DDFEAD4F8F +S315001E65A0007F01BCA05D00EE4345204420BC404058 +S315001E65B00260EE64A3FBA4F90564A5FBDFFE19FFCA +S315001E65C08300204420BC40404345A4D1DA83C385C2 +S315001E65D080E1DFFEBDD3FFFF6048604780BC007FC1 +S315001E65E0604AD780A1FFF602BFFE6E003F404026DE +S315001E65F013000B60F862A2D1006010649084A05054 +S315001E6600F8A2A2D10A6019649084A05206A2A2D151 +S315001E6610466009649084A050AD4FFEB4A05DAD4F98 +S315001E6620FDB4A05D02EEBDFE500080E10116FE0126 +S315001E66306448926AA1FFFFFF684027605E64A0D38C +S315001E6640FFFFDC84FFFF0828A2DB3F0080E1011666 +S315001E6650FE010168A76AA1FFFFFF684036002044BD +S315001E666020BC404080E164460116FE012169A1FF5F +S315001E6670FFFF685E0116FE012269A1FFFFFF685F2C +S315001E668026FA1CF20116FE013A69A1FFFFFF685F9A +S315001E669027FA1B00204420BC40404345BED5A4D249 +S315001E66A05A86EFA011610106604124609C6380E159 +S315001E66B0BDD326420116FE016049A1FFFFFF6844B5 +S315001E66C0CD81A2DA5A86F402254321E10064BFDB9E +S315001E66D02044202A070007B40436C3FE0636CCFE25 +S315001E66E00736D5FE2044D8B440402044402A070031 +S315001E66F09FFE1E05BFB44040A6F7FFFFFFFF2460A6 +S315001E67003C63BDD30261171B04A3BDD30261131BD9 +S315001E671004A3BDD302610F1B04A3BDD304610B1BCF +S315001E672004A3BDD30661071B04A3BDD30761031BC8 +S315001E6730BB601C78FFFFA3D14044204407B5D48517 +S315001E6740358024452460786444D7FFFFFFFF80E12F +S315001E67504345204420BC40406443BDD3BDD1404484 +S315001E676010271000FF607F651560A2642440082B69 +S315001E6770A484A057FFFF6449FFFF68440116FD016C +S315001E6780007FA3DBA10180E14345204420BC40409D +S315001E67906443BDD3BDD14044102B1100A3D3FFFFCC +S315001E67A0156080E724400727020050EC0000604A6F +S315001E67B0FFFF0116FE012440202B40EC0F00156042 +S315001E67C022642440082780BCA3D3A0576048644493 +S315001E67D080BCFFB4604AFFFF0116FE017501426FC1 +S315001E67E06F74636F64652021212020005354412F4E +S315001E67F041502046756E632773001F00030002007A +S315001E68001A0000000400020002000500010001003B +S315001E68100400060007000500060007000600060025 +S315001E68200700010002000200010002000100010033 +S315001E6830020002004000320032000A00020006007A +S315001E68404000320036000A000200060040003B00EF +S315001E685040001700070007004A0040004A001E00BD +S315001E68600C00080057004D0057002B0019000800A9 +S315001E68705D0053005D0031001F000800A9F3216171 +S315001E6880007C010000FA6046FE63A3D8FE1FCD8180 +S315001E6890D884F80221618067404AA9F51460026512 +S315001E68A0017C07182A4302FC5F8A8EF870F800F4F2 +S315001E68B0F8012E58FFFF3F4040260A00426009E0BD +S315001E68C03F40012A030060601CE0020080601CE05D +S315001E68D040EC00ED02EE806058EC806000ED8060BA +S315001E68E082EEC06059ECC06007EDAD4FFEB4A05DF0 +S315001E68F000F328FB40442F602C7C20F9A260007C0C +S315001E690021F9A260E07C22F91860757C23F91860D3 +S315001E6910867C24F91860B07C25F91860C17C26F99E +S315001E6920916000E828E8446002E610674052106055 +S315001E693004E608600063FA600065BDD3BDD302A8F5 +S315001E6940D4804A024902DB83FA6027655BD3BFD136 +S315001E69501A18C383D480C383F902DB83D383D386F9 +S315001E69606441CD81A6D1DA862460BE65006072635D +S315001E6970A5D3DA859084FF270200A2D90100F81F4D +S315001E6980CD81FFFFEF0208600663FA6028655BD3C0 +S315001E6990BFD10B18C383D480C383F902BFD329602A +S315001E69A0A4620EB4E084E084A2DB08600663FD6088 +S315001E69B00C655BD3BFD11018C383D480C383F90281 +S315001E69C0FAA3A3D302600065F7A0FCA00D0504057B +S315001E69D0784302612460B778216000653F433F43D8 +S315001E69E021600065C0608FEEB784405F006030E2B4 +S315001E69F0006050E2006079E2006090E20160D0E241 +S315001E6A000160F0E20160B0E2266435FB016030648D +S315001E6A100AA438FB60450060F8640AA439FB35F108 +S315001E6A200A64C48436FBC0840AA437FB09602A6440 +S315001E6A30B9FB82FF92FF5C415C465C4700E1A360A6 +S315001E6A404B630C601664A0DD87FF97FF0C60026423 +S315001E6A50405A06A4405B5C5E5C5128600062A2D36D +S315001E6A607FFB2D608861277CA1D96C60D0637FA3D4 +S315001E6A70E387007FAAFB02607F6400604265D484C0 +S315001E6A80ABFBDC84A9FB2360CA62A2DB3460584ED2 +S315001E6A903E78FFFFABF1AAF37C63ADFB604601FCBB +S315001E6AA0DC84D08000FAFA04AEFB6046006400FA6D +S315001E6AB06344807F01FAABF3AAF1DC84D084ACFB7D +S315001E6AC003602661AE60584DAE78FFFF66442EFB0E +S315001E6AD082FF404287FFACF3B4FB08600063FA6096 +S315001E6AE00065BDD3A3D302A8D480240223022C6042 +S315001E6AF0D662A2D1FFFF644080261C0004A3FD605F +S315001E6B000D655BD3BFD11618C383D480C383F90228 +S315001E6B10BFD3AD49FEA000640E0408B120BC0828F0 +S315001E6B2018BC1C60B863077CA3D91C60B663057CC1 +S315001E6B30A3D9010000641C60B463A3DB006440504B +S315001E6B4063FF60FF66FF65FF64FF61FF62FF4960CA +S315001E6B5002E1526002E15B6002E1656002E16C6087 +S315001E6B6002E1766002E1416002E104652C60D464B4 +S315001E6B7044D3EF60584E8D78FFFF24605A650C642F +S315001E6B80A5DB3560F864A1FB2DFF0661414B09604C +S315001E6B900861AE60584DAE78FFFFF0670EFA2460AE +S315001E6BA0366224601A64A2DB66445ADB02645ADB30 +S315001E6BB0FFFF2BFF2B414D8BFFFFE9020661414B69 +S315001E6BC009600861AE60584DAE78FFFF24603662DC +S315001E6BD024600E64A2DB66445ADB02645ADBFFFFA6 +S315001E6BE02BFF2B414D8BFFFFEB021860F578FFFF45 +S315001E6BF000EA00EB506003EA516013EA526030EA85 +S315001E6C00536040EA546052EA55606DEA566071EA76 +S315001E6C1057608BEA586047EA5960A0EA5A60B2EAA2 +S315001E6C205B60C1EA5C60D7EA5D60EBEA5E60A0EA83 +S315001E6C30506036EB516037EB526020EB5360E4EB4D +S315001E6C40546034EB556058EB566048EB5760D0EBFA +S315001E6C505860C3EB5960FCEB5A6034EB5B6058EB33 +S315001E6C605C60C0EB5D60D0EB5E6091EB00EA00EB12 +S315001E6C70E06002EAE06003EBA06000EBB06000EBB0 +S315001E6C80AB48403B0100FC0100EB0360026262441C +S315001E6C90A2DB0F64607FA05A806000EAA06000EA53 +S315001E6CA0D16000EA3F40402608000060186400607C +S315001E6CB000659484A0501D6019E22444FFB404FBB1 +S315001E6CC05060006405FB106010752460EB78FFFFB2 +S315001E6CD03F41A54C5037040001B9415FB56055E0F0 +S315001E6CE00C601062A2D301600165D4805AD10F02D6 +S315001E6CF05AD33C600066E087404A6760DC616444A4 +S315001E6D00C8840C63AA4658D0AA4659D8FB1F0860E9 +S315001E6D100063FA600065BDD3A3D302A8D4806102C6 +S315001E6D2060026E600C613C600066414B2B416E60DA +S315001E6D30547CD180A1D2250559D0604559D24447ED +S315001E6D40E087404A59D2598B404C08600063BED337 +S315001E6D50BDD1EC18D480EA180303C383C383F7019D +S315001E6D606744C084E0852C44D48063410106654493 +S315001E6D70C883AA4659D127D85A87FC1FAA462B4133 +S315001E6D80D5016E605461414B2B416E608C7CD18067 +S315001E6D90A1D2270559D0604559D24447E087404ABB +S315001E6DA059D2598B404C08600063BED3BDD1EC1836 +S315001E6DB0D480EA180303C383C383F70104A3A3D1B4 +S315001E6DC05A882C43D380FFFF01066443CF83AA460D +S315001E6DD060FE28D15E8827D85A87FB1F20FEAA464A +S315001E6DE0D301B8FEB9FEBAFEBBFEBDFEBFFE2C60C9 +S315001E6DF0D662A2D312636040012705000B60EA62C9 +S315001E6E0000645ADBFE1F34605B78FFFFF1FFAA6C3D +S315001E6E101E000400F2FFAE6C1E000400FBFFB66CE3 +S315001E6E201E000400F1FF40641E000400F2FF4464CD +S315001E6E301E000400FBFF4C641E00040086FD0C2889 +S315001E6E400000060010FD74010000020014FDD42C83 +S315001E6E5000000A0020FA502600000E0021FA3426F1 +S315001E6E6000000E0022FA6C2600000E0023FA2025D2 +S315001E6E700000010024FA142700000E0025FA34250E +S311001E6E800000800026FA1A250000010002 +S315001F4000A260DD78FFFFFFFFFFFFFFFFFFFFFFFF40 +S315001F4010A260C37841FFFFFFFFFFFFFFFFFFFFFF08 +S315001F4020A260C978C4E2FFFFFFFFFFFFFFFFFFFF8C +S315001F4030A260197843FFFFFFFFFFFFFFFFFFFFFF90 +S315001F404044FF2054CDE2A260DB7808E1FFFFFFFFAB +S315001F4050A260DD7844E2FFFFFFFFFFFFFFFFFFFFC8 +S315001F4060A260DD7846FFFFFFFFFFFFFFFFFFFFFF99 +S315001F4070A260DD78FFFFFFFFFFFFFFFFFFFFFFFFD0 +S315001F4080A86070784C4EFFFFFFFFFFFFFFFFFFFF8B +S315001F4090A760F8784CE2FFFFFFFFFFFFFFFFFFFF60 +S315001F40A0C4E284FF225882FFFFFFFFFFFFFFFFFFCF +S315001F40B0A3607E7843FFFFFFFFFFFFFFFFFFFFFFAA +S315001F40C0E4E2A8601178B5F3FFFFFFFFFFFFFFFFD4 +S315001F40D0BA60CA7864E2FFFFFFFFFFFFFFFFFFFF23 +S315001F40E0A8608478A4E2FFFFFFFFFFFFFFFFFFFF2B +S315001F40F0A860527847FFFFFFFFFFFFFFFFFFFFFF8D +S315001F4100AE601B78FFFFFFFFFFFFFFFFFFFFFFFFF5 +S315001F4110AE604878FFFFFFFFFFFFFFFFFFFFFFFFB8 +S315001F4120AC60D57842FFFFFFFFFFFFFFFFFFFFFFDA +S315001F4130AD60057843FFFFFFFFFFFFFFFFFFFFFF98 +S315001F4140AD60057844FFFFFFFFFFFFFFFFFFFFFF87 +S315001F4150AF60BD7845FFFFFFFFFFFFFFFFFFFFFFBC +S315001F4160AD600878FFFFFFFFFFFFFFFFFFFFFFFFA9 +S315001F417000608364802909FBAD60E378FFFFFFFFC2 +S315001F41803060F07840FFFFFFFFFFFFFFFFFFFFFFDD +S315001F4190FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0A +S315001F41A0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA +S315001F41B030607B78FFFFFFFFFFFFFFFFFFFFFFFF63 +S315001F41C0B9604778FFFFFFFFFFFFFFFFFFFFFFFFFE +S315001F41D0B860B778FFFFFFFFFFFFFFFFFFFFFFFF7F +S315001F41E0B0608678FFFFFFFFFFFFFFFFFFFFFFFFA8 +S315001F41F0A1FFFFFF833EFFFFFFFFFFFFFFFFFFFF45 +S315001F4200BB602178FFFFFFFFFFFFFFFFFFFFFF01DF +S315001F421041FFFFFFFFFFFFFFFFFFFFFFFFFFFF0145 +S315001F422042FFFFFFFFFFFFFFFFFFFFFFFFFFFF0134 +S315001F4230B0FFB1FF40FF43FFBB601C7844FFFF0187 +S315001F4240BB602178FFFFFFFFFFFFFFFFFFFFFF019F +S315001F42503360757845FFFFFFFFFFFFFFFFFFFF017D +S315001F4260BB601C7884E2FFFFFFFFFFFFFFFFFF011C +S315001F4270BB601B78FFFFFFFFFFFFFFFFFFFFFF0175 +S315001F4280BF60E378FFFFFFFFFFFFFFFFFFFFFFFF9B +S315001F4290EA60EF78FFFFFFFFFFFFFFFFFFFFFFFF54 +S315001F42A0BF60EB7842FFFFFFFFFFFFFFFFFFFFFF30 +S315001F42B0BF60EB7824E2FFFFFFFFFFFFFFFFFFFF5B +S315001F42C0E960B378FFFFFFFFFFFFFFFFFFFFFFFF61 +S315001F42D0BF60EB7844E2FFFFFFFFFFFFFFFFFFFF1B +S315001F42E0BF60EB7884E2FFFFFFFFFFFFFFFFFFFFCB +S315001F42F0BF60EB7847FFFFFFFFFFFFFFFFFFFFFFDB +S315001F43002460BF78FFFFFFFFFFFFFFFFFFFFFFFFD9 +S315001F43102460EE78FFFFFFFFFFFFFFFFFFFFFFFF9A +S315001F432025600C78FFFFFFFFFFFFFFFFFFFFFFFF6B +S315001F43302460EB7828E2FFFFFFFFFFFFFFFFFFFF71 +S315001F43402460EB7844FFFFFFFFFFFFFFFFFFFFFF28 +S315001F43502460EB7845FFFFFFFFFFFFFFFFFFFFFF17 +S315001F43602460EB7846FFFFFFFFFFFFFFFFFFFFFF06 +S315001F437000608764802909FB47FF2460EB78FFFFF5 +S315001F43800000000000000000000000000000000008 +S315001F439000000000000000000000000000000000F8 +S315001F43A02F603D7842FFFFFFFFFFFFFFFFFFFFFF6D +S315001F43B000000000000000000000000000000000D8 +S315001F43C000000000000000000000000000000000C8 +S315001F43D000000000000000000000000000000000B8 +S315001F43E000000000000000000000000000000000A8 +S315001F43F02F608D7847FFFFFFFFFFFFFFFFFFFFFFC8 +S315001F4400304402A800E1070262FF63FF64FF65FFF5 +S315001F441066FFBFFEA1FF82FF88FF6C4041FFC4E21B +S315001F442043FF5C4908E1A2601678FFFFA1FF98FFD2 +S315001F4430803E9FFE030431604F78FFFFE2FE40057A +S315001F4440E0FE5B05E1FEF20429400826EF017244F7 +S315001F4450E884E884E884E884E884B5F3E885FFB750 +S315001F4460E084E084B4857344D4841065D480FFFF50 +S315001F447026043F40402613000B60F862A2D100605D +S315001F448010649084A050F8A2A2D10A601964908487 +S315001F4490A05206A2A2D1466009649084A050F2F4ED +S315001F44A03060D47C634001260800A4D3FFFF01B40B +S315001F44B0FFFF0302AD4FFEB4A05D02EEBDFEBE01BF +S315001F44C021465E629AFF07E1A1FFFFFF0625100046 +S315001F44D0A2DC7ADC7ADC6262015D7ADC7ADC7ADC69 +S315001F44E07ADC44FF062504000EE1026001E19E010D +S315001F44F062FFC4E241FF0AE19901C874CDE2294473 +S315001F450008BC404905E13060D663A3D3F2F3061811 +S315001F45102840082A050028404836020002BCF2FB44 +S315001F45203F40012BFFFFA1FF674C0661CD8104258C +S315001F45303000874CFB022840402B020015606F6B32 +S315001F4540F360A06404252500804C30643ADB44FFE9 +S315001F455004251F000460006525443736B4846E3673 +S315001F4560B484804E244104251400614C64A1615417 +S315001F4570A1FFFFFF04250D00674E07641CFB00E12A +S315001F4580026001E1530133F3FD11FC1840643ADB6D +S315001F45900A00C4E22744202A040042643ADB674C1F +S315001F45A0020041643ADB62FF08E1E2FE72525C4997 +S315001F45B0327B4DE23B0108E13901A1FF98FF803EA6 +S315001F45C0304402A800E10202A1FFFFFF82FF88FF1D +S315001F45D048E20170CEF1006B89FF645488FF9FFE8D +S315001F45E0020564446054CDE2C2643ADBBCFFB5FFEA +S315001F45F01DFF264402B440463C4400BCFFFF060391 +S315001F4600274026220300026431FBC0FE2744202ACE +S315001F46100400A06000EAB06000EA5C4D274418B4AD +S315001F4620404700E16C4044E2C4E247FFB7FFB4FFD6 +S315001F463032F10829090064400722060043FF274478 +S315001F464010BC4047006432FB31413C4401B100BC01 +S315001F46500A02090332F3007C01B4FFFF040332F997 +S315001F4660026431FBC0FE48602D7D0860006B00644C +S315001F467033FB0C601664A0D7FFFFFFFF32F3082938 +S315001F46800A00604007220700FEB432FB274410BC15 +S315001F4690F7B4404743FF00643ADB016008E131404D +S315001F46A0012A0400006433FB01600AE1E5FE1D05D3 +S315001F46B0274410261D009FFE020402E110003EE162 +S315001F46C03144012A0C000E0A284404270700D43659 +S315001F46D00500C4360300AE4FF7B4A05EBFE1A1FFCD +S315001F46E0FFFF813EAB602978FFFFA360EC78FFFFD9 +S315001F46F027440826FFFFBA606C78FFFF48F332F1A4 +S315001F4700006364400322660031400826F401CDE2AF +S315001F471084E17041AD8071408027ED120303BA60BA +S315001F4720E378FFFFA1FFFFFFC4E232FD6040012ACD +S315001F4730DF01006332FD6C403C463EF22AF0274102 +S315001F4740444820B901B4F7B10A036440082707009B +S315001F47500F609263006445FB46FBBDDBA3DBCB0A00 +S315001F47603060CA7CA4D3FFFF17182840D436140024 +S315001F4770AC4C802A11003060D07CA4D3FFFF0C18EC +S315001F47803060D27CA4D33060CC7CA4D36045D48067 +S315001F4790DC840203A4DBAF013060CC7C0064A4DBA5 +S315001F47A041473F40012B0D00F6FE674C0560696BC4 +S315001F47B03060CA7CA4D3FFFF0418AE4F08BC007F2D +S315001F47C0A05E02E1016008E1F0FE84FFBB60146495 +S315001F47D0404282FFE5FE0304A8602178FFFFE4FE46 +S315001F47E00A041DFF00EB607FA05A806000EAA060EC +S315001F47F000EAD16000EA43FFE6FE0305A3604B789B +S315001F4800FFFF3C4460460FF040426440012A03000C +S315001F4810A660AE78FFFF0B643ADB1C42224613F2FA +S315001F4820FF6560472AF240454048042B170016F2E1 +S315001F48301DF240430FF24044255E3F40012740458D +S315001F48400F6414F035F2A0820FB4CA85D48010F21B +S315001F485001022BFA274440BC4047130017F22CF0E5 +S315001F486040431BF21DFA40446440012A0200ABFC80 +S315001F487005002840A436020011F22BFA2744BFB4C4 +S315001F488040472840402BFFFFAB604778FFFF22467B +S315001F48902CF02744DFB44047B5FFBCFF47FFB7FFE7 +S315001F48A0B4FF48602D7D0860006B6440012A090033 +S315001F48B0284404270500D43A0300AE4FF7B4A05E80 +S315001F48C01B002AF001656440A43A04652744348717 +S315001F48D036F3B4FF605B4DE204643ADB01600AE124 +S315001F48E0284404270500D43A0300AE4FF7B4A05E50 +S315001F48F02BE1A1FFFFFF813E06643ADB22460164DE +S315001F490031FBC0FEBA60EC78FFFFB5FFA1FF6C401C +S315001F49103F40012B0300674C0560696B02E1016094 +S315001F492008E1C4E208643ADBF0FE254601F2614560 +S315001F4930D49E214616FA2A44724524FAB5F3060474 +S315001F4940E4E2DC9C294001266444B5F925FAB6F356 +S315001F49500204DC84B6FB28FAB7F30204DC84B7FB37 +S315001F496029FA2D44042A06002840A4360300A56010 +S315001F49707478FFFF264384BBFCB32146015D0FFC01 +S315001F49805C46254406FA05FF2744012A130050FEFC +S315001F49902840083A12002FF230F0604331F22246C7 +S315001F49A064412CF02DF0D3802EF0D180D080274487 +S315001F49B0090C0300274406220500B8B440470264C9 +S315001F49C031FBC0FED46440480D643ADB3060CE7CB8 +S315001F49D07C44A4DB21461CF27CF1FFB4D080FFFF90 +S315001F49E00106644440450A36706414363864373A03 +S315001F49F00300047F404515646E3A0300847F4045DB +S315001F4A000B64404400632844A4360B00042B0900A2 +S315001F4A1030F32445D484CA65D4833060CE7C0164C8 +S315001F4A20A4DBD4641A000F643ADB214670631CF2C0 +S315001F4A30CA6540450A36706414363864373A03002F +S315001F4A40047F404515646E3A0300847F40450B641E +S315001F4A5040442BF2C485D483C46440482FF0B0F081 +S315001F4A60B1F200E1A1FFFFFF804E834C9AFF844CF9 +S315001F4A70854C814CA1FF98FF874F874C874F874DE9 +S315001F4A80874C01080100FFFF874C874C874C874CDA +S315001F4A90FFFFFFFF6A44BCFFC4E20C7404E1A1FFE1 +S315001F4AA035F3C4E2605489FF137488FFB5FF47FFCF +S315001F4AB0B7FFB4FF48602D7D0860006B2840C436E1 +S315001F4AC008003060CE7CA4D3FFFF031BAE4FF7B4A4 +S315001F4AD0A05E2744012A0500FEB44047A4607C78E7 +S315001F4AE0FFFFA3603E78FFFF2840B43A0900274422 +S315001F4AF007220500F8B44047026431FBC0FE93014C +S315001F4B002844D4360300A6609578FFFF48E2274461 +S315001F4B10FBB440472D601663A3D3B060584DD578BC +S315001F4B20FFFF34FB1C4222462AF0F760FF64A08475 +S315001F4B30A2DA6040402BCC0022F2FFFF6040222603 +S315001F4B4042000126030004260700C200042BC000F2 +S315001F4B50A9F3FFFF6046010007F447F2FFFFDC845D +S315001F4B6047FA0D603E6280FFBE60784402A4A2DB56 +S315001F4B70E678FFFF82FFA9F3665CD080007C0703FF +S315001F4B806643224622F263466040012A01003CF139 +S315001F4B9047F064416447FFB4605F20BC802680AC49 +S315001F4BA0604722463AFA6444207F34943BFA0860F1 +S315001F4BB000EA0F64607FA05A806000EAA06000EAE6 +S315001F4BC0D16000EA85002AF200607C626040402BBB +S315001F4BD02700A2D3006160FEA0D3DE82A2D1FFFF11 +S315001F4BE020FE645FDC84F181C02B0400802A020052 +S315001F4BF07FA4DC84FF3B03006047DC870161C08024 +S315001F4C000036DC844EDB60FEDA82A2D1FFFFC18450 +S315001F4C10F02210A4F02A01000064A2DBFFFF20FE91 +S315001F4C2000607C62A2D3FFFFA0D35AD13AFA3BF8A9 +S315001F4C307462A2D0FFFF6444E07FA05A6447E17FFD +S315001F4C405AD0A05A6444E27FA05A00608062A2D361 +S315001F4C50FFFFA0D15AD164456444E37FA05A64473D +S315001F4C60E47F5AD1A05A6444E57FA05A6447E67F81 +S315001F4C705AD1A05A6444E77FA05A65400D3A1C00DA +S315001F4C806447E87F5AD1A05A6444E97FA05A644713 +S315001F4C90EA7F5AD1A05A6444EB7FA05A6447EC7F3F +S315001F4CA05AD1A05A6444ED7FA05A6447EE7F5AD169 +S315001F4CB0A05A6444EF7FA05A086000EA654402A424 +S315001F4CC0607FA05A806000EAA06000EAD16000EA17 +S315001F4CD00BF2FFFF7FB40CF00402644600F004647D +S315001F4CE0224603FA6041644601F2FCA16145D48461 +S315001F4CF0FFFF080200F00463644601F222461AFA17 +S315001F4D0003FC020022461AFA35F204F8DC8435FA4F +S315001F4D1014F20FB50FB4CC849480046000652AF298 +S315001F4D20010294842AFA95FC0600C43A0700274418 +S315001F4D30FDB4404748E2A4600B78FFFF28440426D1 +S315001F4D400500683A0300324400270300A3604B782E +S315001F4D50FFFF0A643ADBA3604B78FFFF0E643ADB62 +S315001F4D60106000653C462AF213F0A484B4BC404888 +S315001F4D707CF16447FFB46045D080706101066444CE +S315001F4D800A36706414363864373615646E360B640B +S315001F4D90404EA0630A6465400A36030038611464F6 +S315001F4DA0EB834045434402605E652AF22BF2604066 +S315001F4DB0042B04002E45D485C58405001BF0C5842D +S315001F4DC0C0842E45C4846043284400E1A1FF804E61 +S315001F4DD0834C9AFF56627AD47AD47AD45C627AD498 +S315001F4DE07AD47AD4A1FF98FF874F874C874F874D78 +S315001F4DF0874C01080100FFFF874C874C874C874C67 +S315001F4E00FFFFFFFF6A44BCFFB5FF47FF274402BCF5 +S315001F4E10404736F3B7FFB4FF48602D7D0860006B2F +S315001F4E20605B4DE2A4606C78FFFF2146B5FFBCFFB7 +S315001F4E3047FFB7FFB4FF48602D7D0860006B28440D +S315001F4E4004270900D43604000C2202000C3A030082 +S315001F4E50AE4FF7B4A05E2643254406FA2A44724590 +S315001F4E6024FAB5F30604E4E2DC9C294001266444D7 +S315001F4E70B5F925FAB6F30204DC84B6FB28FAB7F3B4 +S315001F4E800204DC84B7FB29FA2D40012A0E001DFF00 +S315001F4E90264402BC4046274407220500F8B4404773 +S315001F4EA0066431FBC0FE30F17600FCB33240012AA6 +S315001F4EB006000ABB0FFCCBFEA3604B78FFFF2D44F9 +S315001F4EC0042628000FFC05FFDCF32840803A220049 +S315001F4ED06040033A1F0032F281F133F2D08082F133 +S315001F4EE01902D08034F283F11502D0803C4412029D +S315001F4EF0AC86BBFE0F032AF221466040803A0A00A9 +S315001F4F00016431FBC0FE006432FB84FFBB60146486 +S315001F4F10404282FF30F1274405222D00FAB4404754 +S315001F4F202D44102A24002840D43A21003140082657 +S315001F4F30007C2B44D080704502286444C484FFFF44 +S315001F4F40042400B460500828010020296DE21C606B +S315001F4F509A631DF0C064C084A3D1E884E884E88402 +S315001F4F60E884E884C084A3DBA4607C78FFFF026426 +S315001F4F7031FBC0FE0700022A0500FDB44047066448 +S315001F4F8031FBC0FE05643ADB2844A43A040039F11C +S315001F4F9025440A3638F131400826007C2B44D08040 +S315001F4FA0704502286444C484FFFF042400B42840CB +S315001F4FB0E43600B460500828010020296DE2A36082 +S315001F4FC03E78FFFF2146B5FFBCFF47FFB7FFB4FF83 +S315001F4FD048602D7D0860006BAE4FF7B4A05E274476 +S315001F4FE007220500F8B44047066431FBC0FEE701FF +S315001F4FF0274405220900BAB440473C46026431FBE8 +S315001F5000C0FEA3604B78FFFF2744022A0600FDB4AB +S315001F50104047066431FBC0FEF401F30A7C506DE283 +S315001F5020F0017245DC84B5FB11643ADBB6F3060466 +S315001F5030DC84B6FBB7F30204DC84B7FBA3605678A7 +S315001F5040FFFF006112643ADB1E60FE63BDD372452B +S315001F5050448A02280200E4E2DD8102280200E4E21B +S315001F5060DD81BDD3B5F16145C0840061022401B95C +S315001F5070C48460552A52B5FB022401B9BDD3B6F1CB +S315001F50806145C0840061022401B9C484B6FB0224B1 +S315001F509001B9BDD3B7F16145C084C484B7FBA36012 +S315001F50A0EF78FFFF3140040AAE4FF7B4A05E090048 +S315001F50B03060CA7CA4D3FFFF0418AE4F08BC007F24 +S315001F50C0A05E9F01A1FFFFFF012509000425030024 +S315001F50D047FF32749601C4E2AB602978FFFF4C4E3E +S315001F50E047FF3060CA7CA4D3FFFF0418AE4F08BC2D +S315001F50F0007FA05E3274CDE2A860877800611064DD +S315001F51003ADBA3604B78FFFFA3604B78FFFF5C4D34 +S315001F5110264402260C003E4609F21E41031BAA60C6 +S315001F5120D878FFFF405EFDFB214402644046415D87 +S315001F5130214600F2464587FC4CE2016433FB0160C1 +S315001F51400EE103E13F40012700002169B6FFA1FFE1 +S315001F51506C5EB6FFB7FF605C20643ADB684326FCD3 +S315001F516022696444A1FFFFFF6C5F604326F2FFFFC5 +S315001F5170685F26FA3A691DFC2E4436F11CFAC39461 +S315001F5180CDE22E44143612000A360F006345E38320 +S315001F5190E383C783E383C783FFFF373605006E3676 +S315001F51A00400AA60F078FFFFEB83EB83EB83EB83AE +S315001F51B0FFFF8027CF831BFC016451FBA1FF1CF25D +S315001F51C02941F981524A7189685F27FA6C40031594 +S315001F51D0AB600178FFFF886085718DE2B9F1FCA392 +S315001F51E0D38043430304AA60F878FFFF3240012AA5 +S315001F51F04C009AFF23431861A1FF8C44CB832AFAE4 +S315001F52004048402704A16040032B010006A188B037 +S315001F52108836D98162452344549428400426006465 +S315001F52203FFAC98165427ADC00B9FD1C00F46E6144 +S315001F523010621402051D121E0C0000F47C6102622E +S315001F52407ADC6340FD1CF91DFFB1081E020200F443 +S315001F52500262B6FFB7FFA1FF6C445ADA98FF0160DE +S315001F526008E181E1A1FF6C40A1FF47FF2644FDB481 +S315001F527084BC01157FB44046A1FF6C401463011125 +S315001F52800100FD1FAA606B78FFFF9AFF546312642B +S315001F5290404600640FFAA1FFEBF1126150FE2D602C +S315001F52A00E62A2D3FFFF6040012A0B008C4598F8BF +S315001F52B000643AFA3BFA3CFA3DFABF60FF64A484E5 +S315001F52C001008C44ECF0BDDA404804264000A1FFE3 +S315001F52D08C44BDDA30FB6C44BDDAFFFF0126240087 +S315001F52E0D080A1FF8C446C5CF2FEBDDAEDF3D48056 +S315001F52F0D080BDD82D44150C3240022A0700284203 +S315001F53000CB2083A030010BC404D4D00030AAB60B7 +S315001F53100678FFFF11BC404D2845BF60FF642488F7 +S315001F5320420030BC404D3F0020B95C8EA1FF8C442B +S315001F5330BDDADC9C6C44F2FEBDDA0828444EDC84E0 +S315001F53402E5CB084EFB1082440B941462C008C4432 +S315001F53500461BDDA50FE8027006430FB8C44BDDA41 +S315001F5360D0808C44BDDAD48000658C44EDF1BDDA63 +S315001F5370D0802844030CA02A0A0011001065604043 +S315001F5380C4360400D43A080027404026306500641E +S315001F53903FFA464E358D5F004026F90130659DDC8C +S315001F53A09DDC9DDCF40100E12343E8A36A629AFFBA +S315001F53B0A1FF2844032B04007ADC7ADC7ADC28441C +S315001F53C088B0882A030070627ADC2844402B1300B9 +S315001F53D072627ADC04E67ADC3BF2FFFFFFFF202BCA +S315001F53E002007ADC7ADC086000EBFCA325FF3FFC99 +S315001F53F004A3B0FF01003FFCCF83DF83040200F448 +S315001F540010626C611F002703CB83FF60FE650EA32E +S315001F5410A784F2A300F410626C617ADCFE1C031DE4 +S315001F54207CA8D9810A0200F40262A7847A617ADC19 +S315001F5430FE1CF91D7CA8D981F603FFB10C1E0202C2 +S315001F544000F40262A1FF01600CE1B6FFB7FFA1FFE6 +S315001F5450CD816C445ADA98FF00E67C4433FB016029 +S315001F54600CE183E1A1FF8C444645A1FF14630110A3 +S315001F5470FE1F016008E10A64605447FF504B6750E6 +S315001F548069E26A40402B011529006C40284003261B +S315001F549015003140202A03002840503A0F002D44A2 +S315001F54A0202A0C002B44AC802840B43A0300020388 +S315001F54B030FB04002B50A460857804E104E1A1FFB2 +S315001F54C035F126446454CDE284BC2D400C22FDB434 +S315001F54D0404623643ADBA7601578FFFF2740262244 +S315001F54E00400026431FBC0FEFFFF6C40B7FFB4FF30 +S315001F54F048602D7D0860006B37F32B45D480FFFF76 +S315001F5500022865446050A04C20BCFFB4A05135F161 +S315001F55107444C0943240022A18002844A43604005A +S315001F55200CB4FFFF043611002643FDB304BB4346EC +S315001F5530012A0300284740BF40480ABB0FFC504BB7 +S315001F55406750006430FB05FFC60124643ADB28441C +S315001F5550042A0600AE4FF7B4A05EA3603E78FFFF95 +S315001F55601DFF48E2274406220500F9B4404702649E +S315001F557031FBC0FE2640102A180026F2FFFF6047A7 +S315001F5580FFB4C0A0FFFF110EB8F127604E64A0D371 +S315001F5590FFFFDC84DC80D0800403A2DB0824C6FE68 +S315001F55A004008AFF2060007588FFA760E278FFFF6E +S315001F55B0B8F127605064A0D3FFFFDC84DC80D08065 +S315001F55C00403A2DB0824C6FE04008AFF20600075C0 +S315001F55D088FF2A643ADB5C4187E1A1FF6C40020029 +S315001F55E029643ADB016008E187E1A1FF6C401100E5 +S315001F55F027606264A0D3FFFFDC84FFFF0828A2DBBD +S315001F5600F101016008E121643ADB0300016008E152 +S315001F56106C40006433FB327440630116FE0101685F +S315001F562001110900A76A22643ADB0360C9630111ED +S315001F563002006C40FC1F6C40B5FF6C40BCFF6C4009 +S315001F5640B7FFB4FF48602D7D0860006BAE4FF7B4FF +S315001F5650A05E030AA3604B78FFFF016451FB306015 +S315001F5660CA7CA4D3FFFF0418AE4F08BC007FA05E00 +S315001F5670274406220600F9B44047026431FBC0FEE8 +S315001F568048E227643ADBB3E1A1FFFFFF813E546284 +S315001F56902246A2D016637C414448803604612840C6 +S315001F56A050360461414E2844A4360E631C609C622A +S315001F56B0A2D12444E884E884E884E884E884C0848A +S315001F56C0A2DB9AFFA1FF2D600E62A2D3FFFF6040EF +S315001F56D0012A060018F2AAF0FFFFB48408362AFA38 +S315001F56E05462A2D2FFFF6A40804E7AD47AD47AD40B +S315001F56F07AD47AD47AD47AD4FFFF011D78007AD46B +S315001F57007AD47AD47AD42840032B04007AD47AD454 +S315001F57107AD46A407062284488B088367AD4284082 +S315001F5720402B0B0072627AD47AD4A2D2FFFF60405C +S315001F5730202B02007AD47AD446002343CF83DF83FB +S315001F574002035503040003F004F4644237002E409D +S315001F5750042A2100A1FF02FE102542FE7245654C58 +S315001F5760B5F30304E4E2DC84B5FBA1FF804CB6F37A +S315001F57700204DC84B6FB804CB7F30204DC84B7FB5F +S315001F5780804C5C4EF8A303F29AF204F4FFB1F8A121 +S315001F579006A46042090003F29AF204F4C882FFB11C +S315001F57A0030000F481F2FFB17AD4FFFFFD1CF91D3F +S315001F57B0FFB1171E020200F4DA82DA82A2D2A1FF1B +S315001F57C00974804D0E0003F29AF204F42343A1FFDD +S315001F57D0A0D2FEA1CB83804EAF83021D0203ED0133 +S315001F57E0E301A1FF2840402B02009C4E9C4CA1FFC9 +S315001F57F0DA83664422460CFA0BFC874F874C874F89 +S315001F5800874D874C01080100FFFF874C874C874C4B +S315001F5810874CFFFFFFFF6A44BCFF016008E10C7461 +S315001F582004E1A1FF35F3C4E2605489FF137488FFB6 +S315001F58302944F7B4404934643ADB06E147FFA460C4 +S315001F58404778FFFFFF0110617F60C064A0807F67FC +S315001F58500263260298FE1A0524600E62A2D50EF276 +S315001F58601518021809F4FB01234400A8087E0A0232 +S315001F5870664411FB4643234780BF3B4204A2A2DB7B +S315001F588008B9107E007F0EFA00670A002044DC85E7 +S315001F58900FB4FAA07F670763030545400067D8FE6C +S315001F58A0FF2705FD0A7E04FB61554A0028FB01F30D +S315001F58B029FB4446404510617E60C064A0807F6717 +S315001F58C002633102AE60584F6C78FFFF7F67036338 +S315001F58D02A022640012B240098FE190524600E6219 +S315001F58E0A2D50EF21418021809F4FB01234400A8CE +S315001F58F0087E0A02664411FB4643234780BF3B428C +S315001F590004A2A2DB08B9107E007F0EFA090020440C +S315001F5910DC850FB4FAA07F67076305054540D8FEEF +S315001F59200067D0FED9FEFF2705FD0B7E04FB1C601A +S315001F5930B463A3D3FFFF20B080BC0828A3DB615547 +S315001F5940630004B582B52502040320447FB440409A +S315001F5950A3D399FE040402BCFEB4A3DB5600DCF3FA +S315001F5960204080265200A3D3FFA0F8B40202A3DB77 +S315001F59701C0004BCBFB4A3DB08B001640824026486 +S315001F598028FB204480BC4040D0FE3F00BFB4A3DBB1 +S315001F59903C0040B0FFFFFA02F8B4A3DB08B5077C52 +S315001F59A00102DCF920447FB440401C60B463A3D3DA +S315001F59B0FFFF20B507B50828C40299FE2605204417 +S315001F59C080262300202A0000402A1F00BFB4404023 +S315001F59D00900A8FF204499FE0205802A030040BC47 +S315001F59E04040130000F180BC40406444E084E884DA +S315001F59F00A3629010B365A0128FB01F129F902F152 +S315001F5A002AF903F12BF9D0FEAEFFA1FFFFFF823E5D +S315001F5A10754402B001B02902DC0204B008B00B02C3 +S315001F5A2020024026A7FF8CFF7540802B0100ABFF8D +S315001F5A3075448DFFEA010AF3AAFF6040202B02007E +S315001F5A4060FF0D0001260C00C060007CA084803B17 +S315001F5A500200C0670300403B020000670AFBD50136 +S315001F5A60D401ABFF38FF0000D0017963FFFFFF1F92 +S315001F5A70A9FF7744605710600075404A012A1C0031 +S315001F5A802444AC8608F2180324601465D4800EF2F1 +S315001F5A900203A5D5040001BC0EFA09F4D1FE464443 +S315001F5AA00B18664410FB664720BF3B4204A2A2DBCD +S315001F5AB00EF2017510BC0EFA2A44082A1800234458 +S315001F5AC000A85C43140324600E62A2D5010009F4EA +S315001F5AD00EF20D1808B018ACFA030EFA664311FD44 +S315001F5AE04643234780BF3B4204A2A2DB08752A44D4 +S315001F5AF006222D00224400A860460EF2280310B08D +S315001F5B0001BC03020064404222000EFAD1FE24604B +S315001F5B1008644047584F840046421902224740BF37 +S315001F5B203B4204A2A2DB23F2664300A80EF2080240 +S315001F5B306040022AE40112FD10640EFA0275070086 +S315001F5B406040042ADC0112FD10640EFA04752A4413 +S315001F5B50802A19002144AC860EF2150301BC0EFAE9 +S315001F5B60D1FE246020644047584F5A0046410B021D +S315001F5B70214710BF3B4204A2A2DB0EF2664308FD7B +S315001F5B8010BC0EFA80752A4410B0204415037FB44A +S315001F5B9040401C60B463A3D3FFFF20B080B009034D +S315001F5BA0080340BC7FB404B0A3DB0303204480BCBE +S315001F5BB04040AC60D578FFFF2A40082B010010FF3C +S315001F5BC0AD600578FFFFE8FE1405EAFE2405E9FE31 +S315001F5BD01C05E7FE090547FF20440F220300CC845E +S315001F5BE040400F22B8FEEC01234100B95C4AE8028F +S315001F5BF06A01244100B9246014654547E102584FE4 +S315001F5C000F00DE025C4A46444C01224100B95C4A41 +S315001F5C1008247D01D501214100B95C4AA203D001A8 +S315001F5C2027D3030010B009F20403AC860EF2FA0262 +S315001F5C3008FE2F58FFFF0EF30F60FE650CF3248638 +S315001F5C4024466040FB3B0700802602002346034C88 +S315001F5C5046613A650C002EF34045F82B020040457D +S315001F5C600300584F39000702584F45000405665078 +S315001F5C70655261510900264700BF0EFB2EF505F040 +S315001F5C808060645000727E71ACFFAD600578FFFFC7 +S315001F5C908EFF0FF30F60FE6524860DF32EF340452E +S315001F5CA0F82B020040450300584F16000702584FB5 +S315001F5CB0220004056650655261510900264700BF40 +S315001F5CC00FFB2EF505F08060645000727E718DFF0C +S315001F5CD0ADFFAD600578FFFF2544AAF1ABF1D0807B +S315001F5CE0D080070401060500254601F00367A0853D +S315001F5CF094802F58FFFF25462641466301F2FFFF7A +S315001F5D00FFB5D58100F2050404636046F71B42FE0A +S315001F5D100D006144C5816345C5819C84DC8401F205 +S315001F5D20F085F0806544F885FFFF02FE2F58FFFFC0 +S315001F5D30A2FF24602662A2D3FFFFAC860EF20703E2 +S315001F5D4000A809F2FA0201670EFA08FE1700ACF363 +S315001F5D50FFFFD8A000B4120609600861414A7CA162 +S315001F5D600EA1A2FFAE60584EE178FFFFA3FF060308 +S315001F5D702A43AF60584E0278FFFF08FEA3FF2D5837 +S315001F5D80FFFF414A7CA10EA1A2FFAE60584EE178EB +S315001F5D90FFFF07032A43AF60584E0278FFFF08FE36 +S315001F5DA00D0024602662A2D3FFFFAC860EF2060307 +S315001F5DB000A809F2FA0201670EFA08FEA3FF2D5882 +S315001F5DC0FFFFADF37C6300BE40451A0300656544C3 +S315001F5DD0DC8584A100F2060601FC00A86046F702D6 +S315001F5DE040450E00ACF30063D484ACFB80607C643A +S315001F5DF001FA00F000FCD380ADF90202AEF908FEED +S315001F5E002E58FFFF6644254605FA06FA01F003677A +S315001F5E1002FCB0843A7E01FA126403FA00F004F819 +S315001F5E2000640C61106359DAFE1F2E58FFFF2743CB +S315001F5E30E381E9810305160300610100E4636146FE +S315001F5E40BFD22745DC84A2DABED2254688F8041BBA +S315001F5E5025446146A3DA04000AFA6046254409FA76 +S315001F5E606146BEDA2F58FFFF254400A8074B0C03D7 +S315001F5E70584F33000B4724601A652744D4800064AB +S315001F5E8001020FFA584FD30170002543E3847C416A +S315001F5E900204E881E4636146A3D2007C4045BFD873 +S315001F5EA0A3D8BED827425AD3255C6041021B27D9E7 +S315001F5EB0050025460AFA6146254409FA2544274363 +S315001F5EC00061604609F208FC00A8DD81FA02BFD115 +S315001F5ED06644BEDBC184BFDB48002546E46308F287 +S315001F5EE089F21E184047E084E8850205E8830065AD +S315001F5EF06546BFD2615CCC84A2DA25460AF200B998 +S315001F5F0065460824BEDA021BA3D80200604689FA3A +S315001F5F1000B9614608280AFA254689FC8AFC88FCCE +S315001F5F202F58FFFF006128652543AEF3AF8300BEE0 +S315001F5F301803020300FC0100ADFD63466544CC85D2 +S315001F5F4000F20702AEF5006400FADE60AF6409FBDB +S315001F5F500800664300BEDD81F102ACF1AEFDC184CF +S315001F5F60ACFB2E58FFFF006646452943FCA366443B +S315001F5F70BDDB2544BDDB0064BDDB03610E6524600C +S315001F5F802E634349A3D306A300A8CD810402F902B9 +S315001F5F90AD600578FFFF0126E601D4806045E30565 +S315001F5FA0F6A3BDD1BDD144474448444524606C6423 +S315001F5FB044D7FFFFFFFF2360DE630D650061414885 +S315001F5FC0A3D306A3AC860061090300F209F0AC86D1 +S315001F5FD000F2DD81FC026444AC86F601614425466D +S315001F5FE027DA654428454588CC855A87E902006427 +S315001F5FF027DA5ADA5A87A9F3A8F102A46046604540 +S315001F600000611EF2FFFFAC8600F20403AC8600F2AD +S315001F6010DD81FC02654402A565466444CC9CFFFFF6 +S315001F6020F0026144254627DA5A87284545880064C9 +S315001F603027DA5A8706604065ADF30161AC8600F228 +S315001F60400303D580DD81FA04CD84254627DA28454A +S315001F6050C4845ADADA81ACF159D82360DC64186338 +S315001F6060A0D106A459D8FC1F006459DA59DA016079 +S315001F60705C640A6358D159D8FD1FDCF159D87501E4 +S315001F6080074BAF60584F6D78FFFF0B47584F2100E6 +S315001F60906C01074BAF60584F6D78FFFF0B472744C6 +S315001F60A000BE08F0150364424AD309F2DC83A2DD61 +S315001F60B0254309FC634627430AFC09FA08F800A88A +S315001F60C066430302644458DD0300604625440AFA0A +S315001F60D04C012743E381E981030516030061010093 +S315001F60E0E4636146BFD22745DC84A2DAA3D22546E4 +S315001F60F088F8041B25446146BEDA040009FA604687 +S315001F610025440AFA6146A3DA2F58FFFFA0FE0705AA +S315001F6110A3FE0705A1FE520560643BDB1200205853 +S315001F6120FFFF4FF7FFFFFFFF1C60B863A3D3FFFFFF +S315001F6130FBB4A3DBA04C59BCFFB4A051A04C7DB44B +S315001F6140A051A1FFFFFF833E40600B652B440063F8 +S315001F6150E880F88402249484F383CD81FFFFF8023C +S315001F6160DF832F58404B00620164D480E0841A03FA +S315001F6170D480E084150361441161E084CD81FD0460 +S315001F61800100E084F282FFFF0224C6820228D68223 +S315001F6190E280CD81022801BCF402012AC6820300D7 +S315001F61A0E981F28261442D58FFFF00A810610403A4 +S315001F61B0F084CD81FD0461442D58FFFF00643BDB55 +S315001F61C03C44AC80FFFFBD028BF38CF302A802A8F0 +S315001F61D0080200648DFB8BFB8CFB00648EFBCAFEE2 +S315001F61E02D00030200648CFBCAFE01643BDB2360A7 +S315001F61F0E462A2D3FFFF00A860461403DCF32AF271 +S315001F6200FDA06040803A290028029BFE26052460D7 +S315001F62102A620064A2DB66445ADB02645ADBFFFF74 +S315001F62202BFFE5018CF3FFFF01A8FFFF0702236089 +S315001F6230DE62A2D3FFFF00A860460F0286FF204042 +S315001F6240522707009AFE05049DFE0304F1FE126401 +S315001F62503BDB84FFB0609478FFFF6644FCFB465C23 +S315001F62602D601663A3D3B060584DD578FFFF0DF28E +S315001F6270605C645F0DFA11643BDB9DFE0B052460B9 +S315001F62804E650864A5DBB1604A644FFB2DFFB06005 +S315001F6290A178FFFF07F00064D080A9F3070223F05F +S315001F62A00464B084A2DAB8603278FFFFD080D8F3D6 +S315001F62B040036040033A3D00664164466FF2614603 +S315001F62C064414DF16040033A34006440FF223100BF +S315001F62D0057E664561466FFA654607F000656543AC +S315001F62E06641644670F28CFA00A86FF21503604788 +S315001F62F0FFB570F200BBFFA007030E06E884A4805B +S315001F6300FFFF0202FB040800B981E884D981FD045E +S315001F63100F60A26545D30EFA0CF4FFFF00644DFB18 +S315001F63204CFB07F0664164460EF26146FFFFF07EA6 +S315001F63304EFB2AF20063404750360500A436030081 +S315001F634080360100016348FD4047082A0A00032FD3 +S315001F6350080081F12CF882F1FFFF2DF883F12EF84A +S315001F6360FFFF4AF335FA10A44AFB006415FA16FA22 +S315001F63700FFAFFFF07F0664364460EF06346007F81 +S315001F6380645E4BFB6444007EDBFB07F0A9F3FFFF53 +S315001F6390D080FFFF0303DBF3DAFB604103F200F457 +S315001F63A001F2FCA5007FD48427453C461AFA2263D6 +S315001F63B07B60FF64A484032B1C632AFA6040A43607 +S315001F63C01463434C007C22F8644107F0664364461D +S315001F63D036F26346FFB422FA6040003675002AF291 +S315001F63E0FFFF6040083AA40003F200F4A0D2AA609F +S315001F63F0AA655AD0D48003640A02D08000645AD09A +S315001F64000602D080F87FD08001030102016162433A +S315001F641046433C4607F436F2FFFFA346604022265A +S315001F64205B00604563425AD0CD813C4614026444EA +S315001F6430883A11008E3B0F00654401267900042619 +S315001F64400300102601002D00A34637F2FFFF604010 +S315001F6450802B6E005500A346654401260B000426BB +S315001F64600300102601001D0037F2FFFF6040802742 +S315001F647047001700A9F3FFFF604636F26643FFB4D5 +S315001F64803C4622F06047B08422FA634637F06040EC +S315001F649004270300102701000400644080273000F2 +S315001F64A000003C460265B7606278FFFFCD816342FC +S315001F64B05AD03C4625026444883A22007737380072 +S315001F64C0783736008E3734002D600E62A2D3FFFF59 +S315001F64D06040012A2D0007002D600E62A2D3FFFF28 +S315001F64E06040012AE3013C463EF240600065F084AD +S315001F64F0A48418FA2AF2BF60FF65A4842AFA18003A +S315001F65003C4622F08067B084A2DAFFFF3FF23EF0DE +S315001F651008A4604122F2FFFF604001260300042603 +S315001F652003000600042B04006144644010263FFA52 +S315001F65303C462CF22740012732F2D5F16040012656 +S315001F6540530009600064D0803FF209062C45C484BD +S315001F6550D080404A40066043644454881800604512 +S315001F65602760F264A0D3DBF300BC6047ECA03303C3 +S315001F657032072C44C48102601C65454AD5802C45D0 +S315001F65802A062740042730002A43D7854548D6F1D7 +S315001F65900FF2D380016501070065B4840FFA00630B +S315001F65A03FF228456041D484DF83FC0714FC614415 +S315001F65B001360200093A0600284448882A44C8833F +S315001F65C0434AE50117FA046000642745B4842AFA92 +S315001F65D0284316FC0D003FF22C45D6F1C481D1800D +S315001F65E00FF2010601BC0FFA3FF217FA016414FA03 +S315001F65F007F0664364460EF06346007F645E4BFBFE +S315001F66006444007EDBFB7CF160436047D080C0653D +S315001F6610010664440A3670641436386437361564C6 +S315001F66206E360B6444862AF207F06040B03A0300C8 +S315001F6630403B010012000CB4083A550022F2FFFF3E +S315001F66406040802B500017F222F0FFFF6440222289 +S315001F6650040000A801A8470346033C462AF04067EA +S315001F6660B084A2DA604522F2FFFF60436040012634 +S315001F6670030004260A0002000427070065442A6552 +S315001F66806040032B2465454C2E0065442E656040F3 +S315001F6690032B2865454C07F0A9F3FFFFD080007C2C +S315001F66A003036340012A01003DF12AF2FFFF08B0F0 +S315001F66B03EF219036047E884E884E88403B4D08077 +S315001F66C0FFFF110324602A6224600264A2DB3C449C +S315001F66D05ADB02645ADBFFFF2BFF5C5CFCFCCEFE21 +S315001F66E0B060DE78FFFFDBF12C45644317F24BF1F8 +S315001F66F0C484E084E084E08163403737E1816445E8 +S315001F6700B060584DB378FFFFAE82FCA20A03634008 +S315001F67106E3B06006041040D6344807EDBFB6144D3 +S315001F6720DC842BF01BFA64448027340016F20FF02A +S315001F6730AC842C4529034BF1C484E084E084E081BA +S315001F674063403737E18164450FF0B060584DB37829 +S315001F6750FFFFAE82FCA20A0363406E3B0600604148 +S315001F6760040D8067B0840FFA6144DC841DFADE6570 +S315001F6770C4852641E181C5842BFA1BF0DE64C085E2 +S315001F67802644E084C48410FA26442CF00AA46440EC +S315001F67900126006411FADBF313FAFFFF0DF23EF038 +S315001F67A06047FFB4644101B101631D026041FF22CE +S315001F67B00400B060584FA478FFFF0F609264A0DDFD +S315001F67C02D601662A2D3B060584DD578FFFF604189 +S315001F67D001636140FF220400B060584FA478FFFF99 +S315001F67E00F609464A0DD2AF2FFFF6040402703007C +S315001F67F0B5601578FFFF22F24643604022268B00C4 +S315001F68000126050004260C00B5601578FFFF042736 +S315001F68100300B5601578FFFFA9F3FFFF604602006E +S315001F682007F4FFFFA3462AF2A346604008273B0052 +S315001F6830A9F3665CD08037F008036440102A120063 +S315001F6840FF60EF64A08437FA24003DF301616043C3 +S315001F6850CF83E181FD0DE981A180FFFF03039184B1 +S315001F686037FA170047F2FFFF10A0FFFF0204FF6071 +S315001F6870FF64DC8447FA46F21604DC8446FA45F2C6 +S315001F68800804DC8445FA050437F2FFFFE084E88438 +S315001F689037FA0D603E6280FF784403A4A2DBBE6018 +S315001F68A06E78FFFF84FF0D603E6280FF784403A46D +S315001F68B0A2DBBE60E678FFFF84FFA9F3665CD0808B +S315001F68C0007C070366433C4622F263466040012A6A +S315001F68D001003CF147F064416447FFB4605F20BC90 +S315001F68E0802680AC6047A3463AFA6444207F3494DE +S315001F68F03BFAA34646F245F0A3463CFA3DF808602C +S315001F690000EA0F64607FA05A806000EAA06000EA78 +S315001F6910D16000EA8A002AF2FFFF6040082735008F +S315001F69202AF200607C626040402B2700A2D30061E0 +S315001F693060FEA0D3DE82A2D1FFFF20FE645FDC844F +S315001F6940F181C02B0400802A02007FA4DC84FF3B58 +S315001F695003006047DC870161C0800036DC844EDBA4 +S315001F696060FEDA82A2D1FFFFC184F02210A4F02AB2 +S315001F697001000064A2DBFFFF20FE00607C62A2D341 +S315001F6980FFFFA0D35AD13AFA3BF87462A2D0FFFF99 +S315001F69906444E07FA05A6447E17F5AD0A05A6444FA +S315001F69A0E27FA05A00608062A2D3FFFFA0D15AD116 +S315001F69B064456444E37FA05A6447E47F5AD1A05AD2 +S315001F69C06444E57FA05A6447E67F5AD1A05A6444BF +S315001F69D0E77FA05A65400D3A1C006447E87F5AD1ED +S315001F69E0A05A6444E97FA05A6447EA7F5AD1A05A45 +S315001F69F06444EB7FA05A6447EC7F5AD1A05A644483 +S315001F6A00ED7FA05A6447EE7F5AD1A05A6444EF7FA8 +S315001F6A10A05A086000EA654402A4607FA05A8060FD +S315001F6A2000EAA06000EAD16000EA02643BDBB860BE +S315001F6A30BA78FFFF6644FCFB07F00064D080A9F319 +S315001F6A401703D080664164466FF261467B03604040 +S315001F6A500036780047F107F06440022601000B005C +S315001F6A600312B6603478FFFFFC0AB7605278FFFF47 +S315001F6A70B7605278FFFF664164460EF26045614675 +S315001F6A80107E4EFB6544604001365C0002365D0099 +S315001F6A900336340004364500670000644CFB66412C +S315001F6AA064466FF2FFFF057E6FFA61460065654318 +S315001F6AB06641644670F28CFA00A86FF215036047B0 +S315001F6AC0FFB570F200BBFFA007030E06E884A48083 +S315001F6AD0FFFF0202FB040800B981E884D981FD0487 +S315001F6AE00F60A26545D30EFA0CF4FFFF664164469C +S315001F6AF00EF26146FFFFA07E4EFB24004CF3FFFF04 +S315001F6B00DC844CFBCBF36045D480FFFF1B02246063 +S315001F6B1062620F609664A2DB03644ADBFFFF04FF19 +S315001F6B20BC014CF36641DC844CFB64466FF2FFFFED +S315001F6B30037E6FFA6146664164460EF26146FFFFA9 +S315001F6B40A47E4EFBB7605278FFFF664164466FF224 +S315001F6B50FFFF017E6FFA6146664164460EF261468B +S315001F6B60FFFFA87E4EFBEE01664164466FF28CFA6C +S315001F6B70604770F2FFB50818E484A480FFFF030284 +S315001F6B80FB040164010000640CF400A8FFFFDD0292 +S315001F6B90664164466FF2FFFF604770F2FFB56146BC +S315001F6BA000A8FFFF2903E084A480FFFFFC036641C2 +S315001F6BB0644670FA6146016565436641644670F234 +S315001F6BC08CFA00A86FF215036047FFB570F200BB81 +S315001F6BD0FFA007030E06E884A480FFFF0202FB0442 +S315001F6BE00800B981E884D981FD040F60A26545D3E9 +S315001F6BF00EFA0CF4FFFF95019401654460400136BF +S315001F6C00A101023601009E01664164466FF2FFFF35 +S315001F6C10017E6FFA6146006565436641644670F200 +S315001F6C208CFA00A86FF215036047FFB570F200BB20 +S315001F6C30FFA007030E06E884A480FFFF0202FB04E1 +S315001F6C400800B981E884D981FD040F60A26545D388 +S315001F6C500EFA0CF4FFFF664164460EF26146D07EC3 +S315001F6C604EFBB7605278FFFF6045664164460EF2E1 +S315001F6C706146207E4EFB6544604001360B0002369E +S315001F6C801A00033653000436700005361400B76029 +S315001F6C905278FFFF07F0664164466FF2FFFF027EE0 +S315001F6CA06FFA6146664164460EF26146B07E4EFB40 +S315001F6CB0B7605278FFFF07F001656543664164467A +S315001F6CC070F28CFA00A86FF215036047FFB570F2D9 +S315001F6CD000BBFFA007030E06E884A480FFFF020285 +S315001F6CE0FB040800B981E884D981FD040F60A26501 +S315001F6CF045D30EFA0CF4FFFF664164466FF200633C +S315001F6D00037E6FFA61464CFD664164460EF261468C +S315001F6D10B47E4EFB246062620F609664A2DB02643F +S315001F6D204ADBFFFF04FFB7605278FFFF66416446E8 +S315001F6D3070F24CF302B06146CC84050304284CFB69 +S315001F6D40B7605278FFFF04284CFB664164466FF21A +S315001F6D50FFFF047E6FFA6146664164460EF2614686 +S315001F6D60B87E4EFBB7605278FFFF664164466FF2EE +S315001F6D70FFFF6047FFB570F26146FFA0FFFF3506B4 +S315001F6D80E884A480FFFF0202FB042F00644670FA0A +S315001F6D90016565436641644670F28CFA00A86FF27E +S315001F6DA015036047FFB570F200BBFFA007030E0671 +S315001F6DB0E884A480FFFF0202FB040800B981E8846F +S315001F6DC0D981FD040F60A26545D30EFA0CF4FFFFAF +S315001F6DD06FF20063037E6FFA3C464CFD66416446C4 +S315001F6DE00EF26146C07E4EFB5D005C00654460404E +S315001F6DF0013603000236180055006641644670F2DC +S315001F6E00614601B0FFFF4E0207F0664164466FF20E +S315001F6E10FFFF027E6FFA6146664164460EF26146C7 +S315001F6E20E07E4EFB3F003E0007F0664164466FF270 +S315001F6E30FFFF017E6FFA6047FFB570F26146FFA044 +S315001F6E40FFFFF106E884A480FFFF0202FB04EB01AB +S315001F6E506641644670FA614600656543664164464D +S315001F6E6070F28CFA00A86FF215036047FFB570F237 +S315001F6E7000BBFFA007030E06E884A480FFFF0202E3 +S315001F6E80FB040800B981E884D981FD040F60A2655F +S315001F6E9045D30EFA0CF4FFFF664164460EF26146B7 +S315001F6EA0E47E4EFB03643BDBCAFE47F101653240BD +S315001F6EB0042708002CF264450222040060400126C4 +S315001F6EC00100E30014F2654001261D0060450564BC +S315001F6ED03BDB6544CC85B8F127603464A0D3FFFF44 +S315001F6EE0D880C4840B030705DC80D0800403A2DB93 +S315001F6EF00904C6FE07000064B884A2DB8AFF20606F +S315001F6F00007588FFAF0060412AF000600C64A08402 +S315001F6F10043602000C3A0100A50061456041B8F134 +S315001F6F2027603464A0D3FFFFD880C4840B030705F2 +S315001F6F30DC80D0800403A2DB0904C6FE07000064C0 +S315001F6F40B884A2DB8AFF2060007588FF614008367F +S315001F6F500100880014F21C6560410063CD81C78360 +S315001F6F60FD023FF02CF2C3836040012A2900B8F1CD +S315001F6F7027603264A0D3FFFFDC84DC80D08004034B +S315001F6F80A2DB0824C6FE04008AFF2060007588FF66 +S315001F6F90B8F127603864A0D36345D880C4840B0337 +S315001F6FA00705DC80D0800403A2DB0904C6FE0700A8 +S315001F6FB00064B884A2DB8AFF2060007588FF520038 +S315001F6FC0B8F127603064A0D3FFFFDC84DC80D0805B +S315001F6FD00403A2DB0824C6FE04008AFF2060007596 +S315001F6FE088FFB8F127603664A0D36345D880C48470 +S315001F6FF00B030705DC80D0800403A2DB0904C6FE51 +S315001F700007000064B884A2DB8AFF2060007588FF32 +S315001F701015F2FFFF0FB400A801A824031203B8F14D +S315001F702027603E64A0D3FFFFDC84DC80D08004038E +S315001F7030A2DB0824C6FE04008AFF2060007588FFB5 +S315001F70401100B8F127603C64A0D3FFFFDC84DC800D +S315001F7050D0800403A2DB0824C6FE04008AFF20603A +S315001F7060007588FF04643BDB24602A622460026487 +S315001F7070A2DB3C445ADB02645ADBFFFF2BFF5C5C3E +S315001F7080FCFCCEFEB060DE78FFFF0FF015F2644108 +S315001F7090012A0200D1F10200D0F1FFFF6445DC8412 +S315001F70A0D48015FA30076140012A090027606464FD +S315001F70B0A0D3FFFFDC84FFFF0828A2DB08002760A0 +S315001F70C06664A0D3FFFFDC84FFFF0828A2DB2AF03B +S315001F70D00867B084A2DA006448FB2D600E62A2D353 +S315001F70E0FFFF6040012A0C003C463EF240600065EF +S315001F70F0F084A48418FA2AF2BF60FF65A4842AFAD2 +S315001F7100B260F878FFFF006449FBB8F127603E6460 +S315001F7110A0D3FFFFDC84DC80D0800403A2DB08241D +S315001F7120C6FE04008AFF2060007588FFB8F127603D +S315001F71304064A0D3FFFFDC84DC80D0800403A2DB85 +S315001F71400824C6FE04008AFF2060007588FF2D6094 +S315001F71501663A3D3B060584DD578FFFF0DF2605C60 +S315001F7160645F0DFA23F00164B084A2DA7B01B96073 +S315001F71703F78FFFF21643BDB31F30163C4B431FB6E +S315001F718032FDB860EB624240A04C40BC7DB4A051BA +S315001F7190A0FE1AFF2360F66408F007F0D080236074 +S315001F71A0FC621402A2D30163AC8607F20F03D080E0 +S315001F71B009F2FA0223FC24602A6224600264A2DB1D +S315001F71C066445ADB02645ADBFFFF2BFF3C4606640C +S315001F71D0A1FF49FB833E31F3876080611DF060404C +S315001F71E0012A1500FEB431FB006449FB016447FB0D +S315001F71F02D601663A3D3B060584DD578FFFF00717D +S315001F7200645F0DFA40643BDBB9603F78FFFF022ADB +S315001F72101B00D1918DE241643BDB31F32D601E6370 +S315001F7220FDB431FBA3D3B060584DD578FFFF026381 +S315001F7230605C0DF247FDFFB56047D080DC841F03FD +S315001F72406047B4840DFA1B00082A070042643BDB23 +S315001F725031F3FFFFF7B431FB1200102A0900436414 +S315001F72603BDB31F3FFFFEFB431FBB860BA78FFFFAA +S315001F727044643BDB31F3FFFFDFB431FB00002A64BC +S315001F72803BDBB06094644040B5601A78FFFF1C601A +S315001F7290B863A3D3FFFF02B504B504030303BA60A3 +S315001F72A03878FFFF86FF204484FF202A0400F260FF +S315001F72B0584EE878FFFF314001261700A04C49BC05 +S315001F72C0FFB4A0511C60B863A3D3FFFF02B504BC73 +S315001F72D0090360400126EDE2FEB4A3DBA04C7DB49A +S315001F72E0A0510300A04C6DB4A051DCF3FFFFFDA01D +S315001F72F0FFFF48033140042A3E006DF374F3CC832D +S315001F73006DFDCC8474FB1F023140022A12006FF3FD +S315001F731070F1CC846FFB0D026FF9314408BC4051EC +S315001F732072F371F100B86445010367456550CC845B +S315001F733073FB2760BC64A0D36EF100B874F9030316 +S315001F734087F36DFB04006DF387F1151B6DF9314053 +S315001F7350012A1100DDFE0F05BAFEAD4F007F01BCED +S315001F7360A05D00EE7FF10260EE64A3FBA4F9046446 +S315001F7370A5FBDFFE19FF1A604262A2D3FFFFCC8472 +S315001F7380FF2BA2DB3140012A29009DFE2704260A76 +S315001F73909FFE240585FF204484FF40261F003F4093 +S315001F73A0202B1C003869FFFF68440116FD01012AC6 +S315001F73B0150027607064A0D3FFFFDC84FFFF082839 +S315001F73C0A2DB7FF10260EE64A3FBFFFF8060006417 +S315001F73D0B084A4FB0464A5FBDFFE19FF10643BDB2E +S315001F73E080F37345E084E084E084E084C493C9FE9F +S315001F73F049F33C462718CC8449FB2402BB6014641E +S315001F74004042FCFC00645C5C32FB82FF5C4784FFED +S315001F741062FF27606064A0D3FFFFDC84FFFF08289C +S315001F7420A2DB23F00164B084A2DA24602A622460FE +S315001F74300264A2DB66445ADB02645ADBFFFF2BFFA2 +S315001F7440C1FECEFE6AF3FFFF6041FDB4A2DB6144BD +S315001F745001B002B00C030B029DFE09042460626298 +S315001F74601A60A264A2DB02644ADBFFFF04FF070067 +S315001F747080F37345E084E084E084E084C4931C6059 +S315001F7480B463A3D3AD4920B508B12303E18110B579 +S315001F74909581604118021C60B67CA4D3FFFFCC8483 +S315001F74A0A4DB17020564A4DB614407B4FFFF1102C6 +S315001F74B008B1E1819581A3D30C0308AC01BCA3DB02 +S315001F74C0FFFF13FF060010ACA3DB1C60B663057C31 +S315001F74D0A3D9B060A178FFFF46F345F1051B6444AD +S315001F74E0031B0F609262A2D345FB006346FD6041FA +S315001F74F025643BDB2744EFB4404700B97140802722 +S315001F750001122B03BA608F6284FF424282FFA04C96 +S315001F751014BCFFB4A051310AA1FFFFFF813E704486 +S315001F7520AC802B0A71408027F71245F34C021518C1 +S315001F75303060CA7CA4D3FFFF0B183060CC7CA4D369 +S315001F7540FFFF0618AC4C80260300006445FB0500B0 +S315001F755045F3FFFFCC8445FBDF02060AA04CFBB4B4 +S315001F7560A051A3609978FFFF84FFBA606C64404204 +S315001F757082FFA04C14BCFFB4A051AB602978FFFF5B +S315001F75803C44AC8032F12503644007222200A360ED +S315001F75907B78FFFFA04C1CBCDFB4A0513140082AEA +S315001F75A0EF0173F371F100A0DC8005030803CC849F +S315001F75B073FB67500800CC8473FB6450040031448E +S315001F75C0F7B44051060028643ADBA04C30BCF3B434 +S315001F75D0A051A1FFFFFF813E28643BDB0F60946231 +S315001F75E0A2D332400227160046FB1418BB60026462 +S315001F75F084FF404282FFA04C14BCF7B4A051A1FFE8 +S315001F7600FFFF813E7044AC8046F3B70ADC02CC8490 +S315001F761046FBF50284FFBB601464404282FF274489 +S315001F762008BC4047BBE104003AE131400126BBE1FB +S315001F7630A3606F78FFFF43FF39E1A1FFFFFF843E81 +S315001F7640FB01A04C3D462AF2464D10250E0009E1CE +S315001F7650A1FF66400FF20129020040FF0ABCA2DA11 +S315001F76600825E901CBFE5C5DE70144FF31F21C6092 +S315001F7670BA656047007FE08444D366416046604335 +S315001F768005F21618614631F06346D08004F20C02EB +S315001F7690614630F06346D08003F2060261462FF042 +S315001F76A06346D080FFFF070380F4FFFF6346E81B96 +S315001F76B0A9F308FE6043614607FC06002AF0006036 +S315001F76C00064A09C2AF8C30182FF234485FF206023 +S315001F76D00065D4802AF2BB050825AD0100640D6044 +S315001F76E02C61404BA1DB2D463BF2FFFF6040202B58 +S315001F76F0160087F4A9F1FFFFD3803BF2DF032CF0BE +S315001F770007F464400126A9F5B6F42D46046404B3B4 +S315001F771022FA0403BC607A78FFFF0100CF0174626E +S315001F7720A2D0FFFF6444E07FA05B6447E17F5AD08D +S315001F7730A05B6444E27FA05B64477C5FE884E885C6 +S315001F77400C603A6444D35AD1031BBC606D78FFFFAB +S315001F775060456444E37FA05B6447E47F5AD1A05B26 +S315001F77606444E57FA05B6447E67F5AD1A05B64440F +S315001F7770E77FA05B65400D3A1C006447E87F5AD13E +S315001F7780A05B6444E97FA05B6447EA7F5AD1A05B94 +S315001F77906444EB7FA05B6447EC7F5AD1A05B6444D3 +S315001F77A0ED7FA05B6447EE7F5AD1A05B6444EF7FF9 +S315001F77B0A05B6544D88408257600607FA05B806047 +S315001F77C000EBA06000EBD16000EB3FF20465C483C1 +S315001F77D00AE1B3FF9AFFCB8300F410626C610EA31C +S315001F77E0AB84F2A3A1FF080000F481F20262C981F3 +S315001F77F0AB84A1FF0100A2DC7AD4FD1CA2DC082504 +S315001F78005200F21D7CA8D981EF03FFB1091E0202A7 +S315001F781000F402625AD289FF804F6F44A2DA88FFB2 +S315001F782098FF09E1A1FF3D4608253D0040FF0FF0E7 +S315001F78300A64B0841614F7B4A2DA0D602C62A2D3C0 +S315001F7840FFFF6040012A0C0007F4F0F40D602C6165 +S315001F785059D137F8056459D1CC84BDD8FC022D46C1 +S315001F78600101A2DA2D463BF0FFFF6440202B1800D2 +S315001F787007F4B7F02A44A484FFFF2F2610002D46D5 +S315001F788064443AF0BCF0645F3DF007F4F0F4FFFF88 +S315001F789008A35BD8655C5BD85BDA2D4601002D46D5 +S315001F78A0BB603278FFFF98FF43FF40FFB0FFB1FF79 +S315001F78B02D460D602C61A1D32D466040012A0A007A +S315001F78C007F4F0F459D137F8056459D1CC84BDD8E3 +S315001F78D0FC022D46BB601C78FFFF98FF09E1A1FF44 +S315001F78E03D460825E0010FF240FF02BCA2DABB604D +S315001F78F03278FFFF00640D602C62A2DB046422FA5B +S315001F790087F4A9F1FFFFD3803BF2E7036047C0B7B7 +S315001F791002FEF084F084F08400A8404A1603E0813A +S315001F7920614342FE0064F084FE1F404AE184E08406 +S315001F79302D4607F4E08137F02A470C607A63A0844E +S315001F7940479C10037C44A06311002064404A634691 +S315001F795037F066446440802B05000060707C006031 +S315001F7960906304002D46BB605E78FFFF2D46EEFB3D +S315001F7970EFF9F0FD07F2F1FB604637F02A440D6080 +S315001F79802C625AD90065454BA084FFFF3F22050094 +S315001F7990908437FA0164404B2100AD460AA33DF29D +S315001F79A0AD46A3D0AD46D0803CF2AD4602031607C6 +S315001F79B014045BD0AD46D0803BF20303AD460E07E1 +S315001F79C00C043AF0AD465BD0645FD0802B44180799 +S315001F79D00403D08410A4FFFF13077F0101640D6009 +S315001F79E02C62A2DB2D460D603C6280FF784403A407 +S315001F79F0A2DBBD601378FFFF85FF2D4608255301C7 +S315001F7A002D460D603C6280FF784403A4A2DBBD6057 +S315001F7A109C78FFFF85FF2D460825450100600F64F2 +S315001F7A20BB60DB78FFFF07F4664103F204F24042B6 +S315001F7A3005F24043404461463CF23DF2404040411E +S315001F7A400D6070650061EFF1EEF5444C2C5CE9802A +S315001F7A500064F084F084C083BDD2245C909C64478C +S315001F7A60007FE08444D16444007FE08444D16447AE +S315001F7A70909C20444080DB83BDD2205C909C644751 +S315001F7A80007FE08444D16444007FE08444D164478E +S315001F7A90909C21444081DB83BDD2215C909C64472E +S315001F7AA0007FE08444D16444007FE08444D164476E +S315001F7AB0909C22444082DB83BDD2225C909C64470B +S315001F7AC0007FE08444D16444007FE08444D164474E +S315001F7AD0909C23444083F2A3BDD2235C909C6447B1 +S315001F7AE0007FE08444D16444007FE08444D164472E +S315001F7AF0909C2444C09C4184DD81082AA7010D6007 +S315001F7B002E610564F0F4F1F5FEA35BD0CC8459D940 +S315001F7B10FC02F0F3F1F560422044A2DA21445ADA5E +S315001F7B2022445ADA23445ADA24445ADA61460D604B +S315001F7B303C62A2D7FFFFFFFF6641F0F3F1F5A0D22B +S315001F7B405AD0404044415AD25AD040425AD0444358 +S315001F7B506146BAF03BF24444655F4085EFF4EEF5AB +S315001F7B60434C0D607065BDD2255C909C6447007FB9 +S315001F7B70E08444D16444007FE08444D16447909CF0 +S315001F7B8020444080BDD2205C909C6447007FE084E7 +S315001F7B9044D16444007FE08444D16447909C2144CF +S315001F7BA04081BDD2215C909C6447007FE08444D114 +S315001F7BB06444007FE08444D16447909C2244408201 +S315001F7BC0BDD2225C909C6447007FE08444D164440C +S315001F7BD0007FE08444D16447909C23444083BDD2F8 +S315001F7BE0235C909C6447007FE08444D16444007FFB +S315001F7BF0E08444D16447909C24444084BDD2245CD5 +S315001F7C00909C6447007FE08444D16444007FE084F5 +S315001F7C1044D16447909C2544408561463AF0FFFF56 +S315001F7C206444E07FA05B6447E17F5AD0A05B644455 +S315001F7C30E27FA05B6447EEF5BDD2255C9084E880A9 +S315001F7C40F884205C40802044E47FA05B2047E57FCA +S315001F7C50A05BBDD2205C9084E880F884215C4081C3 +S315001F7C602144E67FA05B2147E77FA05B2144E88094 +S315001F7C70F884225C40822244E87FA05B2247E97F8A +S315001F7C80A05B2244E880F884235C40832344EA7F78 +S315001F7C90A05B2347EB7FA05B2344E880F884245C2A +S315001F7CA040842444EC7FA05B2447ED7FA05B2444E3 +S315001F7CB0E880F884255C40852544EE7FA05B254738 +S315001F7CC0EF7FA05B2C43A3D2255C9081E984E37FE1 +S315001F7CD0A05B0D603C62A2D7FFFFFFFFEBF35AD3F9 +S315001F7CE040485AD34049404A0060707C444D45F293 +S315001F7CF046F2404740460D60706500612D5CE98085 +S315001F7D000064F084F084C083BDD22A5C909C6447D3 +S315001F7D10007FE08444D16444007FE08444D16447FB +S315001F7D20909C26444086DB83BDD2265C909C64478C +S315001F7D30007FE08444D16444007FE08444D16447DB +S315001F7D40909C27444087DB83BDD2275C909C644769 +S315001F7D50007FE08444D16444007FE08444D16447BB +S315001F7D60909C28444088DB83BDD2285C909C644746 +S315001F7D70007FE08444D16444007FE08444D164479B +S315001F7D80909C29444089F2A3BDD2295C909C6447EC +S315001F7D90007FE08444D16444007FE08444D164477B +S315001F7DA0909C2A44C09C418ADD81082AA70126444B +S315001F7DB040FA274441FA284442FA294443FA2A44FE +S315001F7DC044FA0D603E62A2D7FFFFFFFF0060807C72 +S315001F7DD0444D2D42A2D25AD0404644475AD25AD079 +S315001F7DE040485AD0444947F2444A408B605C644736 +S315001F7DF0E07FA05AFFB420BC7FB4E17FA05A644441 +S315001F7E00E27FA05A006070630D607065BDD22B5C67 +S315001F7E10909C6447007FE08444D16444007FE084E3 +S315001F7E2044D16447909C26444086BDD2265C909CD4 +S315001F7E306447007FE08444D16444007FE08444D1DA +S315001F7E406447909C27444087BDD2275C909C64471B +S315001F7E50007FE08444D16444007FE08444D16447BA +S315001F7E60909C28444088BDD2285C909C6447007F24 +S315001F7E70E08444D16444007FE08444D16447909CED +S315001F7E8029444089BDD2295C909C6447007FE084C9 +S315001F7E9044D16444007FE08444D16447909C2A44C3 +S315001F7EA0408ABDD22A5C909C6447007FE08444D1FF +S315001F7EB06444007FE08444D16447909C2B44408BEC +S315001F7EC0BDD22B5C9084E880F884265C40862644CD +S315001F7ED0E47FA05A2647E57FA05ABDD2265C908430 +S315001F7EE0E880F884275C40872744E67FA05A274707 +S315001F7EF0E77FA05A2744E880F884285C40882844F6 +S315001F7F00E87FA05A2847E97FA05A2844E880F884CA +S315001F7F10295C40892944EA7FA05A2947EB7FA05A4A +S315001F7F202944E880F8842A5C408A2A44EC7FA05AB8 +S315001F7F302A47ED7FA05A2A44E880F8842B5C408BA1 +S315001F7F402B44EE7FA05A2B47EF7FA05A38F02B44C5 +S315001F7F509084E884E37FA05A0D603E62A2D7FFFF9C +S315001F7F60FFFFE460CF78FFFF0F60D062A2D1806071 +S315001F7F700064B084A2DBCFFE3200DCF3314101B1D5 +S315001F7F8003A82D0317022040042B0C00BBFECAFEBC +S315001F7F90246066621A606664A2DB02644ADBFFFF26 +S315001F7FA004FF08000F60D262A2D100600464B0848F +S315001F7FB0A2DBCFFE0F60F662A2D100608064B084A0 +S315001F7FC0A2DBCFFE0C00A9FED805ABFE0C05A8FE52 +S315001F7FD0C805AAFEC905784301612460B778A1FFC9 +S315001F7FE0FFFFFFFF853E24601A62A2D3FFFF00A892 +S315001F7FF060460302BF60EF78FFFF2645D4800FF06F +S315001F8000F903644470B0702A140027606E64A0D30D +S315001F8010FFFFDC84FFFF0828A2DBA2FFAFF3FFFFF1 +S315001F8020CC84FEA0AFFB0107D4FEA3FFC5605E781C +S315001F8030FFFF644002260900664509F40FF2021885 +S315001F80406546E31B00644046CA01A2FFAFF34646DE +S315001F8050CC84FEA0AFFB0107D4FEA3FF0FF0A3FC49 +S315001F8060644480262200B8F127604E64A0D3FFFF28 +S315001F8070DC84DC80D0800403A2DB0824C6FE040057 +S315001F80808AFF2060007588FF3244012A03000760BB +S315001F809001640400022A06000060016423FAC56019 +S315001F80A06A78FFFFC5605E78FFFF08263F002AF249 +S315001F80B060636040022B6663BED283F1A3D2D08079 +S315001F80C082F11802BFD2D08081F11402D080FFFF47 +S315001F80D01102B8F127605A64A0D3FFFFDC84DC804D +S315001F80E0D0800403A2DB0824C6FE04008AFF20609A +S315001F80F0007588FF3244012A0300076002640400EA +S315001F8100022A06000060026423FAC5606A78FFFF30 +S315001F81102AF2FFFF6040B03A06000060026423FAAD +S315001F8120C1601978FFFFC5605E78FFFF3244012AE0 +S315001F81304A0028609E63BFD30065B481DB833D037D +S315001F8140BFD3A3D34048BED3404A2EF0404CD08065 +S315001F81502DF008022A44D0802CF004022844D08037 +S315001F8160FFFF2B0331F02C44D08030F008022A4445 +S315001F8170D0802FF004022844D080FFFF1E0334F066 +S315001F81802C44D08033F008022A44D08032F00402F7 +S315001F81902844D080FFFF110338F02C44D08037F0DD +S315001F81A008022A44D08036F004022844D080FFFFFC +S315001F81B00403FAA106A3B703C3010760006423FAE9 +S315001F81C0C5606A78FFFF2AF20FF06045A4360800E3 +S315001F81D00CB4043602000C3A0600C5605E78FFFF39 +S315001F81E0C260E578FFFF0FF06540402B220032404A +S315001F81F008261F0007F436F2FFFF37B4264619027A +S315001F82002CF2FFFF604001261100B8F1276054646D +S315001F8210A0D3FFFFDC84DC80D0800403A2DB08240C +S315001F8220C6FE04008AFF2060007588FFC5605E7861 +S315001F8230FFFF2AF2644060260300C260B778FFFF83 +S315001F82406041A9F307FA6144803A0600E560584F7A +S315001F8250EE78FFFF2AF210006040403A0D00DCF373 +S315001F8260FFFF07B4033AE201C660584D5278FFFF7D +S315001F8270DD02A9F307FAD1005E636040022B646337 +S315001F828050FEBDD281F1BDD2D08082F1BDD2D08049 +S315001F829083F12AF2D0806040083A0700010CC6011C +S315001F82A0DF60584F2C78FFFFB800260CC660584D6C +S315001F82B05278FFFFBB021F600E610264A1DB1F60C5 +S315001F82C016610064A1DB2260584E1C78FFFF1F60F9 +S315001F82D00464A0D3FFFF6040802708000F60EA6296 +S315001F82E0A2D100600464B084A2DBCFFE1F600E62C1 +S315001F82F00064A2DB9B019100C660584D5278FFFFB8 +S315001F8300FA020F60CE61A1D3FFFF6040013607005E +S315001F83100164A1DB0165E960584E4B78FFFF2646D5 +S315001F832031F21C60BA656047007FE08444D3664122 +S315001F83306046604305F21618614631F06346D080E9 +S315001F834004F20C02614630F06346D08003F2060247 +S315001F835061462FF06346D080FFFF070380F4FFFFBF +S315001F83606346E81BA9F308FE60436146A9F1434330 +S315001F8370D380FFFF0402C560584FA878FFFF324025 +S315001F8380082A050063468060026406FA2646D8F36B +S315001F83906345664165468CFA604001360600023623 +S315001F83A0040004360200053A02000064010001645D +S315001F83B06FFA79F37AF1FFFFA0846543020279F31E +S315001F83C0FFFF60410F60AE65D8F3FFFFE08444D323 +S315001F83D06145A480FFFF0402E884A480FFFFFC031D +S315001F83E0A4847BFB6FF0604790846FFA60476045FB +S315001F83F08064E884A480FFFFFC03A48470F070FAF5 +S315001F84000061E884FFFF0205DD81FB01E1810F604A +S315001F8410A26545D30EFA66430CF4B8F1276048648B +S315001F8420A0D3FFFFDC84DC80D0800403A2DB0824FA +S315001F8430C6FE04008AFF2060007588FF27F2FFFF33 +S315001F84406040013B1200B8F127605664A0D3FFFFBE +S315001F8450DC84DC80D0800403A2DB0824C6FE040073 +S315001F84608AFF2060007588FF1300023B1100B8F1D8 +S315001F847027605864A0D3FFFFDC84DC80D080040310 +S315001F8480A2DB0824C6FE04008AFF2060007588FF51 +S315001F84901BF2FFFFE4A43EFA2AF2284140A801B1CD +S315001F84A00202620292006040082A2B00B8F1276080 +S315001F84B04664A0D3FFFFDC84DC80D0800403A2DBEC +S315001F84C00824C6FE04008AFF2060007588FF1BF281 +S315001F84D0FFFF6045B8F127604C64A0D3FFFFD8802B +S315001F84E0C4840B030705DC80D0800403A2DB0904C8 +S315001F84F0C6FE07000064B884A2DB8AFF20600075F1 +S315001F850088FF0FF2FFFF60404026280032440226F4 +S315001F85102500102B290028609E63BFD32CF000A8CE +S315001F852060410D0350FEBDD32DF0D080BDD32EF07C +S315001F8530D080BDD32CF0D080FAA1100CF30250FED0 +S315001F854060600164D0802DF01D64D0802EF0016420 +S315001F8550D080FFFF030CC5605E78FFFF3240402AC4 +S315001F8560030019600078FFFFC5605878FFFF32408F +S315001F85704026F7012AF0FFFF6440082A2A00DCF391 +S315001F8580FFFF07B403A8FFFF03033240022A1D00A3 +S315001F85900367A08400376463604002375E636040F0 +S315001F85A001375863604003370D00BDD281F1BDD23C +S315001F85B0D08082F10702D080BDD283F10302D08022 +S315001F85C0FFFF0303C5605E78FFFFDF60584F2C78FF +S315001F85D0FFFF2040102B0300C5605878FFFF87F46C +S315001F85E0A9F1271B31F21C60BA656047007FE08442 +S315001F85F044D366416046604305F21618614631F062 +S315001F86006346D08004F20C02614630F06346D08088 +S315001F861003F2060261462FF06346D080FFFF070371 +S315001F862080F4FFFF6346E81BA9F308FE604361461B +S315001F86300300D380FFFFD6034343DCF332400226F9 +S315001F8640040007B403A82AF25F02A9F12343D380CB +S315001F8650FFFF5A02C560584FA878FFFF3240022A13 +S315001F866005006346026406FA26464E003240082A73 +S315001F8670050063468060026406FA2646D8F3634502 +S315001F8680664165468CFA60400136060002360400D4 +S315001F869004360200053A02000064010001646FFA05 +S315001F86A079F37AF1FFFFA0846543020279F3FFFF96 +S315001F86B060410F60AE65D8F3FFFFE08444D3614588 +S315001F86C0A480FFFF0402E884A480FFFFFC03A484A8 +S315001F86D07BFB6FF0604790846FFA6047604580644C +S315001F86E0E884A480FFFFFC03A48470F070FA006185 +S315001F86F0E884FFFF0205DD81FB01E1810F60A265B2 +S315001F870045D30EFA66430CF407FC434302FE1DF0E5 +S315001F87101C609A62C064C084A2D1E884E884E8849D +S315001F8720E884E884C084A2DB2AF263450CB4083AC5 +S315001F87300A00DCF3234607B4FDA006F22646030310 +S315001F87406040022A0D002AF235F06040A4360B0065 +S315001F8750082B0C00234622F22646D080FFFF060276 +S315001F8760C5605E78FFFFC5605878FFFF23461EF27F +S315001F87702646444C0F261D0000BC40450B030064D3 +S315001F878023461EFA2646A2FFAF60584E9278FFFF79 +S315001F8790A3FF26462AF02C44644004270A002346DA +S315001F87A022FA26461BF2FFFFE4A43EFAC460B07805 +S315001F87B0FFFF3FF202FAA2FF16F0FFFF64440126F5 +S315001F87C0DC9CB3F32AF2DC83B3FD06F401F82646DC +S315001F87D06040402B180064440065FFB4FCA406F0FB +S315001F87E0030364460C0D0265264600F2FFFFD08088 +S315001F87F0FFFF02036046F90101F2FFFFD48401FA6D +S315001F88006644264606FA06F400F280FC4045AF6031 +S315001F8810584E9278FFFFA3FF26462C440F261400BE +S315001F8820234622FA26441EFA26461BF2FFFFE4A41D +S315001F88303EFA246030620064A2DB26445ADB0264DF +S315001F88405ADBFFFF2BFF6F00A34622F26045DC8435 +S315001F8850D48022FAA3466C022AF0A3461EF2A34630 +S315001F886000BC00F201026400444C3FF06043234603 +S315001F88701EF4096000653FF22646C084D480604519 +S315001F8880570780FC1BF206F2604123461EF41BF0BD +S315001F889006F0C18106FA05FA9BFA65443FFA64465B +S315001F88A000FC634601F21061F2A401FAC883026458 +S315001F88B059D058D8FD1F0645246030620064A2DBDC +S315001F88C025445ADB02645ADBFFFF2BFFA2FF00F48D +S315001F88D001F00A187067A080F0670603C08401FACA +S315001F88E02546254480FC05FAAF60584E9278FFFF57 +S315001F88F0D4FEA3FF2C440427160023461EF29EFC1B +S315001F8900604646463FF200F4604708FA26462C4367 +S315001F89102AFC06F4006400FA01F080600064B0844B +S315001F892001FA26461D0000664646BF60F378FFFF24 +S315001F8930A3461EF09EFC00633385A3460D03A34684 +S315001F894022F20F65A485D48422FAA346A2FFAF6044 +S315001F8950584E9278FFFFA3FF2646C5605E78FFFF3D +S315001F89602AF232F06040082A5C00012B2F00644077 +S315001F8970012A2C00B8F127604664A0D3FFFFDC84D0 +S315001F8980DC80D0800403A2DB0824C6FE04008AFF15 +S315001F89902060007588FF1BF2FFFF6045B8F1276056 +S315001F89A04C64A0D3FFFFD880C4840B030705DC806B +S315001F89B0D0800403A2DB0904C6FE07000064B88446 +S315001F89C0A2DB8AFF2060007588FF2B00B8F12760A5 +S315001F89D04464A0D3FFFFDC84DC80D0800403A2DBC9 +S315001F89E00824C6FE04008AFF2060007588FF1BF25C +S315001F89F0FFFF6045B8F127604A64A0D3FFFFD88008 +S315001F8A00C4840B030705DC80D0800403A2DB0904A2 +S315001F8A10C6FE07000064B884A2DB8AFF20600075CB +S315001F8A2088FF07F4FFFF22F226460FB4DC85B8F154 +S315001F8A3027604864A0D3FFFFD880C4840B030705B3 +S315001F8A40DC80D0800403A2DB0904C6FE0700006495 +S315001F8A50B884A2DB8AFF2060007588FF27F2FFFF1C +S315001F8A606040013B1200B8F127605664A0D3FFFF98 +S315001F8A70DC84DC80D0800403A2DB0824C6FE04004D +S315001F8A808AFF2060007588FF1300023B1100B8F1B2 +S315001F8A9027605864A0D3FFFFDC84DC80D0800403EA +S315001F8AA0A2DB0824C6FE04008AFF2060007588FF2B +S315001F8AB0C6608978FFFFBF60F378FFFF24603064CC +S315001F8AC0404B2C60584DB278FFFF00664646BF608C +S315001F8AD0F378FFFF2460306224601464A2DB6644CF +S315001F8AE05ADB02645ADBFFFF2BFFF8FE0066464681 +S315001F8AF0BF60F378FFFF2AF258636047012764635C +S315001F8B003060E462615CA2D9BDD0BDD064456441CA +S315001F8B10BDD000F404F883FA82F8A64602B05E635D +S315001F8B200403646303B0023A6C633FF2BDD0BDD049 +S315001F8B3064456441BDD0A64607F886FA85F86047A6 +S315001F8B4008FA3060E462A2D1264664412F58FFFF1F +S315001F8B50A9F500F2264631F0391866411C60BA6540 +S315001F8B606447007FA9F1E08444D36443111860462B +S315001F8B7000F2FFFFFC1B6644644680F0604680F8E7 +S315001F8B806546654380F001FA80FC644680F80B0059 +S315001F8B906446624300F2A3DB604680F081FC80FCE2 +S315001F8BA0644680F8604361461E60BC61A1D31E60A7 +S315001F8BB0FE7CD080FFFF0703A0DDDA9CA1D949D335 +S315001F8BC0FFFFDC84A1DBC6604378FFFF207C724475 +S315001F8BD0FFB4D080FFFF0204D084FB01E083A9F31A +S315001F8BE002A34393A9F3FFFF02A5D78004A5082478 +S315001F8BF065436641634605F200F081F0021864463C +S315001F8C0081F8071B1C60BA656047007FE08444D962 +S315001F8C100200654600F8A9F36345604600F2FFFFB0 +S315001F8C20D4800118FA0480F8654600FA06F2FFFFA1 +S315001F8C30007E06FA614631F066411C60BA656447DC +S315001F8C40007FA9F1E08444D364431118604600F203 +S315001F8C50FFFFFC1B6644644680F0604680F865464D +S315001F8C60654380F001FA80FC644680F80B00644679 +S315001F8C70624300F2A3DB604680F081FC80FC644601 +S315001F8C8080F8604361462FF230F031F06445464369 +S315001F8C90634603FA06F284F8007E06FA05F8A34631 +S315001F8CA02F58FFFFDCF32AF207B0033A2B0000F41C +S315001F8CB009F26045803A05000EF2FFFF02B00FF27F +S315001F8CC021036047003A1E00604100361400DA8512 +S315001F8CD02D603663BDD1FFFFD180FFFF130260FEFB +S315001F8CE0A3D3DF83A5D0DE85D080CD810B02F8020A +S315001F8CF020FE00640A00264648FE6540403A0200F0 +S315001F8D000164030008FE20FE0064404826462D58D5 +S315001F8D10FFFF2D600E62A2D318F2604001262AFAC9 +S315001F8D202AF2FFFF604008260300C7607178FFFF25 +S315001F8D303FF03240102A20002CF06441604040274B +S315001F8D401B00CD81DD811803170364400126140023 +S315001F8D5001611300B8F127605C64A0D3FFFFDC84B8 +S315001F8D60DC80D0800403A2DB0824C6FE04008AFF31 +S315001F8D702060007588FF23000061604018361F00C1 +S315001F8D80C560584F7B78FFFF0FF0EBF164446022FC +S315001F8D901900DCF3FFFF07B4FDA02AF2030208B097 +S315001F8DA0FFFF100232F233F2D080ECF10B02D080BB +S315001F8DB034F20802EDF1FFFFD0800FF00302C76007 +S315001F8DC0BD78FFFF00F4AA60AA6509F25AD0D480C5 +S315001F8DD003644F02D08000645AD04B026445D4808E +S315001F8DE0F87F08025AD02646644523F02067B084D0 +S315001F8DF0A2DA0B00D4801D60606416025AD0264684 +S315001F8E00644523F04067B084A2DA6544883A0700B8 +S315001F8E1077370800783706008E3704002A00813A14 +S315001F8E202800803700612500D480016000645AD075 +S315001F8E302002D0805AD01D02264664477FB4FDA06B +S315001F8E400903170732400226470023F06067B084E4 +S315001F8E50A2DA42000FF2324002263E00F2F3FFFF73 +S315001F8E6002BCF2FBEB60584F7578FFFFC760C778EF +S315001F8E70FFFF26466140012A1200B8F127605C6495 +S315001F8E80A0D3FFFFDC84DC80D0800403A2DB082490 +S315001F8E90C6FE04008AFF2060007588FF6E000FF271 +S315001F8EA081F12AF26040202A12005E636040022B85 +S315001F8EB06463BDD2BDD2D08082F10802D080A3D216 +S315001F8EC083F10402D080FFFF0102060056002AF23A +S315001F8ED0FFFFFFFF48365100F2F3FFFF02BCF2FB14 +S315001F8EE0590026462AF2FFFFFFFF0C264600B03622 +S315001F8EF015001036130030361100C0360200A03A96 +S315001F8F00120081F132F233F2D08082F13602D08024 +S315001F8F1034F283F13202D080FFFF2F02DC60584FFC +S315001F8F200078FFFF2600503A0500EF60584FB678CD +S315001F8F30FFFF1F00403A0500E860584F3078FFFFDB +S315001F8F401800803A150081F132F233F2D08082F197 +S315001F8F501402D08034F283F11002D080FFFF0D027D +S315001F8F60DF60584F5678FFFF2060584F9D78FFFFF0 +S315001F8F700400664400A8FFFF0A03264624603064E7 +S315001F8F80404B2C60584DB278FFFF00664646C560C1 +S315001F8F905B78FFFF2AF23BF06040402B1E00C0604B +S315001F8FA000646440202B190022F2FFFF04B4FFFF68 +S315001F8FB01403C06000642646A084E884E884E8841D +S315001F8FC023F210BDB49C3FF223F83FF2FFFFF8A433 +S315001F8FD03FFA00F4604708FA264624603062246090 +S315001F8FE01464A2DB26445ADB02645ADBFFFF2BFF05 +S315001F8FF0F8FECB0100603061AE60584DC178FFFFAF +S315001F9000664460FB00603061AE60584DC178FFFF5B +S315001F901066445FFB00600261AE60584DC178FFFF7A +S315001F9020664466FB10602662C960CB64A2DB2F58BC +S315001F9030FFFF00643B425ADB0164DCFBF2F3FFFFD8 +S315001F9040FEB4F2FB0F60F0620064A2DB00601463E3 +S315001F90500160C4612760FA6458D159D9FD1F0060A9 +S315001F90608863276070612860106458D159D9FD1F25 +S315001F90702760E862A2D1FFFF6445A9F166416446F5 +S315001F908036F2FFFF65400136226436FA61463245E5 +S315001F90902760F862A2D11067B4856440012A9485BF +S315001F90A04552FF60E7653241A5812C60D662A2D189 +S315001F90B02760E862A2D36440012A0D000865FFA05D +S315001F90C0FFFF010308002760EC62A2D3B58110657C +S315001F90D060400126B58141522C60D662A2D3306012 +S315001F90E0D463F084F084F08401B5F084F08403B473 +S315001F90F0655CA3D93060D66302A8A3DB1B02076099 +S315001F9100D0643060D863A3DB3060E063A3DB00600C +S315001F9110C8643060DA63A3DB3060E263A3DB006000 +S315001F912064643060DC63A3DB016090643060DE63DF +S315001F9130A3DB08000A643060DC63A3DB01643060D4 +S315001F9140DE63A3DB2C60D662A2D101646440402A91 +S315001F915003003060CA7CA4DB12602863BAF30E6179 +S315001F916060456544E8850564CD8102280064BDDB42 +S315001F9170F8022D60346127607264206358D159D973 +S315001F9180FD1FBDF180F91A6301600061006459DBA0 +S315001F9190FE1F4040016487FB28608861A1D32E60B3 +S315001F91A05261FEA4E08404240F00E08441912D60E7 +S315001F91B08862A2D3A1D12D608062A083A2DD59D17E +S315001F91C02D607E62A083A2DDE5F37FFB1B60C66177 +S315001F91D0A1D3FFFF00B810605C650D031B60CE6353 +S315001F91E0E5F3A3D1E084C484A0D3FFFF01B0FFFF42 +S315001F91F00202E5F97FF9E5F30161CC84FFFF020363 +S315001F9200E181FB01BAF36145A480FFFF0B0200B8A1 +S315001F921001630803E884FFFF02240200DF83FA01CB +S315001F9220E5FD7FFD0F60F0620064A2DBDEFE0B042E +S315001F92300F60F26240600064A2DBC860FB645ADB09 +S315001F9240CFFE2F58FFFF7FF124605662A2D90C6410 +S315001F92504ADBFFFF2DFF0764D0FB0F60F262206021 +S315001F92600064A2DBC96038645ADBCFFE2F58FFFFAC +S315001F92700F60F0620064A2DBBEFE0F60D062A2D157 +S315001F928040600064B084A2DBCFFE01643B425ADB20 +S315001F9290E3F3FFFF6040053A030068606E6111004B +S315001F92A0043A0300686062610C00033A03006860B9 +S315001F92B056610700023A030068604A61020068604F +S315001F92C03E613C6000660160B8640A6359D058D994 +S315001F92D0FD1F0160BE61E4F3006600A8046501037B +S315001F92E0A1DB1F60086355D3FFFF207FBDDB59D36A +S315001F92F0FFFF217FBDDB59D3FFFF227FA3DB0F605B +S315001F9300F0620064A2DBDEFE0B040F60F2624060B7 +S315001F93100064A2DBC9607F645ADBCFFE2F58FFFFB4 +S315001F9320246056621F600664A2DB20644ADBFFFFCF +S315001F93302DFF0F60F26220600064A2DBC960A46487 +S315001F93405ADBCFFE2F58FFFFBEFE0F60D062A2D1A1 +S315001F935040600064B084A2DBCFFEC5FE2040202AF9 +S315001F9360080010600262A2D100600464B084A2DB10 +S315001F9370CFFE0F60EA62A2D100600264B084A2DB56 +S315001F9380CFFE0F60F0620064A2DB5ADB0E643B4225 +S315001F93905ADB2F58FFFF0F643B425ADB0F60F06208 +S315001F93A00064A2DB02648BFBFFFFC1FE10601A6222 +S315001F93B0A2D10160DF64B084A2DBCFFE24606463A8 +S315001F93C00164BDDBFFFF04FF0F60F062A2D10060E6 +S315001F93D00864B084A2DBCFFE0F60F26200600864EF +S315001F93E0A2DBC960F7645ADBCFFE2F58FFFF086464 +S315001F93F03B425ADB0F60F062A2D17F60FF64A084FC +S315001F9400A2DB8BF30065D480FFFF0B030F60F262B4 +S315001F941080600064A2DBC960F7645ADBCFFE2F5859 +S315001F9420FFFFDEFE0E0409643B425ADB0F60F26249 +S315001F943020600064A2DBCA6021645ADBCFFE2F586E +S315001F9440FFFF0A643B425ADB2460566206644ADB0E +S315001F9450FFFF2DFF0F60F0620064A2DB5ADBBEFE2A +S315001F9460DAFE2360F061CA60584E5B78FFFF236007 +S315001F9470DE61CA60584E5B78FFFF2360E461CA60F5 +S315001F9480584E5B78FFFF24600261CA60584E5B78B6 +S315001F9490FFFF24600861CA60584E5B78FFFF246097 +S315001F94A01461CA60584E5B78FFFFC5FE0E643B42CF +S315001F94B05ADB2F58FFFFA1D30E5724000EF2444C40 +S315001F94C080B010B00B03246030620064A2DB6644D8 +S315001F94D05ADB02645ADBFFFF2BFF13001202F03721 +S315001F94E0090002F009600864D080A2FFB0F30202EF +S315001F94F0CC84B0FB24603064404B2C60584DB2784E +S315001F9500FFFF2C44AC8609F0D9023758FFFF1A60BB +S315001F951066630064A3DB06A310604C64BDDBBDDB82 +S315001F95200664A3DB006310609E62A2DD10604A62C0 +S315001F9530CF601A64A2DB10602462CE60E664A2DBF1 +S315001F95400F60EC6200600264A2DBCA60FF645ADB34 +S315001F9550CFFE2F58FFFF686032613C6000660160D6 +S315001F9560B8640A6359D058D9FD1F0160BE61E4F380 +S315001F9570006600A804650103A1DB1F60086355D3BD +S315001F9580FFFF207FBDDB59D3FFFF217FBDDB59D3F3 +S315001F9590FFFF227FA3DB0F60EA620064A2DBDEFE11 +S315001F95A00B040F60EC6240600064A2DBCA60CB64F0 +S315001F95B05ADBCFFE2F58FFFF246056621F600664DA +S315001F95C0A2DB20644ADBFFFF2DFF0F60EC622060E9 +S315001F95D00064A2DBCA60F0645ADBCFFE2F58FFFF80 +S315001F95E00F60EA620064A2DBBEFE0F60D062A2D1EA +S315001F95F040600064B084A2DBCFFE2E58FFFF1064CC +S315001F96003B425ADB0F60EA620064A2DBBAFE2760A8 +S315001F96107262A2D3FFFF03A802A804030F02CE6043 +S315001F9620B778FFFFCD60F378FFFF1F603C65A5D3BA +S315001F9630FFFFF3B4A5DBCB602678FFFF01631A603B +S315001F96404064A0DD1F603C640063A0DD11643B42E3 +S315001F96505ADB0F60EA620064A2DBBAFE0264DCFB1F +S315001F9660F2F3FFFF01BCF2FB4460446481FB82FB03 +S315001F967083FBFFFF2040042B19009BFE0904BBFE42 +S315001F96800F60D062A2D180600064B084A2DBCFFEDF +S315001F969012643B425ADB0F60EC6280600064A2DBFF +S315001F96A0CB603A645ADBCFFE2F58FFFF0860006578 +S315001F96B0204434800D6453FB2960606454FB13649B +S315001F96C03B425ADB0F60CE61A1D102600065204488 +S315001F96D034806440012A07000064A1DB0265E9604B +S315001F96E0584E4B78FFFFCA60584EAB78FFFF1F607E +S315001F96F03C621A604065A2D3A5D160400C220400CB +S315001F97000461D180FFFF2D050F60EA620064A2DBB2 +S315001F97100F4EE560584F0278FFFF0E4F0F60EC6249 +S315001F972010600064A2DBCB6099645ADBCFFE2F5812 +S315001F9730FFFF1F603C64A0D3FFFF60400C26110093 +S315001F9740FD60FF65204424800F60D062A2D1806037 +S315001F97500064B084A2DBCFFE0F60EA620064A2DB66 +S315001F976038000F60EA620064A2DB0F4EEC60584FB0 +S315001F97708978FFFF0E4F0F60EC6210600064A2DB5A +S315001F9780CB60C6645ADBCFFE2F58FFFF14643B42E3 +S315001F97905ADBFD60FF65204424800F60D062A2D192 +S315001F97A080600064B084A2DBCFFE0F60EA620064B3 +S315001F97B0A2DB88F119608663D3802044050310BCA1 +S315001F97C04040CD60EC78FFFF89F3FFFFD080204437 +S315001F97D00602D4F3FFFF00A8FFFF1E02720010BC93 +S315001F97E0404064425AD10663A4D1C3837FF9BDD1D9 +S315001F97F081F9BDD1FFFF82F9BDD183F904A3BDD184 +S315001F98002D6036646441DD81FEB1A0D90403BDD14C +S315001F9810C98158D9FC021E00E5F37FFB29606061F0 +S315001F9820A1D3FFFF00A82D60366302022760746173 +S315001F9830A1D3BDDBDC84FEB459D1C884BDD9FC02DB +S315001F9840EDF37245ECF3948383FD948382FD655F8C +S315001F9850026481FB0F60EA620064A2DBDEFE0B047A +S315001F98600F60EC6240600064A2DBCC602A645ADBA6 +S315001F9870CFFE2F58FFFF18643B425ADB7FF124604F +S315001F98805662A2D91E644ADBFFFF2DFF0F60EC62F2 +S315001F989020600064A2DBCC6051645ADBCFFE2F58D8 +S315001F98A0FFFF0F60EA620064A2DBBEFE0F60D0629C +S315001F98B0A2D140600064B084A2DBCFFECC60B17839 +S315001F98C0FFFF16643B425ADBFF60EF65204424808E +S315001F98D0CA60584EAB78FFFF17643B425ADB0264DF +S315001F98E0DCFBF2F3FFFF01BCF2FBF760FF652044D0 +S315001F98F024800F60D062A2D180600064B084A2DB96 +S315001F9900CFFE0F60EA620064A2DBDAFEC1FE1A60B8 +S315001F99104062A2D11A606A62A2D9246066621A6086 +S315001F99206664A2DB02644ADBFFFF04FF0F60EC6282 +S315001F993000600664A2DBCB6026645ADBCFFE1A608A +S315001F9940406175603065A1D3FFFFFFA0E08402026E +S315001F99500360E864D480FFFF01046544A1DB2F5830 +S315001F9960FFFF79F37AFB1F600E620064A2DBFF60C4 +S315001F9970DF6520442480BFF11A606A62A2D9246081 +S315001F998066621A606664A2DB02644ADBFFFF04FF9D +S315001F9990F760FF6520442480102667000064B5FB2E +S315001F99A0B6FBB7FB00750072BDF180F96444E08415 +S315001F99B0E084E084E093E6F186F928608E62A2D304 +S315001F99C0FFFF01A8FFFF08020160B062A2D3FFFFDD +S315001F99D001A8FFFF0103026460412C60E463BDD34D +S315001F99E0A3D3FFB5655CCD8180BF0E0380BFBDDBF2 +S315001F99F06544C884FFFF0B036045CD81A3D30703CE +S315001F9A00CD8180BF010380BC6047BDDB006564411B +S315001F9A102C60E663BDD3FFFF80B0FFFF01036045E7 +S315001F9A20604780B0FFFF01036045C981FFFFF20257 +S315001F9A3065447FB4023A02000A641500043A020024 +S315001F9A40146411000A3A020032640D000B3A020038 +S315001F9A5037640900103A020050640500163A0200E6 +S315001F9A606E64010014647CFB28000F60EA620064C8 +S315001F9A70A2DB0F60EC6200608464A2DBCD604464ED +S315001F9A805ADBCFFE2F58FFFF0F60EA62A2D100609C +S315001F9A908064A0809C840D03A084A2DB0F60EA6211 +S315001F9AA0A2D1FF607F61A1845AD14ADBA1845ADB10 +S315001F9AB00400BBFECB602678FFFF2760E862A2D1B9 +S315001F9AC00065644001362265644007360165A9F3C7 +S315001F9AD0665C60461F63E383B6F802A66644FC1FF6 +S315001F9AE02760E862A2D3FFFF6040073A0400A9F38C +S315001F9AF004656046B6F86446A9F33241604508B16D +S315001F9B0066411703654629605E62A2D306F0E084AC +S315001F9B10E084E084E08480BFB08406FA664302A333 +S315001F9B20634606F0FFFFB08406FA6146324410BC56 +S315001F9B3040521F600E620164A2DB0F4EE760584F52 +S315001F9B402178FFFF0E4F0F60EA62A2D1FF60FB6410 +S315001F9B50A084A2DB0F60EC6200600464A2DBCB6012 +S315001F9B6015645ADBCFFE246066621A606664A2DB48 +S315001F9B7002644ADBFFFF04FFBBFE204404271200DA +S315001F9B8010260200DBFE16000F60CE61A1D3FFFF79 +S315001F9B906040013607000164A1DB0165E960584E8C +S315001F9BA04B78FFFF0F60D062A2D180600064B08443 +S315001F9BB0A2DBCFFE01648CFBFF60EF65204424808F +S315001F9BC00364DCFBF2F3FFFFFEB4F2FBC1FE1E646F +S315001F9BD03B425ADB2F58FFFF15643B425ADBBBFE45 +S315001F9BE0CF60DA78FFFF2760E862A2D10065644084 +S315001F9BF001362265A9F3665C60461F63E383B6F8E8 +S315001F9C0002A66644FC1F644679F1A9F37AF902A4F9 +S315001F9C10D8F36045664165468CFA604001360600FA +S315001F9C200236040004360200053A020000640100F1 +S315001F9C3001646FFA79F37AF1FFFFA084654302028C +S315001F9C4079F3FFFF60410F60AE65D8F3FFFFE08435 +S315001F9C5044D36145A480FFFF0402E884A480FFFF6C +S315001F9C60FC03A4847BFB6FF0604790846FFA604708 +S315001F9C7060458064E884A480FFFFFC03A48470F021 +S315001F9C8070FA0061E884FFFF0205DD81FB01E181B7 +S315001F9C900F60A26545D30EFA66430CF4A9F1026460 +S315001F9CA0C0850C613240082A150029605E62A2D366 +S315001F9CB06641654606F0E084E084E084E08480BF68 +S315001F9CC0B08306FC6642FEA2624606F0FFFFB08422 +S315001F9CD006FA61461D643B425ADB0B64DCFBF2F35A +S315001F9CE0FFFFFEB4F2FB0165E960584E4B78FFFF9C +S315001F9CF0E5F17FF90F60EA620064A2DBDEFE0B046A +S315001F9D000F60EC6240600064A2DBCE607A645ADBAF +S315001F9D10CFFE2F58FFFF7FF124605662A2D91E6423 +S315001F9D204ADBFFFF2DFF0F60EC6220600064A2DBA1 +S315001F9D30CE609E645ADBCFFE2F58FFFF0F60EA628C +S315001F9D400064A2DB5ADBBEFE0F60D062A2D1406068 +S315001F9D500064B084A2DBCFFE01648CFBFF60DF656D +S315001F9D60204424801E643B425ADB2F58FFFF1C648D +S315001F9D703B425ADB0664DCFBF2F3FFFFFEB4F2FB49 +S315001F9D80E5F17FF90F60EA620064A2DB01648CFBD8 +S315001F9D90FF60DF6520442480A9F16645644666435B +S315001F9DA002A36346026406FA046304610160CE647B +S315001F9DB058D159D8FD1F65460165E960584E4B7845 +S315001F9DC0FFFF1E643B425ADB2F58FFFF1F643B42B7 +S315001F9DD05ADB006468FB69FBA9F10E6466416442A5 +S315001F9DE002A2624606F0FF60FC64A08406FA614682 +S315001F9DF0DCF3FFFF04A80F60CE640703A0D1FFFFAB +S315001F9E006440012A02000063A0DD0164DCFBF2F35B +S315001F9E10FFFFFEB4F2FB0F60EA620064A2DB0F6075 +S315001F9E20EC6200600264A2DBCA60FF645ADBCFFEED +S315001F9E302F58FFFF0F60EA62A2D100600464B0844E +S315001F9E40A2DBCFFE2F58FFFF2760F664A0D300F4D6 +S315001F9E506040013A42001865226102600063A5D086 +S315001F9E60DA85803A020000F404656444007FCD81E0 +S315001F9E70BDDB05036447007FCD81BDDBF0020260B9 +S315001F9E800063BDD3BDD301A8E0852702C783BDD319 +S315001F9E90BDD381A80DA821022002BDD3BDD300A822 +S315001F9EA060A81B02BDD319021DA8A3D11602E3F990 +S315001F9EB00160B86463410A6359D158D9FD1F59D14E +S315001F9EC059D3FFFF6047645ED6FB59D12760F26402 +S315001F9ED0A0D928609264A0D923002760FC64A0D370 +S315001F9EE0E3FB6040053A030068606E611100043AA7 +S315001F9EF00300686062610C00033A030068605661E4 +S315001F9F000700023A030068604A61020068603E610A +S315001F9F103C6000660160B8640A6359D058D9FD1FBA +S315001F9F200160BE61E4F3006600A804650103A1DBBE +S315001F9F301F60086355D3FFFF207FBDDB59D3FFFF8B +S315001F9F40217FBDDB59D3FFFF227FA3DB0F60EA62B0 +S315001F9F500064A2DBDEFE0B040F60EC62406000644F +S315001F9F60A2DBCF60A6645ADBCFFE2F58FFFF24600B +S315001F9F7056621F600664A2DB20644ADBFFFF2DFFCB +S315001F9F800F60EC6220600064A2DBCF60CB645ADBFB +S315001F9F90CFFE2F58FFFF0F60EA620064A2DBBEFEF2 +S315001F9FA00F60D062A2D140600064B084A2DBCFFEF6 +S315001F9FB02E58FFFF40643B425ADBBCF11A606A62AF +S315001F9FC0A2D960F5EBF12FF8ECF130F8EDF131F88D +S315001F9FD0BCF119F8F86080640EFA00643EFAA9F124 +S315001F9FE007F80060D06319608464A3DB446044648F +S315001F9FF081FB82FB83FB3144F9B440510060D0637F +S315001FA00001601065A3D3A5D104A4A3DBD080A0D182 +S315001FA0100A0641643B425ADB0F60EA620064A2DB18 +S315001FA020CC606178FFFF44472760E862A2D3FFFF39 +S315001FA030FFA4FFFF08070E6141D332400826030025 +S315001FA04010B0FFFFD30242643B425ADB0F60EA6245 +S315001FA0500064A2DBDEFE0B040F60EC62406000644E +S315001FA060A2DBD06026645ADBCFFE2F58FFFF27D115 +S315001FA0707FF924605662A2D91E644ADBFFFF2DFFBB +S315001FA0800F60EC6220600064A2DBD0604B645ADB79 +S315001FA090CFFE2F58FFFF0F60EA620064A2DBBEFEF1 +S315001FA0A00F60D062A2D140600064B084A2DBCFFEF5 +S315001FA0B01A606A620760D064A2DB246066621A6057 +S315001FA0C06664A2DB02644ADBFFFF04FF274306A385 +S315001FA0D0BDD381FBBDD382FBA3D383FB0F60EA6293 +S315001FA0E00064A2DB0F60EC6201600464A2DBD06037 +S315001FA0F07D645ADBCFFE2F58FFFFBCF11A606A62E0 +S315001FA100A2D90F60EA62A2D1FE60FF61A1845AD173 +S315001FA1104ADBA1845ADB0F60EA62A2D100600464A5 +S315001FA120A0809C840503A084A2DBCF60F678FFFF86 +S315001FA13000600865204434805FF5EBF12FF8ECF1E1 +S315001FA14030F8EDF131F8BCF119F8807EF87F0EFA80 +S315001FA15000643EFAA9F107F82BFAB0642AFA2743DE +S315001FA16006A3BDD12CF832F8BDD12DF833F8A3D1F3 +S315001FA1702EF834F806633FFC1F601061DCF3A1D391 +S315001FA18003A8AC830F020E031F601261A1D166459F +S315001FA19000F409FC01640AFA0BF81F6010610064E1 +S315001FA1A0A1DB28002760EA64A0D3664500F460405F +S315001FA1B0013616000236C7000336070004361000A4 +S315001FA1C00536C100063601000B00806409FA0163DB +S315001FA1D00AFC00640BFA2D6010620364A2DB0A00FE +S315001FA1E0006409FA01630AFC00640BFA2D60106211 +S315001FA1F00164A2DB246030622360E464A2DB654451 +S315001FA2005ADB02645ADBFFFF2BFF0066DCF3464670 +S315001FA210FDA0C1FE02022F58FFFF016469FB4364C4 +S315001FA2203B425ADB1A604462A2D3FFFF64A4A2DB3F +S315001FA2301A604462A2D11A606A62A2D92460666259 +S315001FA2401A606664A2DB02644ADBFFFF04FF0F602D +S315001FA250EC6200600C64A2DBD16032645ADBCFFE75 +S315001FA2602F58FFFF0F60EA62A2D100600864A0802A +S315001FA2709C845603A084A2DB246066621A6066640F +S315001FA280A2DB03644ADBFFFF04FF006469FB0F6068 +S315001FA290EA620064A2DB264600F409F20AF200A86D +S315001FA2A00BF202A8160200A81A02190226462460FB +S315001FA2B03064404B2C60584DB278FFFF006646460F +S315001FA2C02040082A0300D3600B78FFFFD96061780E +S315001FA2D0FFFF09F20AF280A80BF202A8E403446406 +S315001FA2E03B425ADB0BF226464059026000612FF2B1 +S315001FA2F0A1DB30F2415859DB31F259DB2646246087 +S315001FA3003064404B2C60584DB278FFFF00664646BE +S315001FA3100365E960584E1C78FFFFDC60D878FFFFA5 +S315001FA320FF60FB64A084A2DB006469FB0F60EA6226 +S315001FA3300064A2DB2040082A0300CF60F678FFFFE7 +S315001FA340D760D678FFFF016309FC324008261A0042 +S315001FA3502760E862A2D3FFFF60400B360300D06080 +S315001FA360F078FFFF0164A2DB2D6012620B64A2DB93 +S315001FA3702D6010620264A2DBA9F166416446226465 +S315001FA38036FA614601640AFA00640BFA016469FB36 +S315001FA3900F60EA620064A2DB246030622360E4641B +S315001FA3A0A2DB65445ADB02645ADBFFFF2BFF006604 +S315001FA3B0DCF34646FDA0C1FE02022F58FFFF2460B4 +S315001FA3C066621A606664A2DB02644ADBFFFF04FF53 +S315001FA3D00F60EC6200600C64A2DBD160F3645ADB91 +S315001FA3E0CFFE2F58FFFF0F60EA62A2D100600864FC +S315001FA3F0A0809C843B03A084A2DB246066621A6053 +S315001FA4006664A2DB03644ADBFFFF04FF006469FB8B +S315001FA410264600F409F20AF201A80BF202A804026A +S315001FA42000A8020201023100D260584DFA78FFFFE0 +S315001FA4300BF226464059026000612FF2A1DB30F273 +S315001FA440415859DB31F259DB264624603064404BB4 +S315001FA4502C60584DB278FFFF006646460365E960DB +S315001FA460584E1C78FFFFDC60D878FFFFD260584D2E +S315001FA470FA78FFFF006469FB2040082A0300CF60BB +S315001FA480F678FFFFD760D678FFFF26464060006547 +S315001FA4902AF22FF0B4842AFA2CF832F830F22DFA69 +S315001FA4A033FA31F22EFA34FAEBF32FFAECF330FAD1 +S315001FA4B0EDF331FACCF119F81CF013F800643EFAEB +S315001FA4C000F403640AFA00640BFA016369FD0F6066 +S315001FA4D0EA620064A2DB246030622360E464A2DBCC +S315001FA4E026445ADB02645ADBFFFF2BFF0066DCF3B0 +S315001FA4F04646FDA0C1FE02022F58FFFF246066627A +S315001FA5001A606664A2DB02644ADBFFFF04FF0F606A +S315001FA510EC6200600C64A2DBD26092645ADBCFFE51 +S315001FA5202F58FFFF0F60EA62A2D100600864A08067 +S315001FA5309C845103A084A2DB246066621A60666451 +S315001FA540A2DB03644ADBFFFF04FF006469FB2646A8 +S315001FA55000F409F20AF201A80BF204A81A0200A8D5 +S315001FA56018021702D260584DFA78FFFF264624605C +S315001FA5703064404B2C60584DB278FFFF006646464C +S315001FA5802040082A0300D3600B78FFFFD96061784B +S315001FA590FFFFD260584DFA78FFFF0BF2264640594F +S315001FA5A0026000612FF2A1DB30F2415859DB31F214 +S315001FA5B059DB264624603064404B2C60584DB278D8 +S315001FA5C0FFFF006646460365E960584E1C78FFFF8D +S315001FA5D0DC60D878FFFFD260584DFA78FFFF006421 +S315001FA5E069FB2040082A0300CF60F678FFFFD7607B +S315001FA5F0D678FFFF2D601262A2D3FFFF60400B3A91 +S315001FA60008002760E8620B64A2DB2D6012620064FB +S315001FA610A2DB2D58FFFF45643B425ADB2E60A67C0A +S315001FA6202E609A63A3D9644129606063BDD3007C01 +S315001FA630031B274310A3BDD3FFFF6045645FA1DB48 +S315001FA6406544BDD1C88459D8FC05274110A1A1D1A5 +S315001FA650FFFFC1810126DD81414C59D17C44B08465 +S315001FA66059D159D1B084B084FFFF020267445D00FF +S315001FA6702D60A263DD601864BDDA50600064BDDA28 +S315001FA6800160F264BDDA00600164BDDA2C4159D362 +S315001FA6905060007C6040022A03000160F2640E00D5 +S315001FA6A0042A03000260F2640900102A03000460F2 +S315001FA6B0F2640400202A04000560F264BDD9BDDBE4 +S315001FA6C00164BDDB59D35060007C6040022A030041 +S315001FA6D00160F2640E00042A03000260F26409009E +S315001FA6E0102A03000460F2640400202A0400056097 +S315001FA6F0F264BDD9BDDB0164BDDB59D35060007C5C +S315001FA7006040012A03000060F2640900022A030068 +S315001FA7100160F2640400042A02000260F264BDD9DB +S315001FA720BDDB59D3BDDA2D60A2642E60A062A2DB09 +S315001FA73060F500642BFA00642AFA274306A3BDD1ED +S315001FA7402CF832F8BDD12DF833F8A3D12EF834F8F2 +S315001FA75000F401633240082610BB2760E862A2D1CD +S315001FA760FFFF6440FE2610BB09FC27420CA2276090 +S315001FA770BE63A2D3A3D300BD0163AC810903080343 +S315001FA780B060584DB378FFFF00B801630103604303 +S315001FA7901A603E64A0DD126159DC2760E862A2D30D +S315001FA7A0FF60FF7C60400B2A02002C60EE7C2E604F +S315001FA7B0A262A2D92E609A644048D981FF60F264D2 +S315001FA7C0E860584DB878FFFF60F53FFCDB832D60CE +S315001FA7D0C462A2DD007C5AD963412D60C86312652D +S315001FA7E000F4CD844C91604360FEA5D2DE857F26A2 +S315001FA7F0020000F404655D93A3DB5D93A5D2F61FEB +S315001FA8005D9320FEDF8360F5246030622360E4647D +S315001FA810A2DB66445ADB02645ADBFFFF2BFF00668E +S315001FA8204646C1FE066469FB46643B425ADB24600A +S315001FA83066621A606664A2DB02644ADBFFFF04FFDE +S315001FA8400F60EC6200601C64A2DBD4602B645ADBD1 +S315001FA850CFFE2F58FFFF0F60EA62A2D10060086487 +S315001FA860A0809C843A03A084A2DB246066621A60DF +S315001FA8706664A2DB03644ADBFFFF04FF0F60EA6224 +S315001FA8800064A2DB264600F40AF2006300A869FDF5 +S315001FA8905A030AF226464059026000612FF2A1DBD5 +S315001FA8A030F2415859DB31F259DB264624603064B9 +S315001FA8B0404B2C60584DB278FFFF00664646056533 +S315001FA8C0E960584E1C78FFFFDC60D878FFFF4764AD +S315001FA8D03B425ADBCF60F678FFFF00601064A08012 +S315001FA8E09C842103A084A2DB246066621A606664CE +S315001FA8F0A2DB03644ADBFFFF04FF264624603064A5 +S315001FA900404B2C60584DB278FFFF006646460064E8 +S315001FA91069FB0F60EA620064A2DB49643B425ADBB3 +S315001FA920D0609878FFFFFF60FB64A084A2DB006401 +S315001FA93069FB0F60EA620064A2DB4A643B425ADB92 +S315001FA940CF60F678FFFF48643B425ADB09F02E6062 +S315001FA95020631064BDDBBDD90AF0BDD90BF0BDD98C +S315001FA9600CF2BDDB6047FFB40AA52E601E61655C55 +S315001FA970A1D960411A65CD844C91604360FEA5D272 +S315001FA980DE857F26020000F404655D93A3DB5D93DD +S315001FA990A5D2F61F5D9320FEDF832760E862A2D350 +S315001FA9A06143A5D260400B2A3200853A30006041D0 +S315001FA9B065440AA4A0D02D600E62644018260700C5 +S315001FA9C00064A2DB2760E8620164A2DB0200016467 +S315001FA9D0A2DB61446047FFB402A42E601E61A1D1B1 +S315001FA9E0DF83C084A1DBD0846041CD844C9160435A +S315001FA9F060FEA5D2DE857F26020000F404655D9306 +S315001FAA00A3DB5D93A5D2F61F5D9320FEDF830BF2BA +S315001FAA10FFFF07B401610303CC84E181FD0261449A +S315001FAA2096FB2745026246D35AD1604756FB6447B9 +S315001FAA3055FB00645CFB0C6246D380FB0BF00F607A +S315001FAA40FF64A08485FB264632F081F933F00E633E +S315001FAA50C78182F934F083F959D1FFFF6444012A73 +S315001FAA60C88460432D60346458D959D158D9FD1F05 +S315001FAA702760E862A2D159D364400136226464403C +S315001FAA8000365094A9F1FFFF4447A74636FAB7FC94 +S315001FAA90A7461A603E62A2D387FB31F21C60BA65D5 +S315001FAAA06047007FE08444D366416046604305F2F9 +S315001FAAB01618614631F06346D08004F20C026146D7 +S315001FAAC030F06346D08003F2060261462FF06346DC +S315001FAAD0D080FFFF070380F4FFFF6346E81BA9F33F +S315001FAAE008FE60436146A9F1FFFFD38031F22702BA +S315001FAAF066411C60BA656047007FA9F1E08444D3B4 +S315001FAB0064431118604600F2FFFFFC1B664464464F +S315001FAB1080F0604680F86546654380F001FA80FC48 +S315001FAB20644680F80B006446624300F2A3DB60466E +S315001FAB3080F081FC80FC644680F860436146434791 +S315001FAB4000F418650C6102600063A5D0DA856444C1 +S315001FAB50007FCD81BDDB05036447007FCD81BDDB53 +S315001FAB60F40202600261A1D30065604359D3FFFF5F +S315001FAB707FB4023A020001641500043A020002641F +S315001FAB8011000A3A020004640D000B3A0200086421 +S315001FAB900900103A020010640500163A02002064EC +S315001FABA001000064CF83B485E10265447AFB02602D +S315001FABB00261A1D30065604359D3FFFF80B0FFFF39 +S315001FABC001036045CF836544F7027FB4023A020052 +S315001FABD00A641500043A0200146411000A3A0200BE +S315001FABE032640D000B3A020037640900103A020066 +S315001FABF050640500163A02006E64010014647CFB63 +S315001FAC002744D8F36045664165468CFA6040013695 +S315001FAC1006000236040004360200053A02000064EC +S315001FAC20010001646FFA79F37AF1FFFFA08465438F +S315001FAC30020279F3FFFF60410F60AE65D8F3FFFF95 +S315001FAC40E08444D36145A480FFFF0402E884A48006 +S315001FAC50FFFFFC03A4847BFB6FF0604790846FFAB1 +S315001FAC60604760458064E884A480FFFFFC03A484DA +S315001FAC7070F070FA0061E884FFFF0205DD81FB01B9 +S315001FAC80E1810F60A26545D30EFA66430CF42D6071 +S315001FAC908E62A2D32D608C62A2D160472760E862C4 +S315001FACA0A2D1B084644001362264644000365094B9 +S315001FACB0A74636FAB7FCA746806003653240082AC6 +S315001FACC00365A74606F07F60FF64A084B48406FA76 +S315001FACD0B7FCA74626462FF030F0644331F22746CD +S315001FACE003FC04F805FA2646CF60584E2478FFFF6A +S315001FACF0264624603064404B2C60584DB278FFFFC7 +S315001FAD000066464601648CFB2760F462A2D320418D +S315001FAD1000BC20B9010341401F600E610064A1DB26 +S315001FAD200464C1FEDCFBF2F3FFFFFEB4F2FBF76027 +S315001FAD30FF65204424800F60D062A2D1806000642A +S315001FAD40B084A2DBCFFE0165E960584E4B78FFFF4A +S315001FAD500F60D862A2D100600264B084A2DBCFFE6E +S315001FAD600C6469FB0F60EC6200603164A2DBD66085 +S315001FAD70BD645ADBCFFE2F58FFFF10600E620064C2 +S315001FAD80A2DB5ADB0F60EA62A2D100600164A080D9 +S315001FAD909C841003A084A2DB3060E861A1D3FFFF6F +S315001FADA0031BDC60FE78FFFFDC60FE78FFFFD760C9 +S315001FADB06078FFFF00601064A0809C84F803A08465 +S315001FADC0A2DBA9F3FFFF02A460436641634605F2B7 +S315001FADD000F081F00218644681F8071B1C60BA65F3 +S315001FADE06047007FE08444D90200654600F8A9F356 +S315001FADF06345604600F2FFFFD4800118FA0480F80D +S315001FAE00654600FA06F2FFFF007E06FA61464B64AE +S315001FAE103B425ADB0F60EA620064A2DB01602E62CE +S315001FAE20A2D3FFFF10B0FFFF13030F60EC62046095 +S315001FAE300064A2DBD76028645ADBCFFE0F60F66280 +S315001FAE40A2D101600064B084A2DBCFFE2F58FFFFA2 +S315001FAE506AF3FFFF01B0FFFF13030F60D862A2D191 +S315001FAE6000600464B084A2DBCFFE0F60EC62026058 +S315001FAE700064A2DBD76040645ADBCFFE2F58FFFF6A +S315001FAE800F60EA620064A2DB006469FBD760584E5C +S315001FAE907078FFFF02648CFB0264C1FEDCFBF2F3D9 +S315001FAEA0FFFF01BCF2FB0265E960584E4B78FFFFBE +S315001FAEB00360E8631A604064A0DDCB601E78FFFF65 +S315001FAEC000602064A0809C84FFFF08245401A08496 +S315001FAED0A2DB006369FD0F60EA620064A2DB150056 +S315001FAEE0246066621A606664A2DB03644ADBFFFFA6 +S315001FAEF004FF006469FB0F60EA620064A2DB016461 +S315001FAF008CFBFFFFC1FE2E58FFFF50643B425ADBEE +S315001FAF100F60EA620064A2DB01602E62A2D3FFFF0C +S315001FAF2010B0FFFF13030F60F662A2D10160006429 +S315001FAF30B084A2DBCFFE0F60EC6204600064A2DB6C +S315001FAF40D76088645ADBCFFE2F58FFFFBCF11A600B +S315001FAF506A62A2D97FF17EF902648CFBFFFFC1FEF4 +S315001FAF608CF30065D480FFFF0F030F60EA62006455 +S315001FAF70A2DB0F60EC6280600064A2DBD760AC646A +S315001FAF805ADBCFFE2F58FFFF0F60EA620064A2DB79 +S315001FAF9051643B425ADB1960846468FB1A6046633E +S315001FAFA081F3BDDB82F3BDDB83F3A3DB0160106599 +S315001FAFB068F3A5D104A468FBD080A0D3200740471F +S315001FAFC060410E6545D32760E862A2D1FFFF031BD0 +S315001FAFD010B0FFFFEB02274406A46041A1D181F305 +S315001FAFE082F1D08059D30802D08083F359D104024D +S315001FAFF0D080FFFF01020300D8609278FFFF1A601E +S315001FB0004663BDD381FBBDD382FBA3D383FB5364AE +S315001FB0103B425ADB0F60EA620064A2DBDEFE0B04D2 +S315001FB0200F60EC6240600064A2DBD760FF645ADBEE +S315001FB030CFFE2F58FFFF7EF17FF924605662A2D9FB +S315001FB0401E644ADBFFFF2DFF0F60EC622060006469 +S315001FB050A2DBD8602F645ADBCFFE2F58FFFF0F608D +S315001FB060EA620064A2DBBEFE0F60D062A2D140601E +S315001FB0700064B084A2DBCFFE01638CFD0F60D86233 +S315001FB080A2D100600264B084A2DBCFFEC1FE54646D +S315001FB0903B425ADB3144F9B440510160BA611F602B +S315001FB0A00863A1D3FFFF207FBDDB59D3FFFF217F9D +S315001FB0B0BDDB59D3FFFF227FA3DB0F60EA6200646B +S315001FB0C0A2DBDEFE0B040F60EC6240600064A2DBB5 +S315001FB0D0D8605D645ADBCFFE2F58FFFF246056628F +S315001FB0E01F600664A2DB20644ADBFFFF2DFF0F6093 +S315001FB0F0EC6220600064A2DBD86082645ADBCFFE5C +S315001FB1002F58FFFF0F60EA620064A2DBBEFE0F60CE +S315001FB110D062A2D140600064B084A2DBCFFED660AD +S315001FB120B078FFFF27432D603665A5D3654110A371 +S315001FB13001A4FEB4C485FEA1BDD359D1FFFFD080A3 +S315001FB140D58002020403F801D760D678FFFF556445 +S315001FB1503B425ADB0F60EA620064A2DBDEFE0B0491 +S315001FB1600F60EC6240600064A2DBD860AA645ADB01 +S315001FB170CFFE2F58FFFF27D17FF924605662A2D931 +S315001FB1801E644ADBFFFF2DFF0F60EC622060006428 +S315001FB190A2DBD860CF645ADBCFFE2F58FFFF0F60AC +S315001FB1A0EA620064A2DBBEFE0F60D062A2D14060DD +S315001FB1B00064B084A2DBCFFE0160BA611F60086322 +S315001FB1C0A1D3FFFF207FBDDB21603264BDDB04A15D +S315001FB1D0A1D3FFFF227FA3DB0F60EA620064A2DB1D +S315001FB1E0DEFE0B040F60EC6240600064A2DBD860D9 +S315001FB1F0EC645ADBCFFE2F58FFFF246056621F6098 +S315001FB2000664A2DB20644ADBFFFF2DFF0F60EC62A2 +S315001FB21020600064A2DBD96011645ADBCFFE2F5871 +S315001FB220FFFF0F60EA620064A2DBBEFE0F60D06202 +S315001FB230A2D140600064B084A2DBCFFE1A606A62AE +S315001FB2400760D064A2DB246066621A606664A2DBB4 +S315001FB25002644ADBFFFF04FF274306A3BDD381FB1E +S315001FB260BDD382FBA3D383FB3144F9B440510F6096 +S315001FB270EA620064A2DB0F60EC6201600464A2DB79 +S315001FB280D96046645ADBCFFE2F58FFFFBCF11A6008 +S315001FB2906A62A2D90F60EA62A2D1FE60FF61A18431 +S315001FB2A05AD14ADBA1845ADB0F60EA62A2D1006041 +S315001FB2B00464A0809C840503A084A2DBD760D67893 +S315001FB2C0FFFF27420CA22760BE63A2D3A3D300BDF4 +S315001FB2D00163AC8109030803B060584DB378FFFFC3 +S315001FB2E000B80163010360431A603E64A0DD60F588 +S315001FB2F000642BFA20642AFA274306A3BDD12CF833 +S315001FB30032F8BDD12DF833F8A3D12EF834F8EBF16E +S315001FB3102FF8ECF130F8EDF131F8BCF119F8F860BF +S315001FB32080640EFA00F401633240082610BB2760C2 +S315001FB330E862A2D1FFFF6440FE2610BB09FC1A601B +S315001FB3403E64A0D3126159DA1A604663BDD159D83B +S315001FB350BDD159D8A3D159D82E609A644048D981F6 +S315001FB360FF60F264E860584DB878FFFF60F53FFC58 +S315001FB370DB832D60C462A2DD207C5AD963412D6018 +S315001FB380C863126500F4CD844C91604360FEA5D25C +S315001FB390DE857F26020000F404655D93A3DB5D93C3 +S315001FB3A0A5D2F61F5D9320FEDF8360F52460306211 +S315001FB3B02360E464A2DB66445ADB02645ADBFFFFA8 +S315001FB3C02BFF00664646C1FE146469FB56643B426A +S315001FB3D05ADB1A604462A2D3FFFF64A4A2DB1A6081 +S315001FB3E04462A2D11A606A62A2D9246066621A6098 +S315001FB3F06664A2DB02644ADBFFFF04FF0F60EC6298 +S315001FB40000601C64A2DBDA6009645ADBCFFE2F588A +S315001FB410FFFF0F60EA62A2D100600464A0809C84D3 +S315001FB4200E03A084A2DB57643B425ADB006469FB10 +S315001FB4300F60EA620064A2DBD760D678FFFF006068 +S315001FB4401064A0809C841703A084A2DB246066621C +S315001FB4501A606664A2DB03644ADBFFFF04FF5864BD +S315001FB4603B425ADB006469FB0F60EA620064A2DBA1 +S315001FB470DB60F978FFFF00600864A0809C843A03B4 +S315001FB480A084A2DB246066621A606664A2DB036482 +S315001FB4904ADBFFFF04FF006469FB0F60EA6200647A +S315001FB4A0A2DB264600F40AF2FFFF2C1859643B4222 +S315001FB4B05ADB0AF226464059026000612FF2A1DBD1 +S315001FB4C030F2415859DB31F259DB2646246030648D +S315001FB4D0404B2C60584DB278FFFF00664646056507 +S315001FB4E0E960584E1C78FFFFDC60D878FFFFD760F5 +S315001FB4F0D678FFFF5A643B425ADB784302612460C9 +S315001FB500B778FFFF5B643B425ADB09F02E6020636E +S315001FB5103064BDDBBDD90AF0BDD90BF0BDD90CF225 +S315001FB520BDDB6047FFB40AA52E601E62655CA2D90B +S315001FB53060411A65CD844C91604360FEA5D2DE85BD +S315001FB5407F26020000F404655D93A3DB5D93A5D2FD +S315001FB550F61F5D9320FEDF832760E862A2D3614357 +S315001FB560A5D260400B2A3100853A2F006041654401 +S315001FB5700AA4A0D02D600E6264401826070000643E +S315001FB580A2DB2760E8620164A2DB02000164A2DB82 +S315001FB59061446047FFB402A42E601E61A1D1DF8300 +S315001FB5A0C084A1DBD081CD844C91604360FEA5D2BF +S315001FB5B0DE857F26020000F404655D93A3DB5D93A1 +S315001FB5C0A5D2F61F5D9320FEDF830BF2FFFF07B4A4 +S315001FB5D001610303CC84E181FD02614496FB27458B +S315001FB5E0026246D35AD1604756FB644755FB006437 +S315001FB5F05CFB0C6246D380FB0BF00F60FF64A084DC +S315001FB60085FB1A603E62A2D387FB264632F081F97C +S315001FB61033F082F934F083F900F418650C61026087 +S315001FB6200063A5D0DA856444007FCD81BDDB0503A9 +S315001FB6306447007FCD81BDDBF40202600261A1D3A6 +S315001FB6400065604359D3FFFF7FB4023A02000164CD +S315001FB6501500043A0200026411000A3A020004644B +S315001FB6600D000B3A020008640900103A020010642C +S315001FB6700500163A0200206401000064CF83B485DA +S315001FB680E10265447AFB02600261A1D30065604353 +S315001FB69059D3FFFF80B0FFFF01036045CF83654489 +S315001FB6A0F7027FB4023A02000A641500043A020048 +S315001FB6B0146411000A3A020032640D000B3A0200AC +S315001FB6C037640900103A020050640500163A02005A +S315001FB6D06E64010014647CFBA9F3FFFF02A4D8F378 +S315001FB6E06045664165468CFA6040013606000236A3 +S315001FB6F0040004360200053A0200006401000164DA +S315001FB7006FFA79F37AF1FFFFA0846543020279F39A +S315001FB710FFFF60410F60AE65D8F3FFFFE08444D39F +S315001FB7206145A480FFFF0402E884A480FFFFFC0399 +S315001FB730A4847BFB6FF0604790846FFA6047604577 +S315001FB7408064E884A480FFFFFC03A48470F070FA71 +S315001FB7500061E884FFFF0205DD81FB01E1810F60C7 +S315001FB760A26545D30EFA66430CF4A9F31C60BA65AD +S315001FB77002A4604605F060416447007FE084007CB8 +S315001FB78044D9264631F2615C6047007FE08444D984 +S315001FB79026462FF0614603F8264630F0614604F828 +S315001FB7A0264631F0614605F82646CF60584E247866 +S315001FB7B0FFFF264624603064404B2C60584DB278FC +S315001FB7C0FFFF006646460365E960584E4B78FFFF4C +S315001FB7D001638CFD0F60D862A2D100600264B08441 +S315001FB7E0A2DBCFFEC1FE5C643B425ADBD660B0785B +S315001FB7F0FFFFFF60F76520442480D0609C78FFFF21 +S315001FB800DCF3FFFFFDA02AF20303DC60A978FFFF2C +S315001FB8106040B0361100C03602002F58FFFF264683 +S315001FB82024603064404B2C60584DB278FFFF006691 +S315001FB8304646D0609C78FFFF664500F40AF20BF27D +S315001FB840FEA0F3A06F02604109F2200300A0FFA033 +S315001FB8505303650300A0FFFF4F031F6010610164C0 +S315001FB860A1DB1F6012610D64A1DB1F6014610364FD +S315001FB870A1DB264624603064404B2C60584DB278BD +S315001FB880FFFF00664646D0609C78FFFF2760EA618F +S315001FB890A1D3FFFFFEA01F60106117020164A1DB89 +S315001FB8A01F6012610064A1DB1F6014610164A1DBCC +S315001FB8B0264624603064404B2C60584DB278FFFFFB +S315001FB8C000664646D0609C78FFFF0264A1DB1F60BE +S315001FB8D012610064A1DB1F6014610164A1DB2646AF +S315001FB8E024603064404B2C60584DB278FFFF0066D1 +S315001FB8F04646D0609C78FFFF654607F406F2FFFFB9 +S315001FB900017E06FA6546264624603064404B2C604D +S315001FB910584DB278FFFF006646462F58FFFFD2608C +S315001FB9204578FFFF0AF209F2FCA0FFA011020A02E6 +S315001FB9300BF265460A1B664107F406F2FFFF017EFE +S315001FB94006FA6146D0609C78FFFF26462F58FFFFF8 +S315001FB950654669F12AF264416040A03A020008B1C7 +S315001FB9600400C03A0C0004B1FFFF20030F60EA6217 +S315001FB970A2D100601064B084A2DBCFFE1700B03ADC +S315001FB980020001650700103A020002650300303A03 +S315001FB9900D001065A580FFFF09030F60EA62A2D1A3 +S315001FB9A000600864B084A2DBCFFE00662F58FFFF3D +S315001FB9B02760EA64A0D3FFFFFCA0FFFF16040F60F9 +S315001FB9C0EC6200600264A2DBDC60EA645ADBCFFE35 +S315001FB9D02F58FFFF2D601465A5D101600064A0805C +S315001FB9E0FFFF0303D0609C78FFFF2040082A030057 +S315001FB9F0CF60F678FFFFD760D678FFFF4E643B42D5 +S315001FBA005ADB2EF5FFFF27F21C60BA656047007FE1 +S315001FBA10E08444D366416046604305F216186146CA +S315001FBA2027F06346D08004F20C02614626F0634677 +S315001FBA30D08003F20602614625F06346D080FFFFE1 +S315001FBA40070380F4FFFF6346E81BA9F308FE604364 +S315001FBA50614625F226F0A7F2A8F066F5FFFF00F46F +S315001FBA60FFFF89F866F5FFFF07FC2CFA2DF8AEFAE3 +S315001FBA70EBF32FFAECF330FAEDF331FA81F332FAE6 +S315001FBA8082F333FA83F334FA3060E861A1D3FFFF00 +S315001FBA90031B0060A06402000060C0642AFA0263F0 +S315001FBAA03FFCABFC00643EFACCF119F8246030620F +S315001FBAB02360E464A2DB66445ADB02645ADBFFFFA1 +S315001FBAC02BFF00664646C1FE0F60EA620064A2DBDA +S315001FBAD0D660BB78FFFF00603A61AE60584DC178F3 +S315001FBAE0FFFF664462FBA9F307FA0C608064BCF192 +S315001FBAF019F80EFA00643EFA3FFA00603A61AE602A +S315001FBB00584DC178FFFF664461FBA9F307FA0C6025 +S315001FBB1080640EFABCF119F800643EFA3FFA106011 +S315001FBB202062DF600A64A2DB0F60E062006080644F +S315001FBB30A2DBDD609F645ADBCFFE2F58FFFF206418 +S315001FBB403B425ADB27607262A2D3FFFF01A803A8FC +S315001FBB5004030303DE60F878FFFF046000652044DA +S315001FBB6034800F60DE620064A2DB9BFE030520406B +S315001FBB704B230E000F60E06280600064A2DBDD6075 +S315001FBB80B1645ADBCFFE21643B425ADB2F58FFFFBD +S315001FBB901F604261A1D3FFFF6040012A070090602A +S315001FBBA00065204434800064A1DB0400106000653A +S315001FBBB0204434808CF358FB84F1BAFE01A859F94E +S315001FBBC0040202648CFBFFFFC1FE6447DCF310B066 +S315001FBBD004A83302320262F5EBF12FF8ECF130F8CC +S315001FBBE0EDF131F881F12CF832F882F12DF833F8A6 +S315001FBBF083F12EF834F8106048642AFA2460306204 +S315001FBC002360E464A2DB66445ADB02645ADBFFFF4F +S315001FBC102BFFC1FE22643B425ADB0F60E0620060CD +S315001FBC200164A2DBDE6018645ADBCFFE2F58FFFFCC +S315001FBC3023643B425ADB106784FB8CF3FFFF00A88B +S315001FBC40FFFF0B030F60E06280600064A2DBDE6013 +S315001FBC501D645ADBCFFE2F58FFFF0F60DE620064A4 +S315001FBC60A2DB1B60C6651F603C64A0D3057C08B0C1 +S315001FBC70A5D3050200B8FFFF0203157C0B00DCF3FA +S315001FBC801260266303A87FF30502E08547D3FFFFF3 +S315001FBC9007BCA2DB53F92960826454FB24643B4230 +S315001FBCA05ADB0F4EEC60584F8978FFFF0E4F0F601F +S315001FBCB0E06210600064A2DBDE6062645ADBCFFEC6 +S315001FBCC02F58FFFF25643B425ADBFFFF59F384FBC6 +S315001FBCD060401027DAFEDCF300A804A8270226021C +S315001FBCE061F5EBF12FF8ECF130F8EDF131F881F158 +S315001FBCF02CF882F12DF883F12EF8A4642AFA85F127 +S315001FBD00C067B0842BFA246030622360E464A2DB30 +S315001FBD1066445ADB02645ADBFFFF2BFFC1FE20601D +S315001FBD2000652044348026643B425ADB9EF5FFFFA4 +S315001FBD30071B2040802B5C007F60FF65204424800A +S315001FBD40006441FBF160016424FADA851960866399 +S315001FBD5089F1434CD380BED114056540802A020069 +S315001FBD6000F40465644332610F4E2E60584FDB7832 +S315001FBD70FFFF0E4F2C4304A341F3FFFF32A441FBE9 +S315001FBD80E701204720B020AF0F0340400F60E0625D +S315001FBD9000600164A2DBDE60D1645ADBCFFE2F5840 +S315001FBDA0FFFF27643B425ADB9EF141F3FFFF02A4CC +S315001FBDB0E884644623FA2460306224602064A2DB90 +S315001FBDC05AD902645ADBFFFF2BFF00649EFBFAFE63 +S315001FBDD0EB60FF65204424800F60D062A2D1806093 +S315001FBDE00064B084A2DBCFFE58F38CFBFFFFC1FEBD +S315001FBDF00F60DE620064A2DB0F60E0620060806499 +S315001FBE00A2DBDD609F645ADBCFFE2E643B425ADB0A +S315001FBE102F58FFFF2F643B425ADB9EF10064B0860A +S315001FBE209EFB070324603064404B2C60584DB2784C +S315001FBE30FFFFEB60FF65204424800F60DE62006415 +S315001FBE40A2DB0F60E06200608064A2DBDD609F649E +S315001FBE505ADBCFFE2F58FFFF97F326466043012A72 +S315001FBE6022000FF22AF06040102A100064400427B7 +S315001FBE701A00FDB36440202702BB0F60F662A2D1F1 +S315001FBE8000600864B084A2DBCFFE0C00FBB36440E5 +S315001FBE90202704BB0F60F662A2D100601064B08435 +S315001FBEA0A2DBCFFE97FD26462F58FFFFDCF33FF29E +S315001FBEB004A857FB02032F58FFFF00F41E630864F4 +S315001FBEC04048BDD2FFFF604705360B00FFB5C7834D +S315001FBED0012AF7014FD25BD2604005370800DF8386 +S315001FBEE0F501FFB56541478A5BD2DF830700007FF7 +S315001FBEF0DC85478A60415BD2DB83604701B0FEB5B4 +S315001FBF0002030264404885F16544E084E084E084CE +S315001FBF10FDA1E181E181E185C481D084D1802A0719 +S315001FBF2029069C84DC84E884E884E88596F3C78325 +S315001FBF3001266047AB83FCA30200030400F484A31D +S315001FBF40FC01806547D02841A080FEA11603090287 +S315001FBF5010601462A2D100601064B084A2DBCFFE11 +S315001FBF601E0010601462A2D100600464B084A2DBBC +S315001FBF70CFFE15002841FEA1FFFF090310601462C2 +S315001FBF80A2D100600864B084A2DBCFFE0800106057 +S315001FBF901462A2D100600264B084A2DBCFFE0F60E0 +S315001FBFA0F662A2D100600464B084A2DBCFFE2040FB +S315001FBFB0202A310057F12A4488A0D0802C052B0552 +S315001FBFC060430126150006608065BDD2BDD2D480B0 +S315001FBFD0FFB02102BDD21F02603B1D0060471D3A04 +S315001FBFE01A00007FA3D05BFB645E60475CFB1300F7 +S315001FBFF04FD2066560475BD280A0D4800C020B022D +S315001FC0001D6060655BD25BD0D484645E04025BFBFB +S315001FC0106444007E5CFB26462F58FFFF0F60F662C6 +S315001FC020A2D100602064B084A2DBCFFE2F58FFFF91 +S315001FC0300F60F662A2D102600064B084A2DBCFFE5D +S315001FC0402F58FFFF006397FD1A6072630064A3DB1E +S315001FC05006A310605064BDDBBDDB0664A3DB106066 +S315001FC0604E62E0600E64A2DBD2F11A607662A2D93C +S315001FC0701A607E630064A3DB06A310605464BDDBF5 +S315001FC080BDDB0664A3DB10605262E0601864A2DBAE +S315001FC0902760C062A2D11A608262A2D900603A618B +S315001FC0A0AE60584DC178FFFF664464FBA9F307FADB +S315001FC0B0BCF319FAF86080640EFA00643EFA3FFA80 +S315001FC0C000603A61AE60584DC178FFFF664465FB5C +S315001FC0D0A9F307FABCF319FA246080640EFA006408 +S315001FC0E03EFA3FFA106014620064A2DB5ADB10604E +S315001FC0F02862E0607E64A2DB2F58FFFF006397FD76 +S315001FC100BAFEFE60FF652044248084FD0F60EA624C +S315001FC110A2D104600064B084A2DBCFFE0F60F6627A +S315001FC1200064A2DB5ADB2F58FFFF2760C062A2D133 +S315001FC1301A608262A2D92760BA62A2D3FFFF0A1BC6 +S315001FC140006484FBBAFE0F60F6620064A2DB5ADB52 +S315001FC1502F58FFFFBAFE97F3006384FD10BC97FBB1 +S315001FC160FE60FF65204424800F60D062A2D18060EC +S315001FC1700064B084A2DBCFFE006064631A60426471 +S315001FC180A0DD0F60F6620064A2DB0F60F86201603B +S315001FC1900464A2DBE060D0645ADBCFFE2F58FFFF9A +S315001FC1A00F60F662A2D101600064A0809C84030325 +S315001FC1B0A084A2DBA3013140042AE30120405223BD +S315001FC1C012000F60F6620064A2DB10601462006446 +S315001FC1D0A2DB0F60F86281600064A2DBE060D064BE +S315001FC1E05ADBCFFEDB010F60F6620064A2DB016043 +S315001FC1F000652044348065F5BCF119F881F12CF8EF +S315001FC20032F882F12DF833F883F12EF834F8EBF17A +S315001FC2102FF8ECF130F8EDF131F8116048642AFA85 +S315001FC22000642BFA23FA246030622360E464A2DBE5 +S315001FC23066445ADB02645ADBFFFF2BFFC1FE0F6009 +S315001FC240F86200600164A2DBE1602A645ADBCFFE5C +S315001FC2502F58FFFF65F523F2FFFF01187B011067BB +S315001FC26084FB036498FBFE60FF65204424800F60F7 +S315001FC270D062A2D180600064B084A2DBCFFE0F60C3 +S315001FC280F6620064A2DB0F60F86281600064A2DBC5 +S315001FC290E1604D645ADBCFFE0D000F60F662A2D13E +S315001FC2A001600064A0809C840503A084A2DBE0607B +S315001FC2B07E78FFFF4660006520418EF3A58001B0A2 +S315001FC2C0010206000F60F6620064A2DB2F58FFFF13 +S315001FC2D01A604265A5D301638CFD271B0060646449 +S315001FC2E0A5DB65F5BCF119F881F12CF832F882F15E +S315001FC2F02DF833F883F12EF834F8EBF12FF8ECF123 +S315001FC30030F8EDF131F8116048642AFA00642BFA0F +S315001FC31023FA246030622360E464A2DB66445ADB9E +S315001FC32002645ADBFFFF2BFF060097F332400226FB +S315001FC3300200402ADAFEC1FE0F60F6620064A2DB2D +S315001FC3400F60F86201608264A2DBE160AB645ADBB6 +S315001FC350CFFE2F58FFFF0F60F662A2D10160006467 +S315001FC360A0809C840503A084A2DBE0607E78FFFF8B +S315001FC37000600264A0809C840603A084A2DBBAFE30 +S315001FC380E360CF78FFFF02648CFB016000652044E9 +S315001FC3903480BAFEC1FE0F60F6620064A2DB106035 +S315001FC3A014620064A2DB0F60F86201604664A2DBC0 +S315001FC3B0E160DE645ADBCFFE2F58FFFF0F60F66287 +S315001FC3C0A2D101600064A0809C840503A084A2DB27 +S315001FC3D0E0607E78FFFF00600464A0809C843C03BD +S315001FC3E0A084A2DB10601462A2D100600864A08042 +S315001FC3F09C840303A084A2DB340100600264A08036 +S315001FC4009C840C03A084A2DB2760BC62A2D197F395 +S315001FC4100061D180F7B4F00397FB3500006010640C +S315001FC420A0809C840F03A084A2DB2760BC62A2D1DC +S315001FC43097F30061D18008BC0302E260EF78FFFF2B +S315001FC44097FB210000600464A0809C840503A084E0 +S315001FC450A2DBE260EF78FFFF0F60F662A2D10060F9 +S315001FC4604064A0809C840303A084A2DBC5010060F6 +S315001FC4700264A0809C840503A084A2DBE360CF78BE +S315001FC480FFFF2F58FFFF026397F38CFD01BCC1FE10 +S315001FC49097FBD2F11A607662A2D90F60F66200642A +S315001FC4A0A2DB106014620064A2DB0F60F8620160F9 +S315001FC4B03464A2DBE26069645ADBCFFE24606662E5 +S315001FC4C01A607264A2DB02644ADBFFFF04FF2F5867 +S315001FC4D0FFFF0F60F662A2D101600064A0809C84FA +S315001FC4E00E03A084A2DB246066621A607264A2DB5C +S315001FC4F003644ADBFFFF04FFE0607E78FFFF0060F6 +S315001FC5001064A0809C841703A084A2DB97F3FFFF0F +S315001FC5106040042A0100D201246066621A607264B8 +S315001FC520A2DB03644ADBFFFF04FF97F3FFFF6040B4 +S315001FC530082A4D00540010601462A2D100601064D6 +S315001FC540A0809C840803A084A2DB97F3FFFF08BC8E +S315001FC55097FB2F58FFFF00600264A0809C84030393 +S315001FC560A084A2DBAB0100600464A0809C840C0342 +S315001FC570A084A2DB246066621A607264A2DB036475 +S315001FC5804ADBFFFF04FF2B0000600864A0809C8429 +S315001FC5900C03A084A2DB246066621A607264A2DBAD +S315001FC5A003644ADBFFFF04FF13000F60F662A2D18C +S315001FC5B000602064A0809C840803A084A2DB97F3FC +S315001FC5C0FFFF6040082A04000A002F58FFFF0000E3 +S315001FC5D097F3FFFFFEB497FBE1603178FFFF2760FB +S315001FC5E0BA62A2D3FFFF01A8FFFF0302E360D87858 +S315001FC5F0FFFF97F301638CFD21BC97FB64F581F167 +S315001FC6002CF882F12DF883F12EF885F1C067B084DE +S315001FC6102BFABCF119F8EBF12FF8ECF130F8EDF12C +S315001FC62031F81060A4642AFA246030622360E4643F +S315001FC630A2DB66445ADB02645ADBFFFF2BFFC1FEF7 +S315001FC6401A60766200605064A2DB246066621A601C +S315001FC6507264A2DB02644ADBFFFF04FF0F60F6620F +S315001FC6600064A2DB106014620064A2DB0F60F86234 +S315001FC67001602C64A2DBE36041645ADBCFFE2F58B6 +S315001FC680FFFF0F60F662A2D101600064A0809C8448 +S315001FC6900E03A084A2DB246066621A607264A2DBAA +S315001FC6A003644ADBFFFF04FFE0607E78FFFF106034 +S315001FC6B01462A2D100600464A0809C840303A0843A +S315001FC6C0A2DB8D010F60F662A2D100600864A08014 +S315001FC6D09C840803A084A2DB97F3FFFF02B0FFFF31 +S315001FC6E04E037D0100600864A0809C840303A08420 +S315001FC6F0A2DB450000600264A0809C841603A08410 +S315001FC700A2DB246066621A607264A2DB03644ADBE2 +S315001FC710FFFF04FF2760BC62A2D397F300A8F7B4FC +S315001FC7202E0397FBE2604378FFFF00601064A08032 +S315001FC7309C841703A084A2DB246066621A6072645D +S315001FC740A2DB03644ADBFFFF04FF2760BC62A2D3A0 +S315001FC75097F300A808BC0102420197FBE2604378E9 +S315001FC760FFFF0F60F662A2D100602064A0809C8448 +S315001FC7700303A084A2DB02002F58FFFF00002460E2 +S315001FC78066621A607264A2DB03644ADBFFFF04FF62 +S315001FC79097F3FFFFFEB497FBE1603178FFFF97F336 +S315001FC7A001638CFD01BC97FB006484FBC1FE29005D +S315001FC7B097F301638CFD01BC97FB006484FB64F552 +S315001FC7C081F12CF882F12DF883F12EF885F1C067DF +S315001FC7D0B0842BFABCF119F8EBF12FF8ECF130F815 +S315001FC7E0EDF131F80060A4642AFA246030622360F8 +S315001FC7F0E464A2DB66445ADB02645ADBFFFF2BFFAD +S315001FC800C1FE246066621A607E64A2DB02644ADB94 +S315001FC810FFFF04FF0F60F6620064A2DB1060146264 +S315001FC8200064A2DB0F60F86203600E64A2DBE460A3 +S315001FC8301D645ADBCFFE2F58FFFF0F60F662A2D191 +S315001FC84001600064A0809C840E03A084A2DB246088 +S315001FC85066621A607E64A2DB03644ADBFFFF04FF85 +S315001FC860E0607E78FFFF00600A64A0809C8403035B +S315001FC870A084A2DBC60100600464A0809C8415030B +S315001FC880A084A2DB10601462A2D100600464A080A1 +S315001FC8909C840303A084A2DB8B0100601264A0802A +S315001FC8A09C840303A084A2DBAC010F60F662A2D1B5 +S315001FC8B002600064A0809C84AD03A084A2DB106785 +S315001FC8C084FB0F60F6620064A2DB106014620064D2 +S315001FC8D0A2DB65F5BCF119F881F12CF832F882F16B +S315001FC8E02DF833F883F12EF834F8EBF12FF8ECF12D +S315001FC8F030F8EDF131F8116048642AFA00642BFA1A +S315001FC90023FA246030622360E464A2DB66445ADBA8 +S315001FC91002645ADBFFFF2BFF97F3C1FEFEB497FBA2 +S315001FC9200F60F86200600364A2DBE4609B645ADB5D +S315001FC930CFFE2F58FFFF0F60F662A2D10060026480 +S315001FC940A0809C840303A084A2DB290165F523F242 +S315001FC95098F30418CC8498FB01032101E160317818 +S315001FC960FFFF2760BA62A2D384F102A82AF203024C +S315001FC970B0842AFA08000F60F662A2D10060026432 +S315001FC980B084A2DBCFFE246030622360DE64A2DBAC +S315001FC99066445ADB02645ADBFFFF2BFFC1FE23608E +S315001FC9A0F062A2D3FFFF00A86046DB02BF60EF78EC +S315001FC9B0FFFF0F60FC62A2D100600264B084A2DB9D +S315001FC9C0CFFE2F58FFFF1A60AE630064A3DB06A3DA +S315001FC9D010605C64BDDBBDDB0664A3DB10605A62BE +S315001FC9E0E460D964A2DB1F601862A2D11A60B2622A +S315001FC9F0A2D910602A62E5600064A2DB2F58FFFFF0 +S315001FCA002F58FFFF1F603C65A5D3FFFF02BCF3B481 +S315001FCA1001B0A5DB0C021260266100641A6359DBA4 +S315001FCA20FE1F1F6018610A641A6359DBFE1F7FF31E +S315001FCA307EFB01647FFB0161CC84FFFF0203E18162 +S315001FCA40FB01BAF36145A480FFFF69030F60FC6217 +S315001FCA500064A2DBDEFE0B040F60FE624060006412 +S315001FCA60A2DBE56026645ADBCFFE2F58FFFF7FF15E +S315001FCA7024605662A2D91E644ADBFFFF2DFF0F609A +S315001FCA80FE6220600064A2DBE5604A645ADBCFFECB +S315001FCA902F58FFFFBEFE0F60D062A2D14060006418 +S315001FCAA0B084A2DBCFFE0F60FC620064A2DB0F60C6 +S315001FCAB0FE6200601A64A2DBE5606B645ADBCFFE80 +S315001FCAC0246066621A60AE64A2DB02644ADBFFFF63 +S315001FCAD004FF2F58FFFF0F60FC62A2D1006008649D +S315001FCAE0A0809C840C03A084A2DB246066621A606B +S315001FCAF0AE64A2DB03644ADBFFFF04FF260000606F +S315001FCB001064A0809C840B03A084A2DB2460666251 +S315001FCB101A60AE64A2DB03644ADBFFFF04FF1260E8 +S315001FCB2026657FF3FFFF04A4F2A0FFFF0106F1A411 +S315001FCB3001360B00003604A46041E084C484A0D3F0 +S315001FCB40FFFF00B86144EF0275011F603C65A5D366 +S315001FCB507EF1FCB4A5DB7FF90F60FC620064A2DBEB +S315001FCB60DEFE0B040F60FE6240600064A2DBE56020 +S315001FCB70AC645ADBCFFE2F58FFFF7FF1246056624D +S315001FCB80A2D91E644ADBFFFF2DFF0F60FE622060E5 +S315001FCB900064A2DBE560D0645ADBCFFE2F58FFFF8F +S315001FCBA0BEFE0F60D062A2D140600064B084A2DBDB +S315001FCBB0CFFE0F60FC620064A2DB5ADB0F60D062FF +S315001FCBC0A2D110600064B084A2DBCFFE2F58FFFFF6 +S315001FCBD0E660B978FFFFE660BD78FFFF1F603C6324 +S315001FCBE0A3D3264602B03FF2F6030260006301603C +S315001FCBF00065D48000F40224654412656041A5D007 +S315001FCC00DA85803A020000F404656444007FCD8112 +S315001FCC10BDDB05036447007FCD81BDDBF0020260EB +S315001FCC201463A3D3FFFF01B4FFFFD20326463FF0D1 +S315001FCC3001600064D080644101056041F4A1026077 +S315001FCC401863BDD3BDD1FDA0F9A008033503FEA10E +S315001FCC506442E285D181C783BB06F3011260266554 +S315001FCC60BDD3FDA1E084C4850564A5DB1F603C65BB +S315001FCC70A5D3414804BCA5DB126028651260446138 +S315001FCC8049D3D68000B80E03FB03624512602661A6 +S315001FCC9059D3D68000B80603FB030564A2DBD680F2 +S315001FCCA002A2FC020F60FC62A2D100601064B08475 +S315001FCCB0A2DBCFFE2841C501634504600063D7830D +S315001FCCC0EB83D380654301055400FEA3434BA3D3D7 +S315001FCCD0634160431B60C664A0DDE383FEA359D195 +S315001FCCE058D9FD1F006358DD2B43BDD11F60346427 +S315001FCCF06441BDD158D9BDD1FCA1414B58D9BDD135 +S315001FCD00A0D912602661126042650064D58059DB86 +S315001FCD10FD0212602465BDD3A3D1E084C4821260D4 +S315001FCD204465056464415ADBD680CD812203FB022C +S315001FCD301F6016614BD104A3BDD3FFFFF6A0C182AE +S315001FCD40050564415ADBCD81FFFFFC022B41FDA186 +S315001FCD50414BDF070F60FC62A2D100600864B084FC +S315001FCD60A2DBCFFE1F603C65A5D3FFFF08BCA5DB7A +S315001FCD70FFFF20FE26462F58FFFF20FE9AFF5C610D +S315001FCD803FF2FFFF83A0FFFF04283900F4A460438E +S315001FCD9000F41E6260FEA2D2FFFF604085361000BF +S315001FCDA0DE82A2D2FFFF20FEFFB402A4539351914D +S315001FCDB0050EFFA4429263406140EC1C98FFD90107 +S315001FCDC020FE0564007C429260FEDE82A2D2DE82D5 +S315001FCDD0A2D0FFFF20FE645F604360FEDE82A2D208 +S315001FCDE0DE82A2D0FFFF20FE645F98FF01A301A48D +S315001FCDF02D601662A2DD2D601A62A2DBBA0198FFB2 +S315001FCE00B8010060A061AE60584DC178FFFF66444F +S315001FCE105DFB046403FA80642AFACCF119F80064F6 +S315001FCE203EFA006080640EFAA9F107F867442CFAEF +S315001FCE302DFA2EFA10601C62E860AF64A2DB2F5831 +S315001FCE40FFFF5DF5EBF12FF8ECF130F8EDF131F85E +S315001FCE5081F132F882F133F883F134F82760E86202 +S315001FCE60A2D102646440FE2610BC3240082610BCC4 +S315001FCE702F600062A2DB2760E662A2D12D603664B6 +S315001FCE800218276096642E606A62A2DB2E60866295 +S315001FCE90A2DB2D60626128608862A2D32E60526574 +S315001FCEA0FEA4E084020567449900E084C4852D60D2 +S315001FCEB08862A2D3A5D1DA852D608062A083A2DD08 +S315001FCEC0A5D12D607E62A083A2DD2D605C61DD6031 +S315001FCED00664A1DB06A12D608662A2D32D607E6249 +S315001FCEE06040FDA0A2D374035060007C6040022AFC +S315001FCEF003000160F2630E00042A03000260F2635E +S315001FCF000900102A03000460F2630400202A0400AB +S315001FCF100560F26359D959DD2D608662A2D32D6053 +S315001FCF208062FEA0A2D354030060006359DD6145F1 +S315001FCF306040012A04000060F26359D959DD604040 +S315001FCF40022A04000160F26359D959DD6040042AA0 +S315001FCF5004000260F26359D959DD6040102A0400AB +S315001FCF600460F26359D959DD6040202A0400056028 +S315001FCF70F26359D959DDD583EB83EB83A5DD2D608C +S315001FCF808662A2D32D608262FFA0A2D32103006016 +S315001FCF90006359DD61456040012A04000060F263A9 +S315001FCFA059D959DD6040022A04000160F26359D93C +S315001FCFB059DD6040042A04000260F26359D959DD25 +S315001FCFC0D583EB83EB83A5DD2D608462A2D159D96E +S315001FCFD02D605C65D584DD7FA5DB65442E6074629C +S315001FCFE0A2DB2E609062A2DB0F60D4620060046435 +S315001FCFF0A2DBE760FF645ADBCFFE2F58FFFF0F60EF +S315001FD000D2620064A2DB7FF12E60CA62A2D92E60B3 +S315001FD0107265E960584D0278FFFF5DF500F480F1F7 +S315001FD02006F82F600062A2D307FA2E606A64404892 +S315001FD030106100600064E860584DB878FFFF5DF529 +S315001FD0403FFCDBFE246030622360E464A2DB66449F +S315001FD0505ADB04645ADBFFFF2BFFC1FE2F58FFFF6D +S315001FD060DCF39BFEFDA025042402046403FA00F4EE +S315001FD07009F2FFFF6047003A1C00604300361C00A0 +S315001FD080E0A0DA8516072D603661A1D1FFFFD38098 +S315001FD090CB830F02070E59D3A5D0DA85D080FFFFA9 +S315001FD0A00802F91F131EA5D059D3FFFF9080FF2238 +S315001FD0B00D00E860AD78FFFF2760E662A2D3FFFF91 +S315001FD0C06040012A03002760966402002D603664C3 +S315001FD0D02E608662A2DB26462FF22CFA30F22DFA3C +S315001FD0E031F22EFAEBF12FF8ECF130F8EDF131F8C1 +S315001FD0F081F132F882F133F883F134F850632AFC58 +S315001FD100CCF319FA00643EFAA9F307FA00F480F18A +S315001FD11006F82F600062A2D307FA2E608E65E960BB +S315001FD120584D0278FFFF2E608664404810610060EC +S315001FD1300064E860584DB878FFFF26463FFC246020 +S315001FD14030622360E464A2DB26445ADB02645ADBA6 +S315001FD150FFFF2BFFC1FE006646462F58FFFF0F60DD +S315001FD160D2620064A2DB5ADB006494FB2F58FFFFD8 +S315001FD1702F600262A2DBCD8128D35A88DC8339183F +S315001FD180FB0361407F3A07002F600262A2D303614F +S315001FD1907CA4A2DB00F460FEA3D1DD81A1D861408F +S315001FD1A07F3A090020FE2F600262A2D303617CA48E +S315001FD1B0A2DB00F460FECF83A3D3DD81A1DAFFB427 +S315001FD1C0007F1503DB8361407F3A0B0020FE60451D +S315001FD1D02F600262A2D303617CA4A2DB654400F424 +S315001FD1E060FEA3D1DF83DD81CC84A1D8EC0220FEB3 +S315001FD1F0C3012F600262A2D1FDA1FFB1C183A2DDCF +S315001FD2002D58FFFF675C1B60C661A1D3A5D91218F5 +S315001FD21060432E60D064A5DB60FEA0DDFFFF20FE0D +S315001FD220DC84CF83E38359D1DC8460FEA0D9FFFF62 +S315001FD23020FEF91F2D58FFFF0E57324040262900AA +S315001FD240454800601061AE60584DC178FFFF21034D +S315001FD250F260026424FA00604861284459DA0364C4 +S315001FD2603843BDD1CC8459D8FC02394459DA2760DA +S315001FD270EA64A0D359DA076423FA24603062246073 +S315001FD2802064A2DB66445ADB02645ADBFFFF2BFFD6 +S315001FD290FAFE3758FFFF0E57324040261C004548FE +S315001FD2A000600661AE60584DC178FFFF140302642B +S315001FD2B023FAF26000645ADA28445ADAFFFF246020 +S315001FD2C0306224602064A2DB66445ADB02645ADBA8 +S315001FD2D0FFFF2BFFFAFE3758FFFFA2FF3240402603 +S315001FD2E03E009DF36743DC84CC84390360460A0203 +S315001FD2F09DFD00604661AE60584DC178FFFF6644D4 +S315001FD3009DFB2E03464B27602E61186423FAF1609E +S315001FD310006424FA4A65A2FF2C63006459D1A2DB7C +S315001FD320A5D8DA85803A020000F40465F71F126358 +S315001FD33059D1A5D8DA85803A020000F40465F81F92 +S315001FD3402460306224602064A2DB2B445ADB026413 +S315001FD3505ADBFFFF2BFFFAFEA6FE00649DFBA3FF11 +S315001FD360BF60EF78FFFFA6FEB805A7FE1205A5FE54 +S315001FD3700304EA609578FFFFA4FEF2040F60DE62E5 +S315001FD380A2D100608064B084A2DBCFFEBF60EF78BD +S315001FD390FFFF36451F60C46444D7FFFFFFFF9FF39F +S315001FD3A0FFFF01B0006441039FFB3144E8B44051C5 +S315001FD3B06A44FFFF8026FC0161FF62FF10601A624C +S315001FD3C0A2D100602064B084A2DBCFFE3460584E29 +S315001FD3D03E78FFFF1E60BC621E60BE64A2DB006457 +S315001FD3E04ADB0160FE631C60B861006459DBFE1FE7 +S315001FD3F01C6310605C6458D1FFFF081BFC1F006094 +S315001FD40062631B60C464007C58D9FE1F1C60B46332 +S315001FD410A3D3FFFF04B0FFFF05030265E960584E63 +S315001FD4204B78FFFFBF60EF78FFFFEA609578FFFF3D +S315001FD4300F60EA62A2D100600164B084A2DBCFFE56 +S315001FD440740028600C63BDD3BDD1BDD1B084B08438 +S315001FD450FFFF07028CFB3144FEB440510D6405FBF0 +S315001FD460640028F39FF16047644107B107B408249D +S315001FD470674C50FB01610303CC84E181FD02A1804F +S315001FD480B18353029FFD28600062A2D3E5FB7FFB99 +S315001FD49024601A62A2D3FFFF00A86046465E31448D +S315001FD4A001BC4051D8F3016303A84EFD0502026378 +S315001FD4B014600064DBFB0C0002A8016303030A600F +S315001FD4C000640300026314600064DBFB00644EFB10 +S315001FD4D04BFDA9F5FFFF0EF00F60A26528608E6257 +S315001FD4E0A2D3FFFFFEA003A8110679F1060264442A +S315001FD4F0082A0900066444D30D006444202A030049 +S315001FD5000A6444D30700016444D30400E884E0841A +S315001FD51044D300000EFAEDE20F4EC860584F19783B +S315001FD520FFFF0E4FBF60EF78FFFFD7FEBF60EF789C +S315001FD530FFFF0F60EA62A2D100600264B084A2DB23 +S315001FD540CFFEF30124600262A2D3FFFF00A860464C +S315001FD5500EF24D036040F0373A00FF372F00FD37BC +S315001FD5602700F8370A006047FFB50F60D26246D121 +S315001FD57000600164B084A2DBCFFE246030620064C9 +S315001FD580A2DB66445ADB02645ADBFFFF2BFFDA017C +S315001FD59006B4FD7F0EFA2460306224600864A2DBA5 +S315001FD5A066445ADB02645ADBFFFF2BFFF9FECA01F2 +S315001FD5B023F060400426EC1B0226EA18A2FF02F0A5 +S315001FD5C009600864D080B0F30202CC84B0FB2460EB +S315001FD5D03064404B2C60584DB278FFFFB301ACFE50 +S315001FD5E00905ADFE1005AEFEAD05AFFE3A05BF60DF +S315001FD5F0EF78FFFF0F60D062A2D120600064B08475 +S315001FD600A2DBCFFEF401106032650B610700A2DDBD +S315001FD610584F6458FFFF00B9FFFF08030063A5D1E9 +S315001FD6205AD3DA8500A8CD81F202F802E0010F6015 +S315001FD630CE6210601265EB602F6300645ADBD680E2 +S315001FD640FFFF04035ADB5ADB5ADDF9011060306510 +S315001FD65000645ADBD680FFFF02035ADDFB012F58F9 +S315001FD660FFFF0F60D26440410F60D063A3D10064F7 +S315001FD670D0800B610803BDDBA3D3FFFFB084CD8130 +S315001FD680A3DB06A3F90210601A63A3D10064D0803E +S315001FD6900C611903BDDB6444FEA302A3CD81E8849C +S315001FD6A0E3030205E103F90199FB9BFD615CA3D32B +S315001FD6B09AF90318584F6058FFFF9BF39AF160437E +S315001FD6C099F36441EA01214310601465D780BDD1E7 +S315001FD6D0BDD30302BF60EF78FFFFA084BDD14341D6 +S315001FD6E0F503EB6034646458404F2AF08360FF658E +S315001FD6F06447032B01001400032603AC6047A48470 +S315001FD7002AFA2FF22CFA30F22DFA31F22EFA644150 +S315001FD710EBF32FFA6043ECF330FAEDF131F8190011 +S315001FD7206047A4842AFA2FF22CFA30F22DFA31F22E +S315001FD7302EFA36F232FA37F233FA38F234FAEBF3BC +S315001FD7402FFA36FAECF330FA37FAEDF331FA38FAE4 +S315001FD75064411CF213FA00F40DF2FFFF6040802BA8 +S315001FD76018008167A2DAEC60584E2A78FFFF26461A +S315001FD7703FFC246030622360E464A2DB26445ADB4C +S315001FD78002645ADBFFFF2BFFC1FE006646462F5879 +S315001FD790FFFF26463FF04264D080FFFF01043FFA99 +S315001FD7A007F2A9F1011B07F81CF213FA26F227F05C +S315001FD7B0604700F41FFA644720FA614421FA0167A3 +S315001FD7C00DFA10612760C2641E6358D1CD81BDD882 +S315001FD7D0FC02BBF1D8F1645E645F4463BDDA276067 +S315001FD7E0BC62A2D3FFFFE084E084E0844AD3604595 +S315001FD7F060400136036402360164B48406A2A2D1D6 +S315001FD800BDDA6447BDDAD5F3D6F16047BDDA6447A2 +S315001FD810E3F1BDDA6444BDDA2646006423F03BF02B +S315001FD8206440102A0600C067A084E884E884E88460 +S315001FD83010BC3EFA246030622360F064A2DB2644EB +S315001FD8405ADB02645ADBFFFF2BFFC8FE0066464603 +S315001FD8502F58FFFFB4F31FFA324707FA1A7E027FCB +S315001FD86008FAD8F109F8016001640AFA01640BFA93 +S315001FD870246030621864A2DB66445ADB0A645ADBF2 +S315001FD880FFFF2BFF52632E58FFFF00602A61AE6019 +S315001FD890584DC178FFFF66445EFB046403FA674474 +S315001FD8A02CFA2DFA2EFA32FA33FA34FA1260806401 +S315001FD8B0A9F10EFA07F800643EFA1A604E63A3DB5D +S315001FD8C006A310603864BDDB0464BDDB0664A3DBFE +S315001FD8D010603662EF607964A2DB1A605A630064D7 +S315001FD8E0A3DB06A310603C64BDDB0864BDDB0664D6 +S315001FD8F0A3DB10603A62EF608364A2DB10602262D2 +S315001FD900EF606364A2DB00643060E662A2DB2F581F +S315001FD910FFFF5EF5EBF12FF8ECF130F8EDF131F882 +S315001FD920CCF119F830643B425ADB0F60E4620064A5 +S315001FD930A2DB00638AFD1C609665A5DD1960866300 +S315001FD94088FD89FD2040102B05001F603E61A1D375 +S315001FD950FFFF59185EF540642AFA54F300F460433A +S315001FD960BDD104656447A5DA6441DD81E98162445E +S315001FD9700403BDD1CD8158D8FC02588B2C60E463BB +S315001FD980A3D12B44C8846441FFB1614503A1E9813A +S315001FD990414CBDD1CD8158D8FC022BD22B436047B9 +S315001FD9A0017E54F1A3DAA4D3CB83448BF8842C4194 +S315001FD9B00C04BED2FFFF6047BEDA007EA3D26045CD +S315001FD9C0007FB484CD81BDDAF4025EF52B4404A436 +S315001FD9D03FFA7FF37EFB1F604061016454F1A1DBB8 +S315001FD9E07FFBA4D3046553F301180C65F3B4B48409 +S315001FD9F053FB02B0FFFF16037FF3FFFF60470FB411 +S315001FDA007FFB01030F00EE601F78FFFF53F17FF3CB +S315001FDA1064400226F801F3A004A40104F1A4103601 +S315001FDA20F2017FFB2040102B12007FF31F603E6127 +S315001FDA30A1D1CC84016108240300E181CC84FB01C0 +S315001FDA40A18453F1E4031F604061A1DB190053F366 +S315001FDA50FFFF10B012602663020310605C63306024 +S315001FDA60E662A2D3FFFF0C1B7FF3FFFFE08547D3C0 +S315001FDA7053F101B006B0CB03644003260100C70370 +S315001FDA807FF30161CC84FFFF0203E181FB01BAF33F +S315001FDA906145A480FFFFBB0331643B425ADB0F6025 +S315001FDAA0E4620064A2DBDEFE0B040F60E6624060E8 +S315001FDAB00064A2DBED6040645ADBCFFE2F58FFFFE8 +S315001FDAC07FF124605662A2D91E644ADBFFFF2DFF39 +S315001FDAD00F60E66220600064A2DBED6073645ADBB0 +S315001FDAE0CFFE2F58FFFFBEFE0F60D062A2D140604F +S315001FDAF00064B084A2DBCFFE0F60E4620064A2DB89 +S315001FDB005EF5246030622360E464A2DB66445ADB60 +S315001FDB1002645ADBFFFF2BFF006451FB0F60E662B6 +S315001FDB2000600164A2DBED609D645ADBCFFEC1FE7F +S315001FDB3033643B425ADB2F58FFFF34643B425ADBA8 +S315001FDB400F60E4620064A2DBC6F11A605262A2D9BA +S315001FDB50246066621A604E64A2DB02644ADBFFFF22 +S315001FDB6004FFC7F11A605E62A2D924606462A2D361 +S315001FDB70FFFFFD1B246066621A605A64A2DB026403 +S315001FDB804ADBFFFF04FF0F60E66200600864A2DB4A +S315001FDB90ED60CE645ADBCFFE2F58FFFF51F10F60A9 +S315001FDBA0E4620064A2DB6440FF260300ED60067892 +S315001FDBB0FFFF020A006451FBC8F11A605E62A2D918 +S315001FDBC00F60E66200600C64A2DBED60F4645ADB52 +S315001FDBD0CFFE246066621A605A64A2DB02644ADBC7 +S315001FDBE0FFFF04FF2F58FFFF0F60E462A2D1006002 +S315001FDBF00464A0809C840C03A084A2DB246066625C +S315001FDC001A605A64A2DB03644ADBFFFF04FF140099 +S315001FDC10FF60F764A084A2DB51F3DB0A00A0006457 +S315001FDC20020351FBD601246066621A604E64A2DBB2 +S315001FDC3003644ADBFFFF04FFED600678FFFF3564D0 +S315001FDC403B425ADB246066621A604E64A2DB0364A1 +S315001FDC504ADBFFFF04FF53F3FFFFE3B453FB1F60D1 +S315001FDC603C64A0D3FFFFFEB4A2DB00643060E66213 +S315001FDC70A2DB0F60E4620064A2DBDEFE0E043264E8 +S315001FDC803B425ADB0F60E66240600064A2DBEE6037 +S315001FDC9039645ADBCFFE2F58FFFF7EF17FF92460D0 +S315001FDCA05662A2D91E644ADBFFFF2DFF0F60E66294 +S315001FDCB020600064A2DBEE6061645ADBCFFE2F5842 +S315001FDCC0FFFFBEFE0F60D062A2D140600064B08429 +S315001FDCD0A2DBCFFE1A6006631C610064CD81BDDB2B +S315001FDCE0FD02126046618AF36143C6A547D10F0440 +S315001FDCF0BED51A600263C383C383C38343D3BED116 +S315001FDD00DC84A3DB6644C084BEDB6544ED011A6078 +S315001FDD1006630E61414BBDD3BDD100BD64411903DE +S315001FDD2001A8614402A815030202E984120065478F +S315001FDD30604561440961CD81E084FF23FC01022413 +S315001FDD40C4840228D484CD81010E01BC0203E08461 +S315001FDD50F601007F2B414D8BBFDBDD021260466152 +S315001FDD608AF36143C6A547D10A04DA861A6004639B +S315001FDD70C383C383C38343D1A6D96544F2013664E3 +S315001FDD803B425ADB53F38AF1F3B453FB12604663EB +S315001FDD90C385454A1960866589F3454C404820402E +S315001FDDA0202A02000065454B2A45D78002652305B8 +S315001FDDB047D1026547D30A65D08147D30105006164 +S315001FDDC0F2A301B0614411032040202A0800F3602A +S315001FDDD0584E1278FFFF2B4402A4404B61442C423D +S315001FDDE0A2DB5ADD5A8C3AA3DF0128424ADD4ADB01 +S315001FDDF042483AA3D901284488FB88F119608663F3 +S315001FDE0044482845D780A3D11505046546D3284520 +S315001FDE10D680D080020404A3F501F7066246A2D974 +S315001FDE20A3DB5BD366425AD1A2DBA3D9FEA3A3D140 +S315001FDE306642EB0188F389F1604344482845D78041 +S315001FDE40A3D11505046546D32845D680D080020484 +S315001FDE5004A3F501F7066246A2D9A3DB5BD366428C +S315001FDE605AD1A2DBA3D9FEA3A3D16642EB010F6051 +S315001FDE70D062A2D110600064B084A2DBCFFE204026 +S315001FDE80802B170000600461AE60584DC178FFFFFC +S315001FDE90016423FAF160026424FA2460306224606C +S315001FDEA02064A2DB66445ADB02645ADBFFFF2BFFAA +S315001FDEB0FAFE0F60E4620064A2DB5ADB3E643B425B +S315001FDEC05ADB2F58FFFF3F643B425ADB24606662D2 +S315001FDED01A604E64A2DB03644ADBFFFF04FF006483 +S315001FDEE053FB0F60E4620064A2DB5ADBBEFE2F58B1 +S315001FDEF0FFFF0F60E462A2D100600464B084A2DB5E +S315001FDF00CFFE2F58FFFF0F60E462A2D100600864A6 +S315001FDF10B084A2DBCFFE2F58FFFF79FBAC85604193 +S315001FDF202003016000630864E981CC840224DF8337 +S315001FDF30FB022C60E464A0DD65412C60E6630F6084 +S315001FDF40C064E98158D1FD04A3D90B0358D1E981D7 +S315001FDF506045FC04A3D16447B084BDDB00B96544AA +S315001FDF60F0022E58FFFFF260B378FFFF3C643B427E +S315001FDF705ADB2040902B0300F260B978FFFF53F362 +S315001FDF808AF104B007604064D0802103200626462C +S315001FDF908AF112604663C3837FF326F0BDDB6444B8 +S315001FDFA0007FBDDB6447007FBDDB32F0BDD933F098 +S315001FDFB0BDD934F0BDD900F40DF0BDD90EF0BDD9D1 +S315001FDFC000640FF0A3DB6447604500370300F2606F +S315001FDFD0B378FFFFBDDBE0A01F6100B8F807F703AA +S315001FDFE060FEDD81A1D0CC84A3D9DF83FA02654010 +S315001FDFF00126DF8320FE2D60A062A2DD60FEDD818B +S315001FE000A1D0FFFF6440013A0400DD81A1D0FFFFCC +S315001FE010C181DD81A1D0FFFF644003360300F2609A +S315001FE020B378FFFFD981A1D07FF3FFFFD08020FEF9 +S315001FE03008240300F260B378FFFF26463FF200F480 +S315001FE0406043F4A300601D610060806560FE81A1CE +S315001FE0507FA1020600F40361DD81A1D2CF83D480A4 +S315001FE0602D031703CF83614480A02803020200F407 +S315001FE0700361DD81A1D2CF8381A1200305077FA183 +S315001FE080CC84DD81E403F70100F400B80461E403E6 +S315001FE090F2010160FF634648414ADD81A1D0DF835B +S315001FE0A0A3D96444DD81A1D0DF83A3D9CC8481A108 +S315001FE0B005037FA1F70400F40361F40120FE00BBF2 +S315001FE0C002600061450360FEDD81A1D1FFFF644050 +S315001FE0D0003A3E00DD81A1D1FFFF6440603A38005F +S315001FE0E0DD81A1D1FFFF64401D3A3200DD81A1D33E +S315001FE0F0FFFF20FEFFB41C609665A5D3605C02A4DB +S315001FE100A5DBFEA51A60C66444D9007C60FEDD81CE +S315001FE110A1D1FFFF20FE1B600664C4826444FFB4C6 +S315001FE120A2DB126048658AF3FFFFC4826444A2D350 +S315001FE130FFB5D480FFFF02056544A2DB090020FE60 +S315001FE14028462A41FFB160FE8264A1DAFFFF20FE46 +S315001FE15026463FF200F46043F4A300601D61006091 +S315001FE160DD6560FE81A17FA1020600F40361DD81EA +S315001FE170A1D2CF83D4802D031703CF83614480A000 +S315001FE1802803020200F40361DD81A1D2CF8381A19E +S315001FE190200305077FA1CC84DD81E403F70100F48A +S315001FE1A000B80461E403F201026000634648414A75 +S315001FE1B0DD81A1D0DF83A3D96444DD81A1D0DF83B4 +S315001FE1C0A3D9CC8481A105037FA1F70400F40361C1 +S315001FE1D0F40120FE00BB026000610824A6002D602A +S315001FE1E09262A2DF2D609462A2DF2D609662A2DF8B +S315001FE1F02D609862A2DF60FEDD64A1DBDD81A1D305 +S315001FE200FFFFFAA4FFFF04349A01DD81A1D1FFFFAE +S315001FE2106440003A9401DD81A1D1FFFF6440503A6A +S315001FE2208E01DD81A1D1FFFF6440F23A8801DD81B5 +S315001FE230A1D1FFFF6440013ADC00DD81A1D1FFFFC0 +S315001FE2406440013AD600DD81A1D1FFFF6440003A48 +S315001FE250D000605C003639000064F260584E2B789F +S315001FE260FFFF65400826F7012D609262A2DB64401E +S315001FE27000363100DD81A1D3DD81F260584E2B7847 +S315001FE280FFFF65400826F5012D609462A2DB6440FE +S315001FE29000362700DD81A1D3DD81F260584E2B7831 +S315001FE2A0FFFF65400826F5012D609662A2DB6440DC +S315001FE2B000361D00DD81A1D12D609862A2D9DD81B6 +S315001FE2C0A1D12D609962A2D9180020FE2D609262FD +S315001FE2D000600464A2DB20FE2D609462006004646B +S315001FE2E0A2DB20FE2D60966200600264A2DB20FE88 +S315001FE2F02D60986200600064A2DB20FE026000654C +S315001FE3002D605A63D584DC84BDDB60416644634659 +S315001FE310CD83C781604560FE5D93A3D35D93A6DB66 +S315001FE320DE86FA1F6643654620FE20FE2D60A0622C +S315001FE330A2D1FFFF644300642D608A61A1DB2D60BB +S315001FE3407E62A2D12D609262A2D3FFFFA084FFFF3F +S315001FE35010260700042607002026070002260700AE +S315001FE3604800107C0500047C0300207C0100027C11 +S315001FE3702D608A61A1D950942D608C61A1DB2D601F +S315001FE3808061A1D12D609461A1D32D608A61A08483 +S315001FE390A1D1FFFF1026050004260500012608004F +S315001FE3A02800107C0600644010262300047C010010 +S315001FE3B0017C2D608C61A1D950942D608E61A1DBEB +S315001FE3C02D608261A1D12D609661A1D3FFFFA0842C +S315001FE3D060400226050004260500012605000900E7 +S315001FE3E0027C0300047C0100207C2D608E61A1D974 +S315001FE3F00D0050942D608A62A2DB2D608C62A2DB19 +S315001FE4002D608E62A2DB2D609062A2DB7C442D60A4 +S315001FE4108A61A1D1BDD92D608C61A1D1B084BDD92E +S315001FE4202D608E61A1D1B084BDD92D608461A1D12B +S315001FE430B084BDD9082868002760E862A2D3FFFF11 +S315001FE440FFA0FFFF0C24600060400B365D002040DC +S315001FE45010275A00880020FE006560FE2D609A6214 +S315001FE460A2DBE084E084082003000164A2DB0264CF +S315001FE47002A56444D49CD4802D609C620205086565 +S315001FE4804100A2D97C442D609E62A2DBDD81A1D111 +S315001FE49000656440003A0165DD81A1D1FFFF64403C +S315001FE4A0503A0165DD81A1D1FFFF6440F23A016553 +S315001FE4B0DD81A1D16540003A180000600065644007 +S315001FE4C00036016564400136026564400236046504 +S315001FE4D0644004361065644005362065655C2D6012 +S315001FE4E09E62A2D3FFFFB084A2DB2D609A62A2D3E5 +S315001FE4F00065FFA4A2DBCA022D609E62A2D32D6017 +S315001FE5009C62A2D12E58FFFF20FE8AF3FFFF3AA47A +S315001FE5108AFB3D643B425ADB89F37FF104A489FBE6 +S315001FE5201260226353F3644108B0E1851C03FEA108 +S315001FE53047D30206FBB4A3DBDD815BD30C240200A9 +S315001FE540FBB4A3DB5BD3DD8102BCA3DB0E65DD81E0 +S315001FE550D5805BD30805FBB4A3DBDD81D5805BD3F8 +S315001FE5600203FBB4A3DBFFFF20FE26463140202A11 +S315001FE57018003FF24765C484E88423FAF1600264F9 +S315001FE58024FA2460306224602064A2DB26445ADB0E +S315001FE59002645ADBFFFF2BFFFAFE006646462F5822 +S315001FE5A0FFFF26462F58FFFF16631C608C62006410 +S315001FE5B05ADBFE1F5BFB5CFB1C6092630264A3DBE2 +S315001FE5C01A60C6623E6300645ADBFE1F2E58FFFFA9 +S315001FE5D01C609862A2D30063F8A001A40303A2DB08 +S315001FE5E02E58FFFFA2DD1C609A62A2D1A2DD5AD36C +S315001FE5F0A2DDC08161440224FFFFE981E981E9812F +S315001FE600E9815AD3E981E883EB83EB83EB83EB85BF +S315001FE610D485C583A2DD1C608E626347007FA2DBA3 +S315001FE6202E58FFFF1C60A065A5DD1B604665614473 +S315001FE6302B4145DB60411B6086650AA3A3D12B4492 +S315001FE64044D91C60A065A5D3FFFF604300B9FFFF37 +S315001FE6504C0306A3BDD181F382F1D080BDD3220224 +S315001FE66083F3D080A3D11E02D080FFFF1B028AF343 +S315001FE67012604663C6A547D17FF3FFFFD080FFFF19 +S315001FE6800828FF6161431A60C6652B4444D11C608C +S315001FE6908E65A5D16444D0811C6092650105006119 +S315001FE6A0A5D315001A60C6652B4444D11C608E6520 +S315001FE6B06443A5D164656344C084D480FFFF02060A +S315001FE6C0006113006143D0811C609265A5D3E98167 +S315001FE6D0E981CC84CC8402030203E981E981E981C3 +S315001FE6E0E985D7846041010500611C60A065A5D33B +S315001FE6F0FFFF60432E58FFFF1C609465A5D15BF397 +S315001FE7006441CD81CD8102030203E884E884E88455 +S315001FE710E885294454892E58FFFFEDF31A60BE631E +S315001FE7200FB401A4E087E084E084BDDB1060586469 +S315001FE730BDDB0264BDDB0664A3DB246066621A6070 +S315001FE740BA64A2DB02644ADBFFFF04FF2E58FFFFF9 +S315001FE7501A60BE63EA606064BDDB10605864BDDB8F +S315001FE7600264BDDB0664A3DB246066621A60BA64BA +S315001FE770A2DB02644ADBFFFF04FF2E58FFFF16636E +S315001FE7801C608C6200645ADBFE1F5BFB5CFB1C601B +S315001FE79092630264A3DB1A60C6623E6300645ADB9F +S315001FE7A0FE1F10605662F460FD64A2DB10602C62CF +S315001FE7B0F460E964A2DB106002620064A2DB1060F1 +S315001FE7C0046200600464A2DBF360EA645ADBCFFED6 +S315001FE7D02F58FFFF204440260300F460BE78FFFF3A +S315001FE7E02040522307005AF3FFFF01A45AFBF4608F +S315001FE7F0AB78FFFF40600065204434801C60926543 +S315001FE8000264A5DB1A60C4627E6300645ADBFE1FC6 +S315001FE8101C609662A2DD8CF358FB02648CFBFFFF23 +S315001FE820C1FE8CF3FFFF00A8FFFF0B0310600462FD +S315001FE83080600064A2DBF46011645ADBCFFE2F58A0 +S315001FE840FFFF046453FB2960606454FB0F4EEC60AA +S315001FE850584F8978FFFF0E4F106002620064A2DBDB +S315001FE8601060046210600064A2DBF4603B645ADB34 +S315001FE870CFFE2F58FFFF58F38CFBCAFEC1FE1C604C +S315001FE880A2626644A2DB5ADD61445ADB67F5CCF10E +S315001FE89019F8F86080640EFAA9F107F8016060673D +S315001FE8A02CFA1D642DFA01642EFAEBF12FF8ECF108 +S315001FE8B030F8EDF131F881F132F882F133F883F156 +S315001FE8C034F808642AFA40633FFC00F40262CB83E3 +S315001FE8D000645ADAFE1F1C608E65A5D302FA196002 +S315001FE8E08864A0D10A6141D303FA066106630065F5 +S315001FE8F01B60866444D159D81B60466444D159D8DD +S315001FE9001A60C66444D159D81B60066444D159D8CD +S315001FE910654402A46045EC1F67F5246030622360DE +S315001FE920DE64A2DB66445ADB02645ADBFFFF2BFF61 +S315001FE9301C60A262A2D55AD35AD3604360410F60AE +S315001FE940EA62A2D100602064B084A2DBCFFEBF6062 +S315001FE950FF6520442480F360584EA878FFFF10609F +S315001FE96002620064A2DB1060046210600264A2DB14 +S315001FE970F360EA645ADBCFFE2F58FFFF1C60A463C7 +S315001FE9806644A3DB00604061AE60584DC178FFFF4F +S315001FE990664467FB046403FA1C60A463A3D1006486 +S315001FE9A06446A3DB0060406520443480F360584E04 +S315001FE9B08D78FFFF106002620064A2DB10600462A4 +S315001FE9C000600264A2DBF360EA645ADBCFFE2F58B5 +S315001FE9D0FFFF246066621A60BA64A2DB03644ADB27 +S315001FE9E0FFFF04FF106002620064A2DB5ADBFF60B8 +S315001FE9F09F65204424802F58FFFF10600262A2D11A +S313001FEA0000600264B084A2DBCFFE2F58FFFF1A +S705000F36684D diff --git a/workbench/devs/networks/prism2/firmware/LEGAL b/workbench/devs/networks/prism2/firmware/LEGAL new file mode 100644 index 0000000000..6160197864 --- /dev/null +++ b/workbench/devs/networks/prism2/firmware/LEGAL @@ -0,0 +1,40 @@ +The Hermes I and Hermes II firmware files are subject to the following +terms: + + COPYRIGHT © 1994 - 1995 by AT&T. All Rights Reserved + COPYRIGHT © 1996 - 2000 by Lucent Technologies. All Rights Reserved + COPYRIGHT © 2001 - 2004 by Agere Systems Inc. All Rights Reserved + All rights reserved. + + Redistribution and use in source or binary forms, with or without + modifications, are permitted provided that the following conditions are + met: + + . Redistributions of source code must retain the above copyright notice, + this list of conditions and the following Disclaimer as comments in the + code as well as in the documentation and/or other materials provided + with the distribution. + + . Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following Disclaimer in the + documentation and/or other materials provided with the distribution. + + . Neither the name of Agere Systems Inc. nor the names of the contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + Disclaimer + + THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, INFRINGEMENT AND THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. ANY + USE, MODIFICATION OR DISTRIBUTION OF THIS SOFTWARE IS SOLELY AT THE USERS + OWN RISK. IN NO EVENT SHALL AGERE SYSTEMS INC. OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, INCLUDING, BUT NOT LIMITED TO, + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + diff --git a/workbench/devs/networks/prism2/firmware/mmakefile.src b/workbench/devs/networks/prism2/firmware/mmakefile.src new file mode 100644 index 0000000000..f0336fdca0 --- /dev/null +++ b/workbench/devs/networks/prism2/firmware/mmakefile.src @@ -0,0 +1,10 @@ +# $Id$ + +include $(TOP)/config/make.cfg + +#MM- workbench-devs-networks-prism2 : workbench-devs-networks-prism2-firmware + +%copy_files_q mmake=workbench-devs-networks-prism2-firmware \ + files="HermesI HermesII" src=. dst=$(AROS_DEVS)/Firmware + +%common diff --git a/workbench/devs/networks/prism2/initializers.h b/workbench/devs/networks/prism2/initializers.h index 251340e79a..e7fbcae43f 100644 --- a/workbench/devs/networks/prism2/initializers.h +++ b/workbench/devs/networks/prism2/initializers.h @@ -34,7 +34,7 @@ MA 02111-1307, USA. #endif */ #define OFFSET(struct_name, struct_field) \ - ((IPTR)(&(((struct struct_name *)0)->struct_field))) + ((UPINT)(&(((struct struct_name *)0)->struct_field))) /* Use the following macros in the structure definition */ diff --git a/workbench/devs/networks/prism2/mmakefile.src b/workbench/devs/networks/prism2/mmakefile.src index d034a21764..b569dbc5e5 100644 --- a/workbench/devs/networks/prism2/mmakefile.src +++ b/workbench/devs/networks/prism2/mmakefile.src @@ -1,19 +1,11 @@ # $Id$ include $(TOP)/config/make.cfg -#MM- workbench-devs-networks-prism2 : \ -#MM workbench-devs-networks-prism2-cmd - USER_CFLAGS := -Wno-uninitialized -Wno-parentheses %build_prog mmake=workbench-devs-networks-prism2 \ progname="prism2.device" \ - files="startup aros_device device request unit pci prometheus pccard" \ + files="startup aros_device device request unit encryption pci prometheus pccard timer" \ targetdir="$(AROSDIR)/Devs/Networks" -%build_prog mmake=workbench-devs-networks-prism2-cmd \ - progname="SetPrism2Defaults" \ - files="startup SetPrism2Defaults" \ - targetdir="$(CONTRIBDIR)/Networking/Utils" - %common diff --git a/workbench/devs/networks/prism2/mos_device.c b/workbench/devs/networks/prism2/mos_device.c new file mode 100755 index 0000000000..12cb405854 --- /dev/null +++ b/workbench/devs/networks/prism2/mos_device.c @@ -0,0 +1,379 @@ +/* + +File: mos_device.c +Author: Neil Cafferkey +Copyright (C) 2000-2012 Neil Cafferkey + +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. + +*/ + + +#include +#include +#include +#include + +#include + +#include "device.h" + +#include "device_protos.h" + + +/* Private prototypes */ + +static struct DevBase *MOSDevInit(struct DevBase *dev_base, APTR seg_list, + struct DevBase *base); +static BYTE MOSDevOpen(); +static APTR MOSDevClose(); +static APTR MOSDevExpunge(); +static VOID MOSDevBeginIO(); +static VOID MOSDevAbortIO(); +static BOOL RXFunction(struct IOSana2Req *request, APTR buffer, ULONG size); +static BOOL TXFunction(APTR buffer, struct IOSana2Req *request, ULONG size); +static UBYTE *DMATXFunction(struct IOSana2Req *request); +static BOOL MOSInt(); + +extern const APTR init_data; +extern const struct Resident rom_tag; +extern const TEXT device_name[]; +extern const TEXT version_string[]; + + +static const TEXT openpci_name[] = "openpci.library"; + + +static const APTR mos_vectors[] = +{ + (APTR)FUNCARRAY_32BIT_NATIVE, + (APTR)MOSDevOpen, + (APTR)MOSDevClose, + (APTR)MOSDevExpunge, + (APTR)DevReserved, + (APTR)MOSDevBeginIO, + (APTR)MOSDevAbortIO, + (APTR)-1 +}; + + +static const APTR mos_init_table[] = +{ + (APTR)sizeof(struct DevBase), + (APTR)mos_vectors, + (APTR)&init_data, + (APTR)MOSDevInit +}; + + +static const struct TagItem query_tags[] = +{ + {QUERYINFOATTR_NAME, (UPINT)device_name}, + {QUERYINFOATTR_IDSTRING, (UPINT)version_string}, + {QUERYINFOATTR_DESCRIPTION, (UPINT)"Prism-II WLAN network driver"}, + {QUERYINFOATTR_COPYRIGHT, (UPINT)"2000-2012 Neil Cafferkey"}, + {QUERYINFOATTR_AUTHOR, (UPINT)"Neil Cafferkey"}, + {QUERYINFOATTR_DATE, (UPINT)DATE}, + {QUERYINFOATTR_VERSION, VERSION}, + {QUERYINFOATTR_REVISION, REVISION}, + {QUERYINFOATTR_CODETYPE, MACHINE_PPC}, + {QUERYINFOATTR_SUBTYPE, QUERYSUBTYPE_DEVICE}, + {QUERYINFOATTR_CLASS, QUERYCLASS_NET}, + {QUERYINFOATTR_NET_IPTYPE, 2048}, + {TAG_END, 0} +}; + + +const struct Resident mos_rom_tag = +{ + RTC_MATCHWORD, + (struct Resident *)&mos_rom_tag, + (APTR)(&rom_tag + 1), + RTF_AUTOINIT | RTF_PPC | RTF_EXTENDED, + VERSION, + NT_DEVICE, + 0, + (STRPTR)device_name, + (STRPTR)version_string, + (APTR)mos_init_table, + REVISION, + (struct TagItem *)&query_tags +}; + + +static const struct EmulLibEntry int_trap = +{ + TRAP_LIB, + 0, + (APTR)MOSInt +}; + + + +/****i* prism2.device/MOSDevInit ******************************************* +* +* NAME +* MOSDevInit +* +**************************************************************************** +* +*/ + +static struct DevBase *MOSDevInit(struct DevBase *dev_base, APTR seg_list, + struct DevBase *base) +{ + base = DevInit(dev_base, seg_list, base); + + if(base != NULL) + { + base->openpci_base = OpenLibrary(openpci_name, OPENPCI_VERSION); + base->wrapper_int_code = (APTR)&int_trap; + base->wrapper_card_code = (APTR)&int_trap; + } + return base; +} + + + +/****i* prism2.device/MOSDevOpen ******************************************* +* +* NAME +* MOSDevOpen +* +**************************************************************************** +* +*/ + +static BYTE MOSDevOpen() +{ + struct IOSana2Req *request; + struct Opener *opener; + BYTE error; + + request = (APTR)REG_A1; + error = DevOpen(request, REG_D0, REG_D1, (APTR)REG_A6); + + /* Set up wrapper hooks to hide 68k emulation */ + + if(error == 0) + { + opener = request->ios2_BufferManagement; + opener->real_rx_function = opener->rx_function; + opener->real_tx_function = opener->tx_function; + opener->rx_function = (APTR)RXFunction; + opener->tx_function = (APTR)TXFunction; + if(opener->dma_tx_function != NULL) + { + opener->real_dma_tx_function = opener->dma_tx_function; + opener->dma_tx_function = (APTR)DMATXFunction; + } + } + + return error; +} + + + +/****i* prism2.device/MOSDevClose ****************************************** +* +* NAME +* MOSDevClose +* +**************************************************************************** +* +*/ + +static APTR MOSDevClose() +{ + return DevClose((APTR)REG_A1, (APTR)REG_A6); +} + + + +/****i* prism2.device/MOSDevExpunge **************************************** +* +* NAME +* MOSDevExpunge +* +**************************************************************************** +* +*/ + +static APTR MOSDevExpunge() +{ + return DevExpunge((APTR)REG_A6); +} + + + +/****i* prism2.device/MOSDevBeginIO **************************************** +* +* NAME +* MOSDevBeginIO +* +**************************************************************************** +* +*/ + +static VOID MOSDevBeginIO() +{ + struct IOSana2Req *request = (APTR)REG_A1; + + /* Replace caller's cookie with our own */ + + switch(request->ios2_Req.io_Command) + { + case CMD_READ: + case CMD_WRITE: + case S2_MULTICAST: + case S2_BROADCAST: + case S2_READORPHAN: + request->ios2_StatData = request->ios2_Data; + request->ios2_Data = request; + } + + DevBeginIO(request, (APTR)REG_A6); + + return; +} + + + +/****i* prism2.device/MOSDevAbortIO **************************************** +* +* NAME +* MOSDevAbortIO -- Try to stop a request. +* +**************************************************************************** +* +*/ + +static VOID MOSDevAbortIO() +{ + DevAbortIO((APTR)REG_A1, (APTR)REG_A6); +} + + + +/****i* prism2.device/RXFunction ******************************************* +* +* NAME +* RXFunction +* +**************************************************************************** +* +*/ + +static BOOL RXFunction(struct IOSana2Req *request, APTR buffer, ULONG size) +{ + struct DevBase *base; + struct EmulCaos context; + struct Opener *opener; + APTR cookie; + + base = (struct DevBase *)request->ios2_Req.io_Device; + opener = request->ios2_BufferManagement; + cookie = request->ios2_StatData; + request->ios2_Data = cookie; + + context.caos_Un.Function = (APTR)opener->real_rx_function; + context.reg_a0 = (ULONG)cookie; + context.reg_a1 = (ULONG)buffer; + context.reg_d0 = size; + return MyEmulHandle->EmulCall68k(&context); +} + + + +/****i* prism2.device/TXFunction ******************************************* +* +* NAME +* TXFunction +* +**************************************************************************** +* +*/ + +static BOOL TXFunction(APTR buffer, struct IOSana2Req *request, ULONG size) +{ + struct DevBase *base; + struct EmulCaos context; + struct Opener *opener; + APTR cookie; + + base = (struct DevBase *)request->ios2_Req.io_Device; + opener = request->ios2_BufferManagement; + cookie = request->ios2_StatData; + request->ios2_Data = cookie; + + context.caos_Un.Function = (APTR)opener->real_tx_function; + context.reg_a0 = (ULONG)buffer; + context.reg_a1 = (ULONG)cookie; + context.reg_d0 = size; + return MyEmulHandle->EmulCall68k(&context); +} + + + +/****i* prism2.device/DMATXFunction **************************************** +* +* NAME +* DMATXFunction +* +**************************************************************************** +* +*/ + +static UBYTE *DMATXFunction(struct IOSana2Req *request) +{ + struct DevBase *base; + struct EmulCaos context; + struct Opener *opener; + APTR cookie; + + base = (struct DevBase *)request->ios2_Req.io_Device; + opener = request->ios2_BufferManagement; + cookie = request->ios2_StatData; + request->ios2_Data = cookie; + + context.caos_Un.Function = (APTR)opener->real_dma_tx_function; + context.reg_a0 = (ULONG)cookie; + return (UBYTE *)MyEmulHandle->EmulCall68k(&context); +} + + + +/****i* prism2.device/MOSInt *********************************************** +* +* NAME +* MOSInt +* +**************************************************************************** +* +*/ + +static BOOL MOSInt() +{ + APTR *int_data; + BOOL (*int_code)(APTR, APTR); + + int_data = (APTR)REG_A1; + int_code = int_data[0]; + return int_code(int_data[1], int_code); +} + + + diff --git a/workbench/devs/networks/prism2/openpci.c b/workbench/devs/networks/prism2/openpci.c new file mode 100755 index 0000000000..9ea078f201 --- /dev/null +++ b/workbench/devs/networks/prism2/openpci.c @@ -0,0 +1,288 @@ +/* + +Copyright (C) 2004-2012 Neil Cafferkey + +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. + +*/ + + +#include +#include + +#include +#include + +#include "pci.h" +#include "plx9052.h" +#include "prism2.h" + +#include "pci_protos.h" +#include "openpci_protos.h" +#include "timer_protos.h" + + +/****i* prism2.device/GetOpenPCICount ************************************** +* +* NAME +* GetOpenPCICount +* +* SYNOPSIS +* count = GetOpenPCICount() +* +* ULONG GetOpenPCICount(); +* +**************************************************************************** +* +*/ + +ULONG GetOpenPCICount(struct DevBase *base) +{ + ULONG count = 0; + struct pci_dev *card = NULL; + UWORD vendor_id, product_id; + + while((card = pci_find_device(0xffff, 0xffff, card)) != NULL) + { + product_id = pci_read_config_word(PCI_DEVICE_ID, card); + vendor_id = pci_read_config_word(PCI_VENDOR_ID, card); + if(IsCardCompatible(vendor_id, product_id, base)) + count++; + } + + return count; +} + + + +/****i* prism2.device/AllocOpenPCICard ************************************* +* +* NAME +* AllocOpenPCICard -- Create a unit. +* +* SYNOPSIS +* context = AllocOpenPCICard(index) +* +* struct BusContext *AllocOpenPCICard(ULONG); +* +**************************************************************************** +* +*/ + +struct BusContext *AllocOpenPCICard(ULONG index, struct DevBase *base) +{ + BOOL success = TRUE; + struct BusContext *context; + struct pci_dev *card = NULL; + UWORD i = 0, vendor_id, product_id, io_range_no; + ULONG value; + UPINT io_reg, int_reg; + volatile UBYTE *cor_reg; + + /* Find a compatible card */ + + context = AllocMem(sizeof(struct BusContext), MEMF_PUBLIC | MEMF_CLEAR); + if(context == NULL) + success = FALSE; + + if(success) + { + while(i <= index) + { + card = pci_find_device(0xffff, 0xffff, card); + product_id = pci_read_config_word(PCI_DEVICE_ID, card); + vendor_id = pci_read_config_word(PCI_VENDOR_ID, card); + if(IsCardCompatible(vendor_id, product_id, base)) + i++; + } + + context->card = card; + if(card == NULL) + success = FALSE; + } + + if(success) + { + /* Find out what type of Prism II PCI card this is */ + + context->bus_type = GetBusType(product_id, base); + pci_write_config_word(PCI_COMMAND, + PCI_COMMAND_MEMORY | PCI_COMMAND_IO, card); + + if(context->bus_type == TMD_BUS) + { + /* Reset and enable the PCCard */ + + io_reg = (UPINT)card->base_address[1]; + BYTEOUT(io_reg, COR_RESET); + BusyMilliDelay(RESET_DELAY, base); + BYTEOUT(io_reg, COR_ENABLE); + BusyMilliDelay(RESET_DELAY, base); + io_range_no = 2; + } + else if(context->bus_type == PLX_BUS) + { + /* Reset and enable the PCCard */ + + cor_reg = (volatile UBYTE *)card->base_address[2] + 0x3e0; + *cor_reg = COR_ENABLE; + BusyMilliDelay(RESET_DELAY, base); + + /* Enable interrupts on the bridge */ + + int_reg = (UPINT)card->base_address[1] + PLX9052_INTS; + value = LONGIN(int_reg); + LONGOUT(int_reg, value | (1 << 6)); + if((LONGIN(int_reg) & (1 << 6)) == 0) + success = FALSE; + io_range_no = 3; + } + else + io_range_no = 0; + + /* Get the I/O base of the wireless chip */ + + context->have_card = TRUE; + context->io_base = (UPINT)card->base_address[io_range_no]; + + if(context->bus_type == PCI_BUS) + { + /* Reset and enable the card */ + + cor_reg = (volatile UBYTE *)context->io_base + (P2_REG_PCICOR * 2); + *cor_reg = COR_RESET; + BusyMilliDelay(250, base); + *cor_reg = 0; + BusyMilliDelay(500, base); + } + } + + if(!success) + { + FreeOpenPCICard(context, base); + context = NULL; + } + + return context; +} + + + +/****i* prism2.device/FreeOpenPCICard ************************************** +* +* NAME +* FreeOpenPCICard +* +* SYNOPSIS +* FreeOpenPCICard(context) +* +* VOID FreeOpenPCICard(struct BusContext *); +* +**************************************************************************** +* +*/ + +VOID FreeOpenPCICard(struct BusContext *context, struct DevBase *base) +{ + struct pci_dev *card; + + ULONG value; + UPINT io_reg, int_reg; + volatile UBYTE *cor_reg; + + if(context != NULL) + { + card = context->card; + if(card != NULL) + { + if(context->bus_type == TMD_BUS) + { + /* Disable the PCCard */ + + io_reg = (UPINT)card->base_address[1]; + BYTEOUT(io_reg, 0); + } + else if(context->bus_type == PLX_BUS) + { + /* Disable interrupts on the bridge */ + + int_reg = (UPINT)card->base_address[1] + PLX9052_INTS; + value = LONGIN(int_reg); + LONGOUT(int_reg, value & ~(1 << 6)); + + /* Disable the PCCard */ + + cor_reg = (volatile UBYTE *)card->base_address[2] + 0x3e0; + *cor_reg = COR_RESET; + BusyMilliDelay(250, base); + *cor_reg = 0; + } + + FreeMem(context, sizeof(struct BusContext)); + } + } + + return; +} + + + +/****i* prism2.device/AddOpenPCIIntServer ********************************** +* +* NAME +* AddOpenPCIIntServer +* +* SYNOPSIS +* success = AddOpenPCIIntServer(card, interrupt) +* +* BOOL AddOpenPCIIntServer(APTR, struct Interrupt *); +* +**************************************************************************** +* +*/ + +BOOL AddOpenPCIIntServer(APTR card, struct Interrupt *interrupt, + struct DevBase *base) +{ + return pci_add_intserver(interrupt, card); +} + + + +/****i* prism2.device/RemOpenPCIIntServer ********************************** +* +* NAME +* RemOpenPCIIntServer +* +* SYNOPSIS +* RemOpenPCIIntServer(card, interrupt) +* +* VOID RemOpenPCIIntServer(APTR, struct Interrupt *); +* +**************************************************************************** +* +*/ + +VOID RemOpenPCIIntServer(APTR card, struct Interrupt *interrupt, + struct DevBase *base) +{ + pci_rem_intserver(interrupt, card); + + return; +} + + + diff --git a/workbench/devs/networks/prism2/prometheus_protos.h b/workbench/devs/networks/prism2/openpci_protos.h old mode 100644 new mode 100755 similarity index 64% copy from workbench/devs/networks/prism2/prometheus_protos.h copy to workbench/devs/networks/prism2/openpci_protos.h index 62eb6b7e44..f86bb9bbb4 --- a/workbench/devs/networks/prism2/prometheus_protos.h +++ b/workbench/devs/networks/prism2/openpci_protos.h @@ -1,7 +1,5 @@ /* -File: prometheus_protos.h -Author: Neil Cafferkey Copyright (C) 2005 Neil Cafferkey This program is free software; you can redistribute it and/or modify @@ -21,18 +19,18 @@ MA 02111-1307, USA. */ -#ifndef PROMETHEUS_PROTOS_H -#define PROMETHEUS_PROTOS_H +#ifndef OPENPCI_PROTOS_H +#define OPENPCI_PROTOS_H #include "device.h" -ULONG GetPrometheusCount(struct DevBase *base); -struct BusContext *AllocPrometheusCard(ULONG index, struct DevBase *base); -VOID FreePrometheusCard(struct BusContext *context, struct DevBase *base); -BOOL AddPrometheusIntServer(APTR card, struct Interrupt *interrupt, +ULONG GetOpenPCICount(struct DevBase *base); +struct BusContext *AllocOpenPCICard(ULONG index, struct DevBase *base); +VOID FreeOpenPCICard(struct BusContext *context, struct DevBase *base); +BOOL AddOpenPCIIntServer(APTR card, struct Interrupt *interrupt, struct DevBase *base); -VOID RemPrometheusIntServer(APTR card, struct Interrupt *interrupt, +VOID RemOpenPCIIntServer(APTR card, struct Interrupt *interrupt, struct DevBase *base); #endif diff --git a/workbench/devs/networks/prism2/os4_device.c b/workbench/devs/networks/prism2/os4_device.c new file mode 100755 index 0000000000..f250df5038 --- /dev/null +++ b/workbench/devs/networks/prism2/os4_device.c @@ -0,0 +1,608 @@ +/* + +Copyright (C) 2000-2008 Neil Cafferkey + +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. + +*/ + + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "device.h" + +#include "device_protos.h" +#include "unit_protos.h" +#include "pci_protos.h" +#include "request_protos.h" + + +/* Private prototypes */ + +static struct DevBase *OS4DevInit(struct DevBase *dev_base, APTR seg_list, + struct ExecIFace *i_exec); +static ULONG IfaceObtain(struct Interface *self); +static ULONG IfaceRelease(struct Interface *self); +static LONG OS4DevOpen(struct Interface *self, struct IOSana2Req *request, + ULONG unit_num, ULONG flags); +static APTR OS4DevClose(struct Interface *self, struct IOSana2Req *request); +static APTR OS4DevExpunge(struct Interface *self); +static VOID OS4DevBeginIO(struct Interface *self, + struct IOSana2Req *request); +static VOID OS4DevAbortIO(struct Interface *self, + struct IOSana2Req *request); +static VOID DeleteDevice(struct DevBase *base); +static BOOL RXFunction(struct IOSana2Req *request, APTR buffer, ULONG size); +static BOOL TXFunction(APTR buffer, struct IOSana2Req *request, ULONG size); +static UBYTE *DMATXFunction(struct IOSana2Req *request); +static ULONG OS4Int(struct ExceptionContext ex_context, + struct ExecBase *sys_base, APTR *int_data); + + +extern const TEXT device_name[]; +extern const TEXT version_string[]; +extern const TEXT utility_name[]; +extern const TEXT pccard_name[]; +extern const TEXT card_name[]; +extern const TEXT dos_name[]; +extern const TEXT timer_name[]; +extern const struct Resident rom_tag; + +static const TEXT manager_name[] = "__device"; +static const TEXT expansion_name[] = EXPANSIONNAME; + + +static const APTR manager_vectors[] = +{ + (APTR)IfaceObtain, + (APTR)IfaceRelease, + (APTR)NULL, + (APTR)NULL, + (APTR)OS4DevOpen, + (APTR)OS4DevClose, + (APTR)OS4DevExpunge, + (APTR)NULL, + (APTR)OS4DevBeginIO, + (APTR)OS4DevAbortIO, + (APTR)-1 +}; + + +static const struct TagItem manager_tags[] = +{ + {MIT_Name, (UPINT)manager_name}, + {MIT_VectorTable, (UPINT)manager_vectors}, + {MIT_Version, 1}, + {TAG_END, 0} +}; + + +static const struct TagItem *interfaces[] = +{ + manager_tags, + NULL +}; + + +static const struct TagItem init_tags[] = +{ + {CLT_DataSize, sizeof(struct DevBase)}, + {CLT_InitFunc, (UPINT)OS4DevInit}, + {CLT_Interfaces, (UPINT)interfaces}, + {TAG_END, 0} +}; + + +const struct Resident os4_rom_tag = +{ + RTC_MATCHWORD, + (struct Resident *)&os4_rom_tag, + (APTR)(&rom_tag + 1), + RTF_AUTOINIT | RTF_NATIVE, + VERSION, + NT_DEVICE, + 0, + (STRPTR)device_name, + (STRPTR)version_string, + (APTR)init_tags +}; + + +static const ULONG rx_tags[] = +{ + S2_CopyToBuff, + S2_CopyToBuff16, +}; + + +static const ULONG tx_tags[] = +{ + S2_CopyFromBuff, + S2_CopyFromBuff16, + S2_CopyFromBuff32 +}; + + + +/****i* prism2.device/OS4DevInit ******************************************* +* +* NAME +* OS4DevInit +* +* SYNOPSIS +* dev_base = OS4DevInit(dev_base, seg_list, i_exec) +* +* struct DevBase *OS4DevInit(struct DevBase *, APTR, ExecIFace *); +* +**************************************************************************** +* +*/ + +static struct DevBase *OS4DevInit(struct DevBase *dev_base, APTR seg_list, + struct ExecIFace *i_exec) +{ + struct DevBase *base; + BOOL success = TRUE; + + dev_base->i_exec = i_exec; + base = dev_base; + base->seg_list = seg_list; + base->sys_base = (APTR)i_exec->Data.LibBase; + + base->device.dd_Library.lib_Node.ln_Type = NT_DEVICE; + base->device.dd_Library.lib_Node.ln_Name = (TEXT *)device_name; + base->device.dd_Library.lib_Flags = LIBF_SUMUSED | LIBF_CHANGED; + base->device.dd_Library.lib_Version = VERSION; + base->device.dd_Library.lib_Revision = REVISION; + base->device.dd_Library.lib_IdString = (TEXT *)version_string; + + base->utility_base = (APTR)OpenLibrary(utility_name, UTILITY_VERSION); + base->expansion_base = OpenLibrary(expansion_name, EXPANSION_VERSION); + base->dos_base = (APTR)OpenLibrary(dos_name, DOS_VERSION); + if(base->utility_base == NULL || base->expansion_base == NULL + || base->dos_base == NULL) + success = FALSE; + base->pccard_base = (APTR)OpenLibrary(pccard_name, PCCARD_VERSION); + if(base->pccard_base != NULL) + base->card_base = (APTR)OpenResource(card_name); + + if(OpenDevice(timer_name, UNIT_VBLANK, (APTR)&base->timer_request, 0) != + 0) + success = FALSE; + + NewList((APTR)(&dev_base->pci_units)); + NewList((APTR)(&dev_base->pccard_units)); + base->wrapper_int_code = (APTR)OS4Int; + + if(success) + { + base->i_utility = + (APTR)GetInterface((APTR)UtilityBase, "main", 1, NULL); + base->i_pci = (APTR)GetInterface(ExpansionBase, "pci", 1, NULL); + base->i_dos = (APTR)GetInterface((APTR)DOSBase, "main", 1, NULL); + if(CardResource != NULL) + { + base->i_pccard = + (APTR)GetInterface(PCCardBase, "main", 1, NULL); + base->i_card = + (APTR)GetInterface(CardResource, "main", 1, NULL); +// if(base->i_pccard == NULL || base->i_card == NULL) + if(base->i_card == NULL) + success = FALSE; + } + base->i_timer = (APTR)GetInterface((APTR)TimerBase, "main", 1, NULL); + if(base->i_utility == NULL || base->i_dos == NULL + || base->i_timer == NULL) + success = FALSE; + } + + if(!success) + { + DeleteDevice(base); + base = NULL; + } + + return base; +} + + + +/****i* prism2.device/IfaceObtain ****************************************** +* +* NAME +* IfaceObtain +* +* SYNOPSIS +* ref_count = IfaceObtain(self) +* +* ULONG IfaceObtain(struct Interface *); +* +**************************************************************************** +* +*/ + +static ULONG IfaceObtain(struct Interface *self) +{ + return self->Data.RefCount++; +} + + + +/****i* prism2.device/IfaceRelease ***************************************** +* +* NAME +* IfaceRelease +* +* SYNOPSIS +* ref_count = IfaceRelease(self) +* +* ULONG IfaceRelease(struct Interface *); +* +**************************************************************************** +* +*/ + +static ULONG IfaceRelease(struct Interface *self) +{ + return --self->Data.RefCount; +} + + + +/****i* prism2.device/OS4DevOpen ******************************************* +* +* NAME +* OS4DevOpen +* +* SYNOPSIS +* error = OS4DevOpen(self, request, unit_num, +* flags) +* +* LONG OS4DevOpen(struct Interface *, struct IOSana2Req *, ULONG, +* ULONG); +* +**************************************************************************** +* +*/ + +static LONG OS4DevOpen(struct Interface *self, struct IOSana2Req *request, + ULONG unit_num, ULONG flags) +{ + struct Opener *opener; + BYTE error; + + error = DevOpen(request, unit_num, flags, (APTR)self->Data.LibBase); + + /* Set up wrapper hooks to hide 68k emulation */ + + if(error == 0) + { + opener = request->ios2_BufferManagement; + opener->real_rx_function = opener->rx_function; + opener->real_tx_function = opener->tx_function; + opener->rx_function = (APTR)RXFunction; + opener->tx_function = (APTR)TXFunction; + if(opener->dma_tx_function != NULL) + { + opener->real_dma_tx_function = opener->dma_tx_function; + opener->dma_tx_function = (APTR)DMATXFunction; + } + } + + return error; +} + + + +/****i* prism2.device/OS4DevClose ****************************************** +* +* NAME +* OS4DevClose +* +* SYNOPSIS +* seg_list = OS4DevClose(request) +* +* APTR OS4DevClose(struct IOSana2Req *); +* +**************************************************************************** +* +*/ + +static APTR OS4DevClose(struct Interface *self, struct IOSana2Req *request) +{ + struct DevBase *base; + APTR seg_list = NULL; + + /* Close the unit */ + + base = (APTR)self->Data.LibBase; + CloseUnit(request, base); + + /* Expunge the device if a delayed expunge is pending */ + + if(base->device.dd_Library.lib_OpenCnt == 0) + { + if((base->device.dd_Library.lib_Flags & LIBF_DELEXP) != 0) + seg_list = OS4DevExpunge(self); + } + + return seg_list; +} + + + +/****i* prism2.device/OS4DevExpunge **************************************** +* +* NAME +* OS4DevExpunge +* +* SYNOPSIS +* seg_list = OS4DevExpunge() +* +* APTR OS4DevExpunge(VOID); +* +**************************************************************************** +* +*/ + +static APTR OS4DevExpunge(struct Interface *self) +{ + struct DevBase *base; + APTR seg_list; + + base = (APTR)self->Data.LibBase; + if(base->device.dd_Library.lib_OpenCnt == 0) + { + seg_list = base->seg_list; + Remove((APTR)base); + DeleteDevice(base); + } + else + { + base->device.dd_Library.lib_Flags |= LIBF_DELEXP; + seg_list = NULL; + } + + return seg_list; +} + + + +/****i* prism2.device/OS4DevBeginIO **************************************** +* +* NAME +* OS4DevBeginIO +* +* SYNOPSIS +* OS4DevBeginIO(request) +* +* VOID OS4DevBeginIO(struct IORequest *); +* +**************************************************************************** +* +*/ + +static VOID OS4DevBeginIO(struct Interface *self, + struct IOSana2Req *request) +{ + /* Replace caller's cookie with our own */ + + request->ios2_Req.io_Error = 0; + switch(request->ios2_Req.io_Command) + { + case CMD_READ: + case CMD_WRITE: + case S2_MULTICAST: + case S2_BROADCAST: + case S2_READORPHAN: + request->ios2_StatData = request->ios2_Data; + request->ios2_Data = request; + } + + /* Send request for processing */ + + DevBeginIO(request, (APTR)self->Data.LibBase); + + return; +} + + + +/****i* prism2.device/OS4DevAbortIO **************************************** +* +* NAME +* OS4DevAbortIO -- Try to stop a request. +* +* SYNOPSIS +* OS4DevAbortIO(request) +* +* VOID OS4DevAbortIO(struct IOSana2Req *); +* +**************************************************************************** +* +* Disable() used instead of a semaphore because device uses interrupts. +* +*/ + +static VOID OS4DevAbortIO(struct Interface *self, + struct IOSana2Req *request) +{ + DevAbortIO(request, (APTR)self->Data.LibBase); + + return; +} + + + +/****i* prism2.device/DeleteDevice ***************************************** +* +* NAME +* DeleteDevice +* +* SYNOPSIS +* DeleteDevice() +* +* VOID DeleteDevice(VOID); +* +**************************************************************************** +* +*/ + +static VOID DeleteDevice(struct DevBase *base) +{ + /* Close interfaces */ + + DropInterface((APTR)base->i_timer); + DropInterface((APTR)base->i_card); + DropInterface((APTR)base->i_pccard); + DropInterface((APTR)base->i_dos); + DropInterface((APTR)base->i_pci); + DropInterface((APTR)base->i_utility); + + /* Close devices */ + + CloseDevice((APTR)&base->timer_request); + + /* Close libraries */ + + if(base->pccard_base != NULL) + CloseLibrary(base->pccard_base); + if(base->dos_base != NULL) + CloseLibrary((APTR)base->dos_base); + if(base->expansion_base != NULL) + CloseLibrary(base->expansion_base); + if(base->utility_base != NULL) + CloseLibrary((APTR)base->utility_base); + + /* Free device's memory */ + + DeleteLibrary((APTR)base); + + return; +} + + + +/****i* prism2.device/RXFunction ******************************************* +* +* NAME +* RXFunction +* +**************************************************************************** +* +*/ + +static BOOL RXFunction(struct IOSana2Req *request, APTR buffer, ULONG size) +{ + struct DevBase *base; + struct Opener *opener; + APTR cookie; + + opener = request->ios2_BufferManagement; + cookie = request->ios2_StatData; + base = (struct DevBase *)request->ios2_Req.io_Device; + request->ios2_Data = cookie; + + return EmulateTags(opener->real_rx_function, + ET_RegisterA0, cookie, ET_RegisterA1, buffer, + ET_RegisterD0, size, TAG_END); +} + + + +/****i* prism2.device/TXFunction ******************************************* +* +* NAME +* TXFunction +* +**************************************************************************** +* +*/ + +static BOOL TXFunction(APTR buffer, struct IOSana2Req *request, ULONG size) +{ + struct DevBase *base; + struct Opener *opener; + APTR cookie; + + opener = request->ios2_BufferManagement; + cookie = request->ios2_StatData; + base = (struct DevBase *)request->ios2_Req.io_Device; + request->ios2_Data = cookie; + return EmulateTags(opener->real_tx_function, + ET_RegisterA0, buffer, ET_RegisterA1, cookie, + ET_RegisterD0, size, TAG_END); +} + + + +/****i* prism2.device/DMATXFunction **************************************** +* +* NAME +* DMATXFunction +* +**************************************************************************** +* +*/ + +static UBYTE *DMATXFunction(struct IOSana2Req *request) +{ + struct DevBase *base; + struct Opener *opener; + APTR cookie; + + opener = request->ios2_BufferManagement; + cookie = request->ios2_StatData; + base = (struct DevBase *)request->ios2_Req.io_Device; + request->ios2_Data = cookie; + return (UBYTE *)EmulateTags(opener->real_dma_tx_function, + ET_RegisterA0, cookie, TAG_END); +} + + + +/****i* prism2.device/OS4Int *********************************************** +* +* NAME +* OS4Int +* +**************************************************************************** +* +*/ + +static ULONG OS4Int(struct ExceptionContext ex_context, + struct ExecBase *sys_base, APTR *int_data) +{ + BOOL (*int_code)(APTR, APTR, UBYTE); + + int_code = int_data[0]; + return int_code(int_data[1], int_code, 0x4); +} + + + diff --git a/workbench/devs/networks/prism2/pccard.c b/workbench/devs/networks/prism2/pccard.c index dcf8b521eb..61cedb887d 100644 --- a/workbench/devs/networks/prism2/pccard.c +++ b/workbench/devs/networks/prism2/pccard.c @@ -1,8 +1,6 @@ /* -File: pccard.c -Author: Neil Cafferkey -Copyright (C) 2000-2006 Neil Cafferkey +Copyright (C) 2000-2010 Neil Cafferkey 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 @@ -208,7 +206,7 @@ struct DevUnit *GetPCCardUnit(ULONG index, struct DevBase *base) * FindPCCardUnit -- Find a unit by number. * * SYNOPSIS -* unit = FindPCCardUnit(unit_num) +* unit = FindPCCardUnit(index) * * struct DevUnit *FindPCCardUnit(ULONG); * @@ -425,7 +423,7 @@ static struct BusContext *AllocCard(struct DevBase *base) && WrapCardInt(card_status_int, base))) success = FALSE; } - + if(success) { if(OwnCard(card_handle) != 0) @@ -618,7 +616,8 @@ static BOOL InitialiseCard(struct BusContext *context, { config_value = GetTagData(PCCARD_ModeNo, 0, tuple_tags); - io_bases = (APTR)GetTagData(PCCARD_IOWinBases, 0, tuple_tags); + io_bases = + (APTR)GetTagData(PCCARD_IOWinBases, (UPINT)NULL, tuple_tags); if(io_bases == NULL) success = FALSE; } @@ -627,7 +626,8 @@ static BOOL InitialiseCard(struct BusContext *context, if(success) { - io_lengths = (APTR)GetTagData(PCCARD_IOWinLengths, 0, tuple_tags); + io_lengths = + (APTR)GetTagData(PCCARD_IOWinLengths, (UPINT)NULL, tuple_tags); window_count = GetTagData(PCCARD_IOWinCount, 0, tuple_tags); @@ -723,9 +723,9 @@ static BOOL CardInsertedHook(struct BusContext *context, * CardRemovedInt * * SYNOPSIS -* CardRemovedInt(unit) +* CardRemovedInt(context) * -* VOID CardRemovedInt(struct DevUnit *); +* VOID CardRemovedInt(struct BusContext *); * **************************************************************************** * @@ -762,9 +762,9 @@ static VOID CardRemovedInt(REG(a1, struct BusContext *context), * CardInsertedInt * * SYNOPSIS -* CardInsertedInt(unit) +* CardInsertedInt(context) * -* VOID CardInsertedInt(struct DevUnit *); +* VOID CardInsertedInt(struct BusContext *); * **************************************************************************** * @@ -794,9 +794,9 @@ static VOID CardInsertedInt(REG(a1, struct BusContext *context), * CardStatusInt * * SYNOPSIS -* mask = CardStatusInt(mask, unit) +* mask = CardStatusInt(context, int_code, mask) * -* UBYTE CardStatusInt(UBYTE mask, struct DevUnit *); +* UBYTE CardStatusInt(struct BusContext *, APTR, UBYTE); * **************************************************************************** * @@ -808,7 +808,6 @@ static VOID CardInsertedInt(REG(a1, struct BusContext *context), static UBYTE CardStatusInt(REG(a1, struct BusContext *context), REG(a6, APTR int_code), REG(d0, UBYTE mask)) { -#if defined(__mc68000) && !defined(__AROS__) if(context->resource_version < 39) { /* Work around gayle interrupt bug */ @@ -816,7 +815,6 @@ static UBYTE CardStatusInt(REG(a1, struct BusContext *context), *((volatile UBYTE *)0xda9000) = (mask ^ 0x2c) | 0xc0; mask = 0; } -#endif if(context->unit != NULL) StatusInt(context->unit, StatusInt); diff --git a/workbench/devs/networks/prism2/pccard_protos.h b/workbench/devs/networks/prism2/pccard_protos.h index 608e09c72c..d152915f3c 100644 --- a/workbench/devs/networks/prism2/pccard_protos.h +++ b/workbench/devs/networks/prism2/pccard_protos.h @@ -1,7 +1,5 @@ /* -File: pccard_protos.h -Author: Neil Cafferkey Copyright (C) 2004 Neil Cafferkey This program is free software; you can redistribute it and/or modify diff --git a/workbench/devs/networks/prism2/pci.c b/workbench/devs/networks/prism2/pci.c index d91752e93d..4680e1c630 100644 --- a/workbench/devs/networks/prism2/pci.c +++ b/workbench/devs/networks/prism2/pci.c @@ -1,8 +1,6 @@ /* -File: pci.c -Author: Neil Cafferkey -Copyright (C) 2004,2005 Neil Cafferkey +Copyright (C) 2004-2012 Neil Cafferkey 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 @@ -33,18 +31,11 @@ MA 02111-1307, USA. #include "pci_protos.h" #include "device_protos.h" -#if !(defined(__MORPHOS__) || defined(__amigaos4__)) #include "prometheus_protos.h" -#endif -#if defined(__mc68000) && !defined(__AROS__) #include "powerpci_protos.h" -#endif -#ifdef __amigaos4__ +#include "cybpci_protos.h" #include "expansion_protos.h" -#endif -#ifdef __MORPHOS__ #include "openpci_protos.h" -#endif #include "unit_protos.h" @@ -79,6 +70,7 @@ static UWORD LEWordInIOHook(struct BusContext *context, ULONG offset); static VOID LEWordOutIOHook(struct BusContext *context, ULONG offset, UWORD value); + const UWORD product_codes[] = { 0x10b7, 0x7770, @@ -145,6 +137,8 @@ ULONG GetPCICount(struct DevBase *base) #if defined(__mc68000) && !defined(__AROS__) if(base->powerpci_base != NULL) count = GetPowerPCICount(base); + if(base->cybpci_base != NULL) + count = GetCybPCICount(base); #endif #ifdef __amigaos4__ if(base->expansion_base != NULL) @@ -283,9 +277,26 @@ static struct DevUnit *CreatePCIUnit(ULONG index, struct DevBase *base) if(!(WrapInt(&unit->status_int, base) && WrapInt(&unit->rx_int, base) && WrapInt(&unit->tx_int, base) - && WrapInt(&unit->info_int, base))) + && WrapInt(&unit->info_int, base) + && WrapInt(&unit->reset_handler, base))) + success = FALSE; + } + + /* Add hardware interrupt and reset handler */ + + if(success) + { + if(AddPCIIntServer(context->card, &unit->status_int, base)) + unit->flags |= UNITF_INTADDED; + else success = FALSE; - success = AddPCIIntServer(context->card, &unit->status_int, base); + +#if defined(__amigaos4__) || defined(__AROS__) + if(AddResetCallback(&unit->reset_handler)) + unit->flags |= UNITF_RESETADDED; + else + success = FALSE; +#endif } if(!success) @@ -333,7 +344,13 @@ VOID DeletePCIUnit(struct DevUnit *unit, struct DevBase *base) if(unit != NULL) { context = unit->card; - RemPCIIntServer(context->card, &unit->status_int, base); +#if defined(__amigaos4__) || defined(__AROS__) + if((unit->flags & UNITF_RESETADDED) != 0) + RemResetCallback(&unit->reset_handler); +#endif + if((unit->flags & UNITF_INTADDED) != 0) + RemPCIIntServer(context->card, &unit->status_int, base); + UnwrapInt(&unit->reset_handler, base); UnwrapInt(&unit->info_int, base); UnwrapInt(&unit->tx_int, base); UnwrapInt(&unit->rx_int, base); @@ -372,6 +389,8 @@ static struct BusContext *AllocCard(ULONG index, struct DevBase *base) #if defined(__mc68000) && !defined(__AROS__) if(base->powerpci_base != NULL) context = AllocPowerPCICard(index, base); + if(base->cybpci_base != NULL) + context = AllocCybPCICard(index, base); #endif #ifdef __amigaos4__ if(base->expansion_base != NULL) @@ -413,6 +432,8 @@ static VOID FreeCard(struct BusContext *context, struct DevBase *base) #if defined(__mc68000) && !defined(__AROS__) if(base->powerpci_base != NULL) FreePowerPCICard(context, base); + if(base->cybpci_base != NULL) + FreeCybPCICard(context, base); #endif #ifdef __amigaos4__ if(base->expansion_base != NULL) @@ -435,9 +456,9 @@ static VOID FreeCard(struct BusContext *context, struct DevBase *base) * AddPCIIntServer * * SYNOPSIS -* context = AddPCIIntServer(index) +* success = AddPCIIntServer(card, interrupt) * -* struct BusContext *AddPCIIntServer(ULONG); +* BOOL AddPCIIntServer(APTR, struct Interrupt *); * **************************************************************************** * @@ -455,6 +476,8 @@ static BOOL AddPCIIntServer(APTR card, struct Interrupt *interrupt, #if defined(__mc68000) && !defined(__AROS__) if(base->powerpci_base != NULL) success = AddPowerPCIIntServer(card, interrupt, base); + if(base->cybpci_base != NULL) + success = AddCybPCIIntServer(card, interrupt, base); #endif #ifdef __amigaos4__ if(base->expansion_base != NULL) @@ -476,9 +499,9 @@ static BOOL AddPCIIntServer(APTR card, struct Interrupt *interrupt, * RemPCIIntServer * * SYNOPSIS -* RemPCIIntServer() +* RemPCIIntServer(card, interrupt) * -* VOID RemPCIIntServer(ULONG); +* VOID RemPCIIntServer(APTR, struct Interrupt *); * **************************************************************************** * @@ -494,6 +517,8 @@ static VOID RemPCIIntServer(APTR card, struct Interrupt *interrupt, #if defined(__mc68000) && !defined(__AROS__) if(base->powerpci_base != NULL) RemPowerPCIIntServer(card, interrupt, base); + if(base->cybpci_base != NULL) + RemCybPCIIntServer(card, interrupt, base); #endif #ifdef __amigaos4__ if(base->expansion_base != NULL) @@ -821,3 +846,4 @@ static VOID LEWordOutIOHook(struct BusContext *context, ULONG offset, } + diff --git a/workbench/devs/networks/prism2/pci.h b/workbench/devs/networks/prism2/pci.h index e3a461af28..695b479105 100644 --- a/workbench/devs/networks/prism2/pci.h +++ b/workbench/devs/networks/prism2/pci.h @@ -1,8 +1,6 @@ /* -File: pci.h -Author: Neil Cafferkey -Copyright (C) 2004,2005 Neil Cafferkey +Copyright (C) 2004-2012 Neil Cafferkey 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 @@ -21,15 +19,19 @@ MA 02111-1307, USA. */ +#ifndef PCI_H +#define PCI_H + #include #include - #include "device.h" -#define COR_VALUE 0x41 +#define COR_RESET 0x80 +#define COR_ENABLE 0x45 +#define RESET_DELAY 30 struct BusContext @@ -44,3 +46,4 @@ struct BusContext }; +#endif diff --git a/workbench/devs/networks/prism2/pci_protos.h b/workbench/devs/networks/prism2/pci_protos.h index c3f54a593f..3dc1b45665 100644 --- a/workbench/devs/networks/prism2/pci_protos.h +++ b/workbench/devs/networks/prism2/pci_protos.h @@ -1,7 +1,5 @@ /* -File: pci_protos.h -Author: Neil Cafferkey Copyright (C) 2004 Neil Cafferkey This program is free software; you can redistribute it and/or modify diff --git a/workbench/devs/networks/prism2/startup.c b/workbench/devs/networks/prism2/plx9052.h similarity index 62% copy from workbench/devs/networks/prism2/startup.c copy to workbench/devs/networks/prism2/plx9052.h index 49aab71d76..6b6cee2ea0 100644 --- a/workbench/devs/networks/prism2/startup.c +++ b/workbench/devs/networks/prism2/plx9052.h @@ -1,8 +1,6 @@ /* -File: startup.c -Author: Neil Cafferkey -Copyright (C) 2000 Neil Cafferkey +Copyright (C) 2008 Neil Cafferkey 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 @@ -21,26 +19,26 @@ MA 02111-1307, USA. */ -#include +#ifndef PLX9052_H +#define PLX9052_H -LONG Main(VOID); -int __main(void); +/* Registers */ +/* ========= */ +#define PLX9052_INTS 0x4c +#define PLX9052_CNTRL 0x50 -int main(void) -{ - return Main(); -} +/* Register Details */ +/* ================ */ +/* Control Register */ -#ifdef __mc68000 -int __main(void) -{ - return 0; -} -#endif - +#define PLX9052_CNTRLB_PCI21 14 +#define PLX9052_CNTRLB_RETRIES 19 +#define PLX9052_CNTRLF_PCI21 (1 << PLX9052_CNTRLB_PCI21) +#define PLX9052_CNTRLF_RETRIES (0xf << PLX9052_CNTRLB_RETRIES) +#endif diff --git a/workbench/devs/networks/prism2/powerpci.c b/workbench/devs/networks/prism2/powerpci.c new file mode 100755 index 0000000000..c036416483 --- /dev/null +++ b/workbench/devs/networks/prism2/powerpci.c @@ -0,0 +1,232 @@ +/* + +Copyright (C) 2004-2010 Neil Cafferkey + +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. + +*/ + + +#include +#include + +#include +#include + +#include "pci.h" +#include "plx9052.h" + +#include "pci_protos.h" +#include "powerpci_protos.h" + + +/****i* prism2.device/GetPowerPCICount ************************************* +* +* NAME +* GetPowerPCICount +* +* SYNOPSIS +* count = GetPowerPCICount() +* +* ULONG GetPowerPCICount(); +* +**************************************************************************** +* +*/ + +ULONG GetPowerPCICount(struct DevBase *base) +{ + ULONG count = 0; + ULONG card = 0; + UWORD vendor_id, product_id; + + while((card = pci_find_device(0xffff, 0xffff, card)) != NULL) + { + vendor_id = pci_read_conf_word(card, PCI_VENDOR_ID); + product_id = pci_read_conf_word(card, PCI_DEVICE_ID); + if(IsCardCompatible(vendor_id, product_id, base)) + count++; + } + + return count; +} + + + +/****i* prism2.device/AllocPowerPCICard ************************************ +* +* NAME +* AllocPowerPCICard +* +* SYNOPSIS +* context = AllocPowerPCICard(index) +* +* struct BusContext *AllocPowerPCICard(ULONG); +* +**************************************************************************** +* +*/ + +struct BusContext *AllocPowerPCICard(ULONG index, struct DevBase *base) +{ + BOOL success = TRUE; + struct BusContext *context; + ULONG card = 0; + UWORD i = 0, vendor_id, product_id; + UBYTE io_range_no; + volatile UBYTE *cor_reg; + UPINT int_reg; + + /* Find a compatible card */ + + context = AllocMem(sizeof(struct BusContext), MEMF_PUBLIC | MEMF_CLEAR); + if(context == NULL) + success = FALSE; + + if(success) + { + while(i <= index) + { + card = pci_find_device(0xffff, 0xffff, card); + product_id = pci_read_conf_word(card, PCI_DEVICE_ID); + vendor_id = pci_read_conf_word(card, PCI_VENDOR_ID); + if(IsCardCompatible(vendor_id, product_id, base)) + i++; + } + + context->card = (APTR)card; + if(card == NULL) + success = FALSE; + } + + if(success) + { + /* Find out what type of Prism II PCI card this is */ + + context->bus_type = GetBusType(product_id, base); + + if(context->bus_type == TMD_BUS) + { + /* Enable the PCCard */ + + cor_reg = pci_get_base_start(card, 1); + BYTEOUT((UPINT)cor_reg, COR_ENABLE); + io_range_no = 2; + } + else if(context->bus_type == PLX_BUS) + { + /* Enable the PCCard */ + + cor_reg = pci_get_base_start(card, 2) + 0x3e0; + *cor_reg = COR_ENABLE; + + /* Enable interrupts on the bridge */ + + int_reg = (UPINT)pci_get_base_start(card, 1) + PLX9052_INTS; + LELONGOUT(int_reg, LELONGIN(int_reg) | (1 << 6)); + io_range_no = 3; + } + else + io_range_no = 0; + + /* Get the I/O base of the wireless chip */ + + context->io_base = (UPINT)pci_get_base_start(card, io_range_no); + if(context->io_base == NULL) + success = FALSE; + } + + if(!success) + { + FreePowerPCICard(context, base); + context = NULL; + } + + return context; +} + + + +/****i* prism2.device/FreePowerPCICard ************************************* +* +* NAME +* FreePowerPCICard +* +* SYNOPSIS +* FreePowerPCICard(context) +* +* VOID FreePowerPCICard(struct BusContext *); +* +**************************************************************************** +* +*/ + +VOID FreePowerPCICard(struct BusContext *context, struct DevBase *base) +{ + if(context != NULL) + FreeMem(context, sizeof(struct BusContext)); + + return; +} + + + +/****i* prism2.device/AddPowerPCIIntServer ********************************* +* +* NAME +* AddPowerPCIIntServer +* +* SYNOPSIS +* success = AddPowerPCIIntServer(card, interrupt) +* +* BOOL AddPowerPCIIntServer(APTR, struct Interrupt *); +* +**************************************************************************** +* +*/ + +BOOL AddPowerPCIIntServer(APTR card, struct Interrupt *interrupt, + struct DevBase *base) +{ + return pci_add_irq((ULONG)card, interrupt); +} + + + +/****i* prism2.device/RemPowerPCIIntServer ********************************* +* +* NAME +* RemPowerPCIIntServer +* +* SYNOPSIS +* RemPowerPCIIntServer(card, interrupt) +* +* VOID RemPowerPCIIntServer(APTR, struct Interrupt *); +* +**************************************************************************** +* +*/ + +VOID RemPowerPCIIntServer(APTR card, struct Interrupt *interrupt, + struct DevBase *base) +{ + pci_rem_irq((ULONG)card, interrupt); + + return; +} + + + diff --git a/workbench/devs/networks/prism2/prometheus_protos.h b/workbench/devs/networks/prism2/powerpci_protos.h old mode 100644 new mode 100755 similarity index 64% copy from workbench/devs/networks/prism2/prometheus_protos.h copy to workbench/devs/networks/prism2/powerpci_protos.h index 62eb6b7e44..d2c7bffbf8 --- a/workbench/devs/networks/prism2/prometheus_protos.h +++ b/workbench/devs/networks/prism2/powerpci_protos.h @@ -1,7 +1,5 @@ /* -File: prometheus_protos.h -Author: Neil Cafferkey Copyright (C) 2005 Neil Cafferkey This program is free software; you can redistribute it and/or modify @@ -21,18 +19,18 @@ MA 02111-1307, USA. */ -#ifndef PROMETHEUS_PROTOS_H -#define PROMETHEUS_PROTOS_H +#ifndef POWERPCI_PROTOS_H +#define POWERPCI_PROTOS_H #include "device.h" -ULONG GetPrometheusCount(struct DevBase *base); -struct BusContext *AllocPrometheusCard(ULONG index, struct DevBase *base); -VOID FreePrometheusCard(struct BusContext *context, struct DevBase *base); -BOOL AddPrometheusIntServer(APTR card, struct Interrupt *interrupt, +ULONG GetPowerPCICount(struct DevBase *base); +struct BusContext *AllocPowerPCICard(ULONG index, struct DevBase *base); +VOID FreePowerPCICard(struct BusContext *context, struct DevBase *base); +BOOL AddPowerPCIIntServer(APTR card, struct Interrupt *interrupt, struct DevBase *base); -VOID RemPrometheusIntServer(APTR card, struct Interrupt *interrupt, +VOID RemPowerPCIIntServer(APTR card, struct Interrupt *interrupt, struct DevBase *base); #endif diff --git a/workbench/devs/networks/prism2/prism2.h b/workbench/devs/networks/prism2/prism2.h index 75da158f6f..2db1e266a8 100644 --- a/workbench/devs/networks/prism2/prism2.h +++ b/workbench/devs/networks/prism2/prism2.h @@ -1,6 +1,6 @@ /* -Copyright (C) 2004-2006 Neil Cafferkey +Copyright (C) 2004-2011 Neil Cafferkey 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 @@ -30,6 +30,7 @@ MA 02111-1307, USA. #define P2_MAXMCASTENTRIES 16 #define P2_AIROWEPRECLEN 0x1c #define P2_ALTWEPRECLEN 0x21 +#define P2_APRECLEN 0x32 /* ALT... ? */ #define P2_MSGTYPE_RFC1042 1 #define P2_MSGTYPE_TUNNEL 2 @@ -131,20 +132,20 @@ MA 02111-1307, USA. #define P2_REC_OWNSSID 0xFC04 #define P2_REC_SYSTEMSCALE 0xFC06 #define P2_REC_MAXDATALEN 0xFC07 -#define P2_REC_AUTHTYPE 0xFC21 #define P2_REC_ROAMINGMODE 0xFC2D /* ??? */ #define P2_REC_MCASTLIST 0xFC80 #define P2_REC_CREATEIBSS 0xFC81 #define P2_REC_RTSTHRESH 0xFC83 -#define P2_REC_TXRATE 0xFC84 /* ??? */ +#define P2_REC_TXRATE 0xFC84 #define P2_REC_PROMISC 0xFC85 #define P2_REC_PRIIDENTITY 0xFD02 +#define P2_REC_NICIDENTITY 0xFD0B #define P2_REC_STAIDENTITY 0xFD20 #define P2_REC_LINKQUALITY 0xFD43 #define P2_REC_CURTXRATE 0xFD44 /* ??? */ #define P2_REC_HASWEP 0xFD4F -/* Intersil-specific records */ +/* Intersil/Symbol-specific records */ #define P2_REC_TXCRYPTKEY 0xFC23 #define P2_REC_CRYPTKEY0 0xFC24 @@ -152,14 +153,29 @@ MA 02111-1307, USA. #define P2_REC_CRYPTKEY2 0xFC26 #define P2_REC_CRYPTKEY3 0xFC27 #define P2_REC_ENCRYPTION 0xFC28 +#define P2_REC_AUTHTYPE 0xFC2A +#define P2_REC_ROAMINGMODE 0xFC2D #define P2_REC_DBMOFFSET 0xFC46 +#define P2_REC_WPAIE 0xFC48 +#define P2_REC_ALTHOSTSCAN 0xFCAB /* ??? */ +#define P2_REC_RXMGMTFRAMES 0xFCBB +#define P2_REC_JOIN 0xFCE2 +#define P2_REC_HOSTSCAN 0xFCE5 /*#define P2_REC_PRIMARYID 0xFD02*/ /* ??? */ /* Lucent-specific records */ -#define P2_REC_ALTTXCRYPTKEY 0xFCB1 +#define P2_REC_ALTENCRYPTION 0xFC20 +#define P2_REC_ALTAUTHTYPE 0xFC21 #define P2_REC_DEFLTCRYPTKEYS 0xFCB0 -#define P2_REC_ALTENCRYPTION 0xFC20 /* enable/disable WEP */ +#define P2_REC_ALTTXCRYPTKEY 0xFCB1 +#define P2_REC_SCANSSID 0xFCB2 +#define P2_REC_ADDDEFAULTTKIPKEY 0xFCB4 +#define P2_REC_KEYMGMTSUITE 0xFCB5 +#define P2_REC_REMDEFAULTTKIPKEY 0xFCB6 +#define P2_REC_ADDMAPPEDTKIPKEY 0xFCB7 +#define P2_REC_REMMAPPEDTKIPKEY 0xFCB8 +#define P2_REC_SCANCHANNELS 0xFCC2 /* Symbol-specific records */ @@ -207,9 +223,11 @@ MA 02111-1307, USA. #define P2_INFO_NOTIFY 0xF000 #define P2_INFO_COUNTERS 0xF100 #define P2_INFO_SCANRESULTS 0xF101 -#define P2_INFO_HOSTSCANRESULTS 0xF104 +#define P2_INFO_SCANRESULT 0xF102 +#define P2_INFO_HOSTSCANRESULTS 0xF103 +//#define P2_INFO_ALTHOSTSCANRESULTS 0xF104 #define P2_INFO_LINKSTATUS 0xF200 -#define P2_INFO_ASSOCSTATUS 0xF201 +/*#define P2_INFO_ASSOCSTATUS 0xF201*/ /* AP only? */ /* Register Details */ @@ -244,6 +262,12 @@ MA 02111-1307, USA. /* Record Details */ /* ============== */ +#if 0 /* Contrary to docs in Agere code, these should be bit numbers */ +#define P2_REC_ALTAUTHTYPE_OPEN 0 +#define P2_REC_ALTAUTHTYPE_SHARED 1 +#define P2_REC_ALTAUTHTYPE_LEAP 2 +#endif + #define P2_REC_ENCRYPTIONB_ENABLE 0 #define P2_REC_ENCRYPTIONB_NOPLAINTEXT 1 #define P2_REC_ENCRYPTIONB_HOSTENCRYPT 4 @@ -254,6 +278,12 @@ MA 02111-1307, USA. #define P2_REC_ENCRYPTIONF_HOSTENCRYPT (1 << P2_REC_ENCRYPTIONB_HOSTENCRYPT) #define P2_REC_ENCRYPTIONF_HOSTDECRYPT (1 << P2_REC_ENCRYPTIONB_HOSTDECRYPT) +#define P2_REC_AUTHTYPEB_OPEN 0 +#define P2_REC_AUTHTYPEB_SHARED 1 + +#define P2_REC_AUTHTYPEF_OPEN (1 << P2_REC_AUTHTYPEB_OPEN) +#define P2_REC_AUTHTYPEF_SHARED (1 << P2_REC_AUTHTYPEB_SHARED) + #define P2_REC_CAPABILITIES_OEMADDR 0x40 #define P2_REC_CONFIG_OPMODE 0x2 @@ -261,15 +291,40 @@ MA 02111-1307, USA. #define P2_REC_CONFIG_DSCHANNEL 0x66 +/* Information Frame Details */ +/* ========================= */ -/* Frame descriptor */ -/* ================ */ +#define P2_APREC_CHANNEL 0x0 +#define P2_APREC_NOISE 0x2 +#define P2_APREC_SIGNAL 0x4 +#define P2_APREC_BSSID 0x6 +#define P2_APREC_INTERVAL 0xc +#define P2_APREC_CAPABILITIES 0xe +#define P2_APREC_NAMELEN 0x10 +#define P2_APREC_NAME 0x12 -#define P2_FRM_STATUS 0x0 -#define P2_FRM_HEADER 0xe -#define P2_FRM_ETHFRAME 0x2e -#define P2_H2FRM_ETHFRAME 0x3a +/* Frame descriptors */ +/* ================= */ + +/* Standard frame */ + +#define P2_FRM_STATUS 0x0 +#define P2_FRM_NOISE 0x6 +#define P2_FRM_SIGNAL 0x7 +#define P2_FRM_TXCONTROL 0xc +#define P2_FRM_HEADER 0xe +#define P2_FRM_DATALEN 0x2c +#define P2_FRM_ALTTXCONTROL 0x2c +#define P2_FRM_ETHFRAME 0x2e +#define P2_FRM_DATA 0x3c + +/* Hermes-II frame */ + +#define P2_H2FRM_TXCONTROL 0x36 +#define P2_H2FRM_DATALEN 0x38 +#define P2_H2FRM_ETHFRAME 0x3a +#define P2_H2FRM_DATA 0x48 #define P2_AIROFRM_STATUS 0x4 #define P2_AIROFRM_FRAME 0x14 @@ -296,4 +351,16 @@ MA 02111-1307, USA. #define P2_FRM_STATUSF_PCF (1 << P2_FRM_STATUSB_PCF) #define P2_FRM_STATUSF_MSGTYPE (7 << P2_FRM_STATUSB_MSGTYPE) +/* TX Control field */ + +#define P2_FRM_TXCONTROLB_NATIVE 3 +#define P2_FRM_TXCONTROLB_MIC 4 // HERMES only +#define P2_FRM_TXCONTROLB_NOENC 7 +#define P2_FRM_TXCONTROLB_MICKEYID 11 // HERMES only + +#define P2_FRM_TXCONTROLF_NATIVE (1 << P2_FRM_TXCONTROLB_NATIVE) +#define P2_FRM_TXCONTROLF_MIC (1 << P2_FRM_TXCONTROLB_MIC) +#define P2_FRM_TXCONTROLF_NOENC (1 << P2_FRM_TXCONTROLB_NOENC) +#define P2_FRM_TXCONTROLF_MICKEYID (3 << P2_FRM_TXCONTROLB_MICKEYID) + #endif diff --git a/workbench/devs/networks/prism2/prometheus.c b/workbench/devs/networks/prism2/prometheus.c index 2958092c3b..faf255a916 100644 --- a/workbench/devs/networks/prism2/prometheus.c +++ b/workbench/devs/networks/prism2/prometheus.c @@ -1,8 +1,6 @@ /* -File: prometheus.c -Author: Neil Cafferkey -Copyright (C) 2004,2005 Neil Cafferkey +Copyright (C) 2004-2012 Neil Cafferkey 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 @@ -28,23 +26,13 @@ MA 02111-1307, USA. #include #include -#include "device.h" #include "pci.h" +#include "plx9052.h" +#include "prism2.h" #include "pci_protos.h" #include "prometheus_protos.h" - - -#define RETRY_COUNT 15 - -#define PLX9052_INTS 0x4c -#define PLX9052_CNTRL 0x50 - -#define PLX9052_CNTRLB_PCI21 14 -#define PLX9052_CNTRLB_RETRIES 19 - -#define PLX9052_CNTRLF_PCI21 (1 << PLX9052_CNTRLB_PCI21) -#define PLX9052_CNTRLF_RETRIES (0xf << PLX9052_CNTRLB_RETRIES) +#include "timer_protos.h" /****i* prism2.device/GetPrometheusCount *********************************** @@ -100,10 +88,10 @@ struct BusContext *AllocPrometheusCard(ULONG index, struct DevBase *base) struct BusContext *context; PCIBoard *card = NULL; UWORD i = 0; - UPINT vendor_id, product_id, plx_base; + UPINT vendor_id, product_id, plx_base, int_reg; UBYTE io_range_no; + ULONG value; volatile UBYTE *cor_reg; - __unused ULONG pci_control; /* Find a compatible card */ @@ -139,34 +127,31 @@ struct BusContext *AllocPrometheusCard(ULONG index, struct DevBase *base) Prm_GetBoardAttrsTags(card, PRM_MemoryAddr1, (UPINT)&cor_reg, TAG_END); - BYTEOUT((UPINT)cor_reg, COR_VALUE); + BYTEOUT((UPINT)cor_reg, COR_RESET); + BusyMilliDelay(RESET_DELAY, base); + BYTEOUT((UPINT)cor_reg, COR_ENABLE); + BusyMilliDelay(RESET_DELAY, base); io_range_no = 2; } else if(context->bus_type == PLX_BUS) { - /* Enable interrupts on the bridge */ + /* Reset and enable the PCCard */ - Prm_GetBoardAttrsTags(card, PRM_MemoryAddr1, (UPINT)&plx_base, + Prm_GetBoardAttrsTags(card, PRM_MemoryAddr2, (UPINT)&cor_reg, TAG_END); - LELONGOUT(plx_base + PLX9052_INTS, - LELONGIN(plx_base + PLX9052_INTS) | (1 << 6)); - -#ifdef __mc68000 - /* Delay PCI retries as long as possible, so that they will - hopefully never occur */ - - pci_control = LELONGIN(plx_base + PLX9052_CNTRL); - pci_control &= ~(PLX9052_CNTRLF_RETRIES | PLX9052_CNTRLF_PCI21); - pci_control |= RETRY_COUNT << PLX9052_CNTRLB_RETRIES; - LELONGOUT(plx_base + PLX9052_CNTRL, pci_control); -#endif + cor_reg += 0x3e0; + *cor_reg = COR_ENABLE; + BusyMilliDelay(RESET_DELAY, base); - /* Enable the PCCard */ + /* Enable interrupts on the bridge */ - Prm_GetBoardAttrsTags(card, PRM_MemoryAddr2, (UPINT)&cor_reg, + Prm_GetBoardAttrsTags(card, PRM_MemoryAddr1, (UPINT)&plx_base, TAG_END); - cor_reg += 0x3e0; - *cor_reg = COR_VALUE; + int_reg = plx_base + PLX9052_INTS; + value = LELONGIN(int_reg); + LELONGOUT(int_reg, value | (1 << 6)); + if((LELONGIN(int_reg) & (1 << 6)) == 0) + success = FALSE; io_range_no = 3; } else @@ -178,6 +163,17 @@ struct BusContext *AllocPrometheusCard(ULONG index, struct DevBase *base) (UPINT)&context->io_base, TAG_END); if(context->io_base == 0) success = FALSE; + + if(context->bus_type == PCI_BUS) + { + /* Reset and enable the card */ + + cor_reg = (volatile UBYTE *)context->io_base + (P2_REG_PCICOR * 2); + *cor_reg = COR_RESET; + BusyMilliDelay(250, base); + *cor_reg = 0; + BusyMilliDelay(500, base); + } } /* Lock card */ @@ -216,6 +212,9 @@ struct BusContext *AllocPrometheusCard(ULONG index, struct DevBase *base) VOID FreePrometheusCard(struct BusContext *context, struct DevBase *base) { PCIBoard *card; + ULONG value; + UPINT plx_base, int_reg; + volatile UBYTE *cor_reg; APTR owner; if(context != NULL) @@ -223,6 +222,34 @@ VOID FreePrometheusCard(struct BusContext *context, struct DevBase *base) card = context->card; if(card != NULL) { + if(context->bus_type == TMD_BUS) + { + /* Disable the PCCard */ + + Prm_GetBoardAttrsTags(card, PRM_MemoryAddr1, (UPINT)&cor_reg, + TAG_END); + BYTEOUT((UPINT)cor_reg, 0); + } + else if(context->bus_type == PLX_BUS) + { + /* Disable interrupts on the bridge */ + + Prm_GetBoardAttrsTags(card, PRM_MemoryAddr1, (UPINT)&plx_base, + TAG_END); + int_reg = plx_base + PLX9052_INTS; + value = LELONGIN(int_reg); + LELONGOUT(int_reg, value & ~(1 << 6)); + + /* Disable the PCCard */ + + Prm_GetBoardAttrsTags(card, PRM_MemoryAddr2, (UPINT)&cor_reg, + TAG_END); + cor_reg += 0x3e0; + *cor_reg = COR_RESET; + BusyMilliDelay(250, base); + *cor_reg = 0; + } + /* Unlock board */ Prm_GetBoardAttrsTags(card, PRM_BoardOwner, (UPINT)&owner, @@ -245,9 +272,9 @@ VOID FreePrometheusCard(struct BusContext *context, struct DevBase *base) * AddPrometheusIntServer * * SYNOPSIS -* context = AddPrometheusIntServer(index) +* success = AddPrometheusIntServer(card, interrupt) * -* struct BusContext *AddPrometheusIntServer(ULONG); +* BOOL AddPrometheusIntServer(APTR, struct Interrupt *); * **************************************************************************** * @@ -267,9 +294,9 @@ BOOL AddPrometheusIntServer(APTR card, struct Interrupt *interrupt, * RemPrometheusIntServer * * SYNOPSIS -* RemPrometheusIntServer() +* RemPrometheusIntServer(card, interrupt) * -* VOID RemPrometheusIntServer(ULONG); +* VOID RemPrometheusIntServer(APTR, struct Interrupt *); * **************************************************************************** * diff --git a/workbench/devs/networks/prism2/prometheus_protos.h b/workbench/devs/networks/prism2/prometheus_protos.h index 62eb6b7e44..42529ce69d 100644 --- a/workbench/devs/networks/prism2/prometheus_protos.h +++ b/workbench/devs/networks/prism2/prometheus_protos.h @@ -1,7 +1,5 @@ /* -File: prometheus_protos.h -Author: Neil Cafferkey Copyright (C) 2005 Neil Cafferkey This program is free software; you can redistribute it and/or modify diff --git a/workbench/devs/networks/prism2/request.c b/workbench/devs/networks/prism2/request.c index 4d3ed2df25..8979aa894a 100644 --- a/workbench/devs/networks/prism2/request.c +++ b/workbench/devs/networks/prism2/request.c @@ -1,8 +1,6 @@ /* -File: request.c -Author: Neil Cafferkey -Copyright (C) 2001-2006 Neil Cafferkey +Copyright (C) 2001-2012 Neil Cafferkey 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 @@ -21,7 +19,6 @@ MA 02111-1307, USA. */ -#include #include #include @@ -39,7 +36,8 @@ MA 02111-1307, USA. #define KNOWN_EVENTS \ (S2EVENT_ERROR | S2EVENT_TX | S2EVENT_RX | S2EVENT_ONLINE \ - | S2EVENT_OFFLINE | S2EVENT_BUFF | S2EVENT_HARDWARE | S2EVENT_SOFTWARE) + | S2EVENT_OFFLINE | S2EVENT_BUFF | S2EVENT_HARDWARE | S2EVENT_SOFTWARE \ + | S2EVENT_CONNECT | S2EVENT_DISCONNECT) static BOOL CmdInvalid(struct IOSana2Req *request, struct DevBase *base); @@ -77,6 +75,12 @@ static BOOL CmdDelMulticastAddresses(struct IOSana2Req *request, struct DevBase *base); static BOOL CmdGetSignalQuality(struct IOSana2Req *request, struct DevBase *base); +static BOOL CmdGetNetworks(struct IOSana2Req *request, + struct DevBase *base); +static BOOL CmdSetOptions(struct IOSana2Req *request, struct DevBase *base); +static BOOL CmdSetKey(struct IOSana2Req *request, struct DevBase *base); +static BOOL CmdGetNetworkInfo(struct IOSana2Req *request, + struct DevBase *base); static const UWORD supported_commands[] = @@ -103,7 +107,12 @@ static const UWORD supported_commands[] = NSCMD_DEVICEQUERY, S2_ADDMULTICASTADDRESSES, S2_DELMULTICASTADDRESSES, - P2_GETSIGNALQUALITY, + S2_GETSIGNALQUALITY, + S2_GETNETWORKS, + S2_SETOPTIONS, + S2_SETKEY, + S2_GETNETWORKINFO, +// P2_DISASSOCIATE, 0 }; @@ -240,9 +249,21 @@ VOID ServiceRequest(struct IOSana2Req *request, struct DevBase *base) case S2_DELMULTICASTADDRESSES: complete = CmdDelMulticastAddresses(request, base); break; - case P2_GETSIGNALQUALITY: + case S2_GETSIGNALQUALITY: complete = CmdGetSignalQuality(request, base); break; + case S2_GETNETWORKS: + complete = CmdGetNetworks(request, base); + break; + case S2_SETOPTIONS: + complete = CmdSetOptions(request, base); + break; + case S2_SETKEY: + complete = CmdSetKey(request, base); + break; + case S2_GETNETWORKINFO: + complete = CmdGetNetworkInfo(request, base); + break; default: complete = CmdInvalid(request, base); } @@ -436,6 +457,7 @@ static BOOL CmdWrite(struct IOSana2Req *request, struct DevBase *base) /* Queue request for sending */ +//error = 1; if(error == 0) PutRequest(unit->request_ports[WRITE_QUEUE], (APTR)request, base); else @@ -618,7 +640,7 @@ static BOOL CmdConfigInterface(struct IOSana2Req *request, { struct DevUnit *unit; BYTE error = 0; - ULONG wire_error = S2WERR_UNIT_OFFLINE; + ULONG wire_error = S2WERR_GENERIC_ERROR; /* Configure adapter */ @@ -631,7 +653,6 @@ static BOOL CmdConfigInterface(struct IOSana2Req *request, else if((unit->flags & UNITF_HAVEADAPTER) == 0) { error = S2ERR_BAD_STATE; - wire_error = S2WERR_GENERIC_ERROR; } if(error == 0) @@ -686,9 +707,12 @@ static BOOL CmdConfigInterface(struct IOSana2Req *request, static BOOL CmdBroadcast(struct IOSana2Req *request, struct DevBase *base) { + UWORD i; + /* Fill in the broadcast address as destination */ - memset(request->ios2_DstAddr, 0xff, 6); + for(i = 0; i < ETH_ADDRESSSIZE; i++) + request->ios2_DstAddr[i] = 0xff; /* Queue the write as normal */ @@ -1103,6 +1127,7 @@ static BOOL CmdOnEvent(struct IOSana2Req *request, struct DevBase *base) } /* Reply request if a wanted event has already occurred */ +//if(wanted_events & S2EVENT_CONNECT) unit->special_stats[8]++; if(events != 0) { @@ -1237,7 +1262,7 @@ static BOOL CmdOnline(struct IOSana2Req *request, struct DevBase *base) /* Clear global and special stats and put adapter back online */ - if((error == 0) && ((unit->flags & UNITF_ONLINE) == 0)) + if(error == 0 && (unit->flags & UNITF_ONLINE) == 0) { unit->stats.PacketsReceived = 0; unit->stats.PacketsSent = 0; @@ -1518,10 +1543,10 @@ static BOOL CmdDelMulticastAddresses(struct IOSana2Req *request, -/****** prism2.device/P2_GETSIGNALQUALITY ********************************** +/****** prism2.device/S2_GETSIGNALQUALITY ********************************** * * NAME -* P2_GETSIGNALQUALITY -- Get signal quality statistics. +* S2_GETSIGNALQUALITY -- Get signal quality statistics. * * FUNCTION * This command fills in the supplied Sana2SignalQuality structure with @@ -1549,8 +1574,7 @@ static BOOL CmdGetSignalQuality(struct IOSana2Req *request, unit = (APTR)request->ios2_Req.io_Unit; if((unit->flags & UNITF_ONLINE) != 0) { - if((unit->flags & UNITF_ONLINE) != 0) - UpdateSignalQuality(unit, base); + UpdateSignalQuality(unit, base); CopyMem(&unit->signal_quality, request->ios2_StatData, sizeof(struct Sana2SignalQuality)); } @@ -1560,6 +1584,210 @@ static BOOL CmdGetSignalQuality(struct IOSana2Req *request, request->ios2_WireError = S2WERR_UNIT_OFFLINE; } + /* Return */ + + return TRUE; +} + + + +/****** prism2.device/S2_GETNETWORKS *************************************** +* +* NAME +* S2_GETNETWORKS -- Scan for available networks. +* +* FUNCTION +* This command supplies details of available networks. If the scan +* should be limited to one specific network, the S2INFO_SSID tag +* should specify its name. +* +* If this command completes successfully, ios2_StatData will contain +* an array of pointers to tag lists, each of which contains +* information on a single network. The device will set ios2_DataLength +* to the number of elements in this array. +* +* The returned taglists are allocated from the supplied memory pool. +* To discard the results of this command, the entire memory pool +* should be destroyed. +* +* INPUTS +* ios2_Data - Pointer to an Exec memory pool. +* ios2_StatData - Pointer to taglist that specifies parameters to use. +* +* RESULTS +* io_Error - Zero if successful; non-zero otherwise. +* ios2_WireError - More specific error code. +* ios2_DataLength - Number of tag lists returned. +* ios2_Data - Remains unchanged. +* ios2_StatData - Pointer to an array of tag lists. +* +**************************************************************************** +* +*/ + +static BOOL CmdGetNetworks(struct IOSana2Req *request, + struct DevBase *base) +{ + struct DevUnit *unit; + BOOL complete = FALSE; + const TEXT *ssid; + const struct TagItem *tag_list; + + /* Request a new scan and queue request to receive results */ + + unit = (APTR)request->ios2_Req.io_Unit; + if((unit->flags & UNITF_ONLINE) != 0) + { + PutRequest(unit->request_ports[SCAN_QUEUE], (APTR)request, base); + tag_list = (const struct TagItem *)request->ios2_StatData; + ssid = (const TEXT *)GetTagData(S2INFO_SSID, (UPINT)NULL, tag_list); + StartScan(unit, ssid, base); + } + else + { + request->ios2_Req.io_Error = S2ERR_OUTOFSERVICE; + request->ios2_WireError = S2WERR_UNIT_OFFLINE; + complete = TRUE; + } + + /* Return */ + + return complete; +} + + + +/****** prism2.device/S2_SETOPTIONS **************************************** +* +* NAME +* S2_SETOPTIONS -- Associate with a network. +* +* FUNCTION +* Associate with a specified network using the parameters supplied.[?] +* Set various parameters for the network interface. This command +* should be called before going online to set any essential parameters +* not covered elsewhere. +* +* INPUTS +* ios2_Data - Pointer to taglist that specifies the network and +* parameters to use. +* +* RESULTS +* io_Error - Zero if successful; non-zero otherwise. +* ios2_WireError - More specific error code. +* +**************************************************************************** +* +*/ + +static BOOL CmdSetOptions(struct IOSana2Req *request, struct DevBase *base) +{ + struct DevUnit *unit; + + /* */ + + unit = (APTR)request->ios2_Req.io_Unit; + SetOptions(unit, request->ios2_Data, base); +#if 1 + if((unit->flags & UNITF_ONLINE) != 0) +//&& FindTagItem(P2OPT_Key, request->ios2_Data) == NULL) + ConfigureAdapter(unit, base); +#endif + unit->stats.Reconfigurations++; + + /* Return */ + + return TRUE; +} + + + +/****** prism2.device/S2_SETKEY ******************************************** +* +* NAME +* S2_SETKEY -- Set an encryption key. +* +* FUNCTION +* +* INPUTS +* ios2_WireError - Key index. +* ios2_PacketType - Encryption type (e.g. S2ENC_WEP). +* ios2_DataLength - Key length. +* ios2_Data - Key. +* ios2_StatData - RX counter number (NULL if unused). +* +* RESULTS +* io_Error +* +* EXAMPLE +* +* NOTES +* +* BUGS +* +* SEE ALSO +* +**************************************************************************** +* +*/ + +static BOOL CmdSetKey(struct IOSana2Req *request, struct DevBase *base) +{ + struct DevUnit *unit; + + unit = (APTR)request->ios2_Req.io_Unit; + SetKey(unit, request->ios2_WireError, request->ios2_PacketType, + request->ios2_Data, request->ios2_DataLength, request->ios2_StatData, + base); + + /* Return */ + + return TRUE; +} + + + +/****** prism2.device/S2_GETNETWORKINFO ************************************ +* +* NAME +* S2_GETNETWORKINFO -- Get information on current network. +* +* FUNCTION +* +* INPUTS +* ios2_Data - Pointer to an Exec memory pool. +* +* RESULTS +* ios2_Data - Remains unchanged. +* ios2_StatData - Pointer to a tag list. +* io_Error - Zero if successful; non-zero otherwise. +* ios2_WireError - More specific error code. +* +**************************************************************************** +* +*/ + +static BOOL CmdGetNetworkInfo(struct IOSana2Req *request, + struct DevBase *base) +{ + struct DevUnit *unit; + APTR pool; + + /* Request information on current network */ + + unit = (APTR)request->ios2_Req.io_Unit; + pool = request->ios2_Data; + if((unit->flags & UNITF_ONLINE) != 0) + { + request->ios2_StatData = GetNetworkInfo(unit, pool, base); + if(request->ios2_StatData == NULL) + request->ios2_Req.io_Error = S2ERR_NO_RESOURCES; + } + else + { + request->ios2_Req.io_Error = S2ERR_OUTOFSERVICE; + request->ios2_WireError = S2WERR_UNIT_OFFLINE; + } /* Return */ diff --git a/workbench/devs/networks/prism2/request_protos.h b/workbench/devs/networks/prism2/request_protos.h index 11d08d9b05..81bc320abe 100644 --- a/workbench/devs/networks/prism2/request_protos.h +++ b/workbench/devs/networks/prism2/request_protos.h @@ -1,7 +1,5 @@ /* -File: request_protos.h -Author: Neil Cafferkey Copyright (C) 2002 Neil Cafferkey This program is free software; you can redistribute it and/or modify diff --git a/workbench/devs/networks/prism2/startup.c b/workbench/devs/networks/prism2/startup.c index 49aab71d76..154ba1a3f2 100644 --- a/workbench/devs/networks/prism2/startup.c +++ b/workbench/devs/networks/prism2/startup.c @@ -1,7 +1,5 @@ /* -File: startup.c -Author: Neil Cafferkey Copyright (C) 2000 Neil Cafferkey This program is free software; you can redistribute it and/or modify diff --git a/workbench/devs/networks/prism2/pci.h b/workbench/devs/networks/prism2/timer.c similarity index 51% copy from workbench/devs/networks/prism2/pci.h copy to workbench/devs/networks/prism2/timer.c index e3a461af28..65c95d5059 100644 --- a/workbench/devs/networks/prism2/pci.h +++ b/workbench/devs/networks/prism2/timer.c @@ -1,8 +1,6 @@ /* -File: pci.h -Author: Neil Cafferkey -Copyright (C) 2004,2005 Neil Cafferkey +Copyright (C) 2012 Neil Cafferkey 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 @@ -22,25 +20,41 @@ MA 02111-1307, USA. */ -#include -#include - +#include #include "device.h" +#include "timer_protos.h" + + +/****i* prism2.device/BusyMilliDelay *************************************** +* +* NAME +* BusyMilliDelay - Busy-wait for specified number of milliseconds. +* +* SYNOPSIS +* BusyMilliDelay(millis) +* +* VOID BusyMilliDelay(ULONG); +* +**************************************************************************** +* +*/ + +VOID BusyMilliDelay(ULONG millis, struct DevBase *base) +{ + struct timeval time, end_time; -#define COR_VALUE 0x41 + GetSysTime(&end_time); + time.tv_secs = 0; + time.tv_micro = millis * 1000; + AddTime(&end_time, &time); + while(CmpTime(&end_time, &time) < 0) + GetSysTime(&time); + + return; +} -struct BusContext -{ - struct DevUnit *unit; - VOID *card; - UPINT io_base; - const struct TagItem *unit_tags; - UWORD bus_type; - BOOL have_card; - APTR reset_handler; -}; diff --git a/workbench/devs/networks/prism2/startup.c b/workbench/devs/networks/prism2/timer_protos.h old mode 100644 new mode 100755 similarity index 75% copy from workbench/devs/networks/prism2/startup.c copy to workbench/devs/networks/prism2/timer_protos.h index 49aab71d76..26eb401bb1 --- a/workbench/devs/networks/prism2/startup.c +++ b/workbench/devs/networks/prism2/timer_protos.h @@ -1,8 +1,6 @@ /* -File: startup.c -Author: Neil Cafferkey -Copyright (C) 2000 Neil Cafferkey +Copyright (C) 2011 Neil Cafferkey 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 @@ -21,26 +19,16 @@ MA 02111-1307, USA. */ -#include +#ifndef TIMER_PROTOS_H +#define TIMER_PROTOS_H -LONG Main(VOID); -int __main(void); +#include "device.h" +VOID BusyMilliDelay(ULONG millis, struct DevBase *base); +VOID BusyMicroDelay(ULONG micros, struct DevBase *base); -int main(void) -{ - return Main(); -} - - -#ifdef __mc68000 -int __main(void) -{ - return 0; -} #endif - diff --git a/workbench/devs/networks/prism2/unit.c b/workbench/devs/networks/prism2/unit.c index fcc0d78ced..355324887a 100644 --- a/workbench/devs/networks/prism2/unit.c +++ b/workbench/devs/networks/prism2/unit.c @@ -1,8 +1,6 @@ /* -File: unit.c -Author: Neil Cafferkey -Copyright (C) 2001-2006 Neil Cafferkey +Copyright (C) 2001-2012 Neil Cafferkey 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 @@ -41,6 +39,8 @@ MA 02111-1307, USA. #include "unit_protos.h" #include "request_protos.h" +#include "encryption_protos.h" +#include "timer_protos.h" #define TASK_PRIORITY 0 @@ -50,28 +50,49 @@ MA 02111-1307, USA. #define MAX_S_REC_SIZE 50 #define LUCENT_DBM_OFFSET 149 #define INTERSIL_DBM_OFFSET 100 +#define SCAN_BUFFER_SIZE 2000 +#define BEACON_BUFFER_SIZE 8000 +#define SCAN_TAG_COUNT 8 +10 +#define INFO_TAG_COUNT 4 +10 +#define LUCENT_PDA_ADDRESS 0x390000 +#define LUCENT_PDA_SIZE 1000 +#define FRAME_BUFFER_SIZE (P2_H2FRM_ETHFRAME + ETH_HEADERSIZE \ + + SNAP_HEADERSIZE + ETH_MTU + EIV_SIZE + ICV_SIZE + MIC_SIZE) #ifndef AbsExecBase +#ifdef __AROS__ +#define AbsExecBase sys_base +#else #define AbsExecBase (*(struct ExecBase **)4) #endif +#endif -static VOID GetDefaults(struct DevUnit *unit, struct DevBase *base); static struct AddressRange *FindMulticastRange(struct DevUnit *unit, ULONG lower_bound_left, UWORD lower_bound_right, ULONG upper_bound_left, UWORD upper_bound_right, struct DevBase *base); +static VOID SetMulticast(struct DevUnit *unit, struct DevBase *base); static VOID RXInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)); +static UBYTE *GetRXBuffer(struct DevUnit *unit, const UBYTE *address, + UWORD frag_no, UWORD *buffer_no, struct DevBase *base); +static VOID DistributeRXPacket(struct DevUnit *unit, UBYTE *frame, + struct DevBase *base); static VOID CopyPacket(struct DevUnit *unit, struct IOSana2Req *request, - UWORD packet_size, UWORD packet_type, UBYTE *buffer, BOOL all_read, - UWORD frame_id, struct DevBase *base); + UWORD packet_size, UWORD packet_type, UBYTE *buffer, + struct DevBase *base); static BOOL AddressFilter(struct DevUnit *unit, UBYTE *address, struct DevBase *base); -static VOID SetMulticast(struct DevUnit *unit, struct DevBase *base); +static VOID SaveBeacon(struct DevUnit *unit, const UBYTE *frame, + struct DevBase *base); static VOID TXInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)); static VOID InfoInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)); +static VOID ResetHandler(REG(a1, struct DevUnit *unit), + REG(a6, APTR int_code)); static VOID ReportEvents(struct DevUnit *unit, ULONG events, struct DevBase *base); static BOOL LoadFirmware(struct DevUnit *unit, struct DevBase *base); +static const TEXT *ParseNextSRecord(const TEXT *s, UBYTE *type, UBYTE *data, + UWORD *data_length, ULONG *location, struct DevBase *base); static VOID P2DoCmd(struct DevUnit *unit, UWORD command, UWORD param, struct DevBase *base); static BOOL P2Seek(struct DevUnit *unit, UWORD path_no, UWORD rec_no, @@ -86,14 +107,31 @@ static UWORD P2AllocMem(struct DevUnit *unit, UWORD size, struct DevBase *base); static VOID P2SetData(struct DevUnit *unit, UWORD rec_no, const UBYTE *data, UWORD length, struct DevBase *base); -static VOID UnitTask(); -static VOID BusyMilliDelay(ULONG millis, struct DevBase *base); +static BOOL P2ReadRec(struct DevUnit *unit, UWORD rec_no, APTR buffer, + UWORD max_length, struct DevBase *base); +static LONG ConvertLevel(struct DevUnit *unit, UWORD raw_level, + struct DevBase *base); +static LONG ConvertScanLevel(struct DevUnit *unit, UWORD raw_level, + struct DevBase *base); +static UBYTE *GetIE(UBYTE id, UBYTE *ies, UWORD ies_length, + struct DevBase *base); +static VOID UnitTask(struct ExecBase *sys_base); static UPINT StrLen(const TEXT *s); -static const UBYTE snap_stuff[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; -static const TEXT options_name[] = "Prism 2 options"; -static const TEXT firmware_file_name[] = "DEVS:Firmware/HermesII"; +static const UBYTE snap_template[] = {0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00}; +static const UBYTE scan_params[] = {0xff, 0x3f, 0x01, 0x00, 0x00, 0x00}; + static const TEXT options_name[] = "Prism 2 options"; +static const TEXT h1_firmware_file_name[] = "DEVS:Firmware/HermesI"; +static const TEXT h2_firmware_file_name[] = "DEVS:Firmware/HermesII"; +static const TEXT h25_firmware_file_name[] = "DEVS:Firmware/HermesII.5"; +static const UBYTE h2_wpa_ie[] = +{ + 0xdd, 0x18, 0x00, 0x50, 0xf2, 0x01, 0x01, 0x00, + 0x00, 0x50, 0xf2, 0x02, 0x01, 0x00, 0x00, 0x50, + 0xf2, 0x02, 0x01, 0x00, 0x00, 0x50, 0xf2, 0x02, + 0x00, 0x00 +}; #ifdef __amigaos4__ @@ -110,6 +148,15 @@ static const struct EmulLibEntry mos_task_trap = }; #define UnitTask &mos_task_trap #endif +#ifdef __AROS__ +#undef AddTask +#define AddTask(task, initial_pc, final_pc) \ + ({ \ + struct TagItem _task_tags[] = \ + {{TASKTAG_ARG1, (IPTR)SysBase}, {TAG_END, 0}}; \ + NewAddTask(task, initial_pc, final_pc, _task_tags); \ + }) +#endif @@ -139,7 +186,6 @@ struct DevUnit *CreateUnit(ULONG index, APTR card, struct MsgPort *port; UBYTE i; APTR stack; - ULONG size; unit = AllocMem(sizeof(struct DevUnit), MEMF_CLEAR | MEMF_PUBLIC); if(unit == NULL) @@ -190,11 +236,25 @@ struct DevUnit *CreateUnit(ULONG index, APTR card, } } - size = (ETH_MAXPACKETSIZE + 3) & ~3; - unit->rx_buffer = AllocVec(size, MEMF_PUBLIC); - unit->tx_buffer = AllocVec(ETH_MAXPACKETSIZE, MEMF_PUBLIC); + /* Allocate buffers */ - if(unit->rx_buffer == NULL || unit->tx_buffer == NULL) + unit->rx_buffer = AllocVec(FRAME_BUFFER_SIZE, MEMF_PUBLIC); + unit->rx_buffers = AllocVec(FRAME_BUFFER_SIZE * RX_BUFFER_COUNT, + MEMF_PUBLIC); + for(i = 0; i < RX_BUFFER_COUNT; i++) + unit->rx_fragment_nos[i] = -1; + unit->tx_buffer = AllocVec(ETH_MAXPACKETSIZE, MEMF_PUBLIC); + unit->rx_descriptor = AllocVec(FRAME_BUFFER_SIZE, + MEMF_PUBLIC | MEMF_CLEAR); + unit->tx_descriptor = AllocVec(FRAME_BUFFER_SIZE, + MEMF_PUBLIC | MEMF_CLEAR); + unit->scan_results_rec = AllocVec(SCAN_BUFFER_SIZE, MEMF_PUBLIC); + unit->next_beacon = unit->beacons = + AllocVec(BEACON_BUFFER_SIZE, MEMF_PUBLIC); + if(unit->rx_buffer == NULL || unit->rx_buffers == NULL + || unit->tx_buffer == NULL || unit->rx_descriptor == NULL + || unit->tx_descriptor == NULL || unit->scan_results_rec == NULL + || unit->beacons == NULL) success = FALSE; } @@ -230,6 +290,11 @@ struct DevUnit *CreateUnit(ULONG index, APTR card, unit->info_int.is_Code = (APTR)InfoInt; unit->info_int.is_Data = unit; + unit->reset_handler.is_Node.ln_Name = + base->device.dd_Library.lib_Node.ln_Name; + unit->reset_handler.is_Code = (APTR)ResetHandler; + unit->reset_handler.is_Data = unit; + unit->request_ports[WRITE_QUEUE]->mp_Flags = PA_SOFTINT; } @@ -272,9 +337,9 @@ struct DevUnit *CreateUnit(ULONG index, APTR card, task->tc_UserData = unit; - /* Get default wireless options */ + /* Set default wireless options */ - GetDefaults(unit, base); + unit->mode = S2PORT_MANAGED; } if(!success) @@ -318,6 +383,8 @@ VOID DeleteUnit(struct DevUnit *unit, struct DevBase *base) if(unit != NULL) { + /* Remove task */ + task = unit->task; if(task != NULL) { @@ -329,16 +396,30 @@ VOID DeleteUnit(struct DevUnit *unit, struct DevBase *base) FreeMem(task, sizeof(struct Task)); } + /* Free request queues */ + for(i = 0; i < REQUEST_QUEUE_COUNT; i++) { if(unit->request_ports[i] != NULL) FreeMem(unit->request_ports[i], sizeof(struct MsgPort)); } + /* Go offline */ + if((unit->flags & UNITF_ONLINE) != 0) /* Needed! */ GoOffline(unit, base); + /* Clear target SSID */ + + P2SetID(unit, P2_REC_DESIREDSSID, unit->ssid, 0, base); + + /* Free buffers and unit structure */ + + FreeVec(unit->scan_results_rec); + FreeVec(unit->tx_descriptor); + FreeVec(unit->rx_descriptor); FreeVec(unit->tx_buffer); + FreeVec(unit->rx_buffers); FreeVec(unit->rx_buffer); FreeMem(unit, sizeof(struct DevUnit)); @@ -375,66 +456,112 @@ VOID DeleteUnit(struct DevUnit *unit, struct DevBase *base) BOOL InitialiseAdapter(struct DevUnit *unit, BOOL reinsertion, struct DevBase *base) { - UWORD vendor, version, revision, i; - BOOL success = TRUE; + UWORD id, version, revision, i; + BOOL success = TRUE, loaded; UBYTE address[ETH_ADDRESSSIZE]; WORD length; - /* Reset card */ + /* Wait for card to be ready following bus-specific reset, then start + it */ - if(unit->bus == PCI_BUS) - { - unit->LEWordOut(unit->card, P2_REG_PCICOR, 0x80); - BusyMilliDelay(250, base); - unit->LEWordOut(unit->card, P2_REG_PCICOR, 0); - BusyMilliDelay(500, base); - while((unit->LEWordIn(unit->card, P2_REG_COMMAND) - & P2_REG_COMMANDF_BUSY) != 0); - } + while((unit->LEWordIn(unit->card, P2_REG_COMMAND) + & P2_REG_COMMANDF_BUSY) != 0); P2DoCmd(unit, P2_CMD_INIT, 0, base); - /* Determine firmware type and download firmware if necessary */ + /* Determine firmware type */ - P2DoCmd(unit, P2_CMD_ACCESS, P2_REC_PRIIDENTITY, base); - P2Seek(unit, 1, P2_REC_PRIIDENTITY, 0, base); - length = unit->LEWordIn(unit->card, P2_REG_DATA1); - if(length != 5) + P2DoCmd(unit, P2_CMD_ACCESS, P2_REC_NICIDENTITY, base); + P2Seek(unit, 1, P2_REC_NICIDENTITY, 4, base); + id = unit->LEWordIn(unit->card, P2_REG_DATA1); + unit->LEWordIn(unit->card, P2_REG_DATA1); + version = unit->LEWordIn(unit->card, P2_REG_DATA1); + revision = unit->LEWordIn(unit->card, P2_REG_DATA1); + + if((id & 0x8000) != 0) { - unit->firmware_type = HERMES2_FIRMWARE; - success = LoadFirmware(unit, base); + if(version == 0) + unit->firmware_type = SYMBOL_FIRMWARE; + else + unit->firmware_type = INTERSIL_FIRMWARE; } else { - P2DoCmd(unit, P2_CMD_ACCESS, P2_REC_STAIDENTITY, base); - - P2Seek(unit, 1, P2_REC_STAIDENTITY, 4, base); - unit->LEWordIn(unit->card, P2_REG_DATA1); - vendor = unit->LEWordIn(unit->card, P2_REG_DATA1); - version = unit->LEWordIn(unit->card, P2_REG_DATA1); - revision = unit->LEWordIn(unit->card, P2_REG_DATA1); - - if(vendor == 1) + P2DoCmd(unit, P2_CMD_ACCESS, P2_REC_PRIIDENTITY, base); + P2Seek(unit, 1, P2_REC_PRIIDENTITY, 0, base); + length = unit->LEWordIn(unit->card, P2_REG_DATA1); + if(length == 5) unit->firmware_type = LUCENT_FIRMWARE; - else if(vendor == 2 && (version == 1 || version == 2) - && revision == 1) - unit->firmware_type = SYMBOL_FIRMWARE; else - unit->firmware_type = INTERSIL_FIRMWARE; + { + P2DoCmd(unit, P2_CMD_ACCESS, P2_REC_STAIDENTITY, base); + P2Seek(unit, 1, P2_REC_STAIDENTITY, 4, base); + id = unit->LEWordIn(unit->card, P2_REG_DATA1); + unit->LEWordIn(unit->card, P2_REG_DATA1); + version = unit->LEWordIn(unit->card, P2_REG_DATA1); + revision = unit->LEWordIn(unit->card, P2_REG_DATA1); + if(version > 1) + unit->firmware_type = HERMES2G_FIRMWARE; + else + unit->firmware_type = HERMES2_FIRMWARE; + } } + /* Download firmware if necessary or available */ + + loaded = LoadFirmware(unit, base); + if(!loaded && unit->firmware_type >= HERMES2_FIRMWARE) + success = FALSE; + if(success) { - /* Get card capabilities and default values */ + /* Determine features, and get offsets of certain fields within frame + descriptors */ + + P2DoCmd(unit, P2_CMD_ACCESS, P2_REC_STAIDENTITY, base); + P2Seek(unit, 1, P2_REC_STAIDENTITY, 4, base); + unit->LEWordIn(unit->card, P2_REG_DATA1); + unit->LEWordIn(unit->card, P2_REG_DATA1); + version = unit->LEWordIn(unit->card, P2_REG_DATA1); + revision = unit->LEWordIn(unit->card, P2_REG_DATA1); if(P2GetWord(unit, P2_REC_HASWEP, base) != 0) - unit->flags |= UNITF_HASWEP; - unit->channel = P2GetWord(unit, P2_REC_OWNCHNL, base); + unit->flags |= UNITF_HASWEP | UNITF_HARDWEP; - /* Get default MAC address */ + unit->ethernet_offset = P2_FRM_ETHFRAME; + unit->data_offset = P2_FRM_DATA; + unit->txcontrol_offset = P2_FRM_TXCONTROL; + unit->datalen_offset = P2_FRM_DATALEN; - P2DoCmd(unit, P2_CMD_ACCESS, P2_REC_ADDRESS, base); + if(unit->firmware_type == LUCENT_FIRMWARE) + { + if(version > 6 || version == 6 && revision >= 6) + unit->flags |= UNITF_HASADHOC; + if(version >= 9) + { + unit->flags |= UNITF_HASTKIP | UNITF_HARDTKIP; + unit->txcontrol_offset = P2_FRM_ALTTXCONTROL; + } + } + else if(unit->firmware_type >= HERMES2_FIRMWARE) + { + unit->flags |= UNITF_HASADHOC | UNITF_HASTKIP | UNITF_HARDTKIP; + unit->ethernet_offset = P2_H2FRM_ETHFRAME; + unit->data_offset = P2_H2FRM_DATA; + unit->txcontrol_offset = P2_H2FRM_TXCONTROL; + unit->datalen_offset = P2_H2FRM_DATALEN; + } + else if(unit->firmware_type == INTERSIL_FIRMWARE) + { + unit->flags |= UNITF_HASADHOC | UNITF_HASWEP; + if(version == 1 && revision >= 7) + unit->flags |= UNITF_HASTKIP | UNITF_HASCCMP; + } + + /* Get default channel and MAC address */ + unit->channel = P2GetWord(unit, P2_REC_OWNCHNL, base); + P2DoCmd(unit, P2_CMD_ACCESS, P2_REC_ADDRESS, base); P2Seek(unit, 1, P2_REC_ADDRESS, 4, base); unit->WordsIn(unit->card, P2_REG_DATA1, (UWORD *)address, ETH_ADDRESSSIZE / 2); @@ -456,8 +583,47 @@ BOOL InitialiseAdapter(struct DevUnit *unit, BOOL reinsertion, /* Get initial on-card TX buffer */ - unit->tx_frame_id = P2AllocMem(unit, - P2_H2FRM_ETHFRAME + ETH_SNAPHEADERSIZE + ETH_MTU, base); + unit->tx_frame_id = P2AllocMem(unit, FRAME_BUFFER_SIZE, base); + + /* Set IV sizes */ + + if((unit->flags & UNITF_HARDWEP) == 0) + unit->iv_sizes[S2ENC_WEP] = IV_SIZE; + if((unit->flags & UNITF_HARDTKIP) == 0) + unit->iv_sizes[S2ENC_TKIP] = EIV_SIZE; + unit->iv_sizes[S2ENC_CCMP] = EIV_SIZE; + + /* Set encryption functions */ + + unit->fragment_encrypt_functions[S2ENC_NONE] = WriteClearFragment; + + if((unit->flags & UNITF_HARDWEP) != 0) + unit->fragment_encrypt_functions[S2ENC_WEP] = WriteClearFragment; + else + unit->fragment_encrypt_functions[S2ENC_WEP] = EncryptWEPFragment; + + if((unit->flags & UNITF_HARDTKIP) != 0) + unit->fragment_encrypt_functions[S2ENC_TKIP] = WriteClearFragment; + else + unit->fragment_encrypt_functions[S2ENC_TKIP] = EncryptTKIPFragment; + + unit->fragment_encrypt_functions[S2ENC_CCMP] = EncryptCCMPFragment; + + /* Set decryption functions */ + + unit->fragment_decrypt_functions[S2ENC_NONE] = ReadClearFragment; + + if((unit->flags & UNITF_HARDWEP) != 0) + unit->fragment_decrypt_functions[S2ENC_WEP] = ReadClearFragment; + else + unit->fragment_decrypt_functions[S2ENC_WEP] = DecryptWEPFragment; + + if((unit->flags & UNITF_HARDTKIP) != 0) + unit->fragment_decrypt_functions[S2ENC_TKIP] = ReadClearFragment; + else + unit->fragment_decrypt_functions[S2ENC_TKIP] = DecryptTKIPFragment; + + unit->fragment_decrypt_functions[S2ENC_CCMP] = DecryptCCMPFragment; } /* Return */ @@ -483,8 +649,9 @@ BOOL InitialiseAdapter(struct DevUnit *unit, BOOL reinsertion, VOID ConfigureAdapter(struct DevUnit *unit, struct DevBase *base) { - UWORD i, key_length, port_type; - const struct WEPKey *keys; + UWORD i, key_length, port_type, lowest_enc = S2ENC_CCMP, + highest_enc = S2ENC_NONE, enc_flags, size, value; + const struct KeyUnion *keys; /* Set MAC address */ @@ -499,16 +666,36 @@ VOID ConfigureAdapter(struct DevUnit *unit, struct DevBase *base) /* Set wireless parameters */ if(unit->mode == S2PORT_ADHOC) + { P2SetWord(unit, P2_REC_OWNCHNL, unit->channel, base); + P2SetID(unit, P2_REC_OWNSSID, unit->ssid, unit->ssid_length, base); + } if(unit->mode == S2PORT_MANAGED) port_type = 1; else port_type = 0; - P2SetWord(unit, P2_REC_PORTTYPE, port_type, base); + if((unit->flags & UNITF_ONLINE) == 0) + P2SetWord(unit, P2_REC_PORTTYPE, port_type, base); P2SetWord(unit, P2_REC_CREATEIBSS, unit->mode == S2PORT_ADHOC, base); + P2SetID(unit, P2_REC_DESIREDSSID, unit->ssid, unit->ssid_length, base); - P2SetID(unit, P2_REC_DESIREDSSID, unit->ssid, unit->ssid_length, - base); + /* Determine highest encryption type in use */ + + for(i = 0; i < WIFI_KEYCOUNT; i++) + { + if(unit->keys[i].type > highest_enc) + highest_enc = unit->keys[i].type; + if(unit->keys[i].type < lowest_enc) + lowest_enc = unit->keys[i].type; + } + + if(unit->wpa_ie[1] != 0) + highest_enc = S2ENC_TKIP; // TO DO: Be more specific? + + /* Allow reception of beacon/probe-response frames */ + + if(unit->firmware_type == INTERSIL_FIRMWARE) + P2SetWord(unit, P2_REC_RXMGMTFRAMES, 1, base); /* Transmit at 11Mbps, with fallback */ @@ -516,60 +703,112 @@ VOID ConfigureAdapter(struct DevUnit *unit, struct DevBase *base) || unit->firmware_type == SYMBOL_FIRMWARE) P2SetWord(unit, P2_REC_TXRATE, 0xf, base); - /* Configure encryption */ + /* Configure authentication and encryption */ - if(unit->encryption == S2ENC_WEP) + if(unit->firmware_type >= LUCENT_FIRMWARE) { - if(unit->firmware_type == LUCENT_FIRMWARE - || unit->firmware_type == HERMES2_FIRMWARE) + /* Set authentication and encryption modes */ + + P2SetWord(unit, P2_REC_ALTAUTHTYPE, unit->auth_types, base); + + P2SetWord(unit, P2_REC_ALTENCRYPTION, highest_enc, base); + + /* Set up firmware-based WEP encryption if appropriate */ + + if(highest_enc == S2ENC_WEP && (unit->flags & UNITF_HARDWEP) != 0) { - P2SetWord(unit, P2_REC_ALTENCRYPTION, TRUE, base); - P2SetWord(unit, P2_REC_ALTTXCRYPTKEY, 0, base); + P2SetWord(unit, P2_REC_ALTTXCRYPTKEY, unit->tx_key_no, base); P2Seek(unit, 1, P2_REC_DEFLTCRYPTKEYS, 0, base); unit->LEWordOut(unit->card, P2_REG_DATA1, P2_ALTWEPRECLEN); unit->LEWordOut(unit->card, P2_REG_DATA1, P2_REC_DEFLTCRYPTKEYS); keys = unit->keys; - for(i = 0; i < IEEE802_11_WEPKEYCOUNT; i++) + for(i = 0; i < WIFI_KEYCOUNT; i++) { - key_length = keys[i].length; + key_length = keys[i].u.wep.length; if(key_length == 0) - key_length = IEEE802_11_WEP64LEN; + key_length = WIFI_WEP128LEN; unit->LEWordOut(unit->card, P2_REG_DATA1, key_length); - unit->WordsOut(unit->card, P2_REG_DATA1, (UWORD *)keys[i].key, - (key_length + 1) / 2); + unit->WordsOut(unit->card, P2_REG_DATA1, + (UWORD *)keys[i].u.wep.key, (key_length + 1) / 2); } P2DoCmd(unit, P2_CMD_ACCESS | P2_CMDF_WRITE, P2_REC_DEFLTCRYPTKEYS, base); } - else + + /* Set key management suite to PSK */ + + if(highest_enc > S2ENC_WEP) { - P2SetWord(unit, P2_REC_ENCRYPTION, - P2_REC_ENCRYPTIONF_NOPLAINTEXT | P2_REC_ENCRYPTIONF_ENABLE, - base); + value = (unit->firmware_type >= HERMES2_FIRMWARE) ? 4 : 2; + P2SetWord(unit, P2_REC_KEYMGMTSUITE, value, base); + } + } + else + { + /* Set authentication mode */ + + P2SetWord(unit, P2_REC_AUTHTYPE, unit->auth_types, base); + + /* Set encryption flags */ + + if(highest_enc > S2ENC_NONE) + enc_flags = P2_REC_ENCRYPTIONF_ENABLE; + else + enc_flags = 0; + + if(highest_enc > S2ENC_WEP + || highest_enc == S2ENC_WEP && (unit->flags & UNITF_HARDWEP) == 0) + enc_flags |= P2_REC_ENCRYPTIONF_HOSTDECRYPT + | P2_REC_ENCRYPTIONF_HOSTENCRYPT; + P2SetWord(unit, P2_REC_ENCRYPTION, enc_flags, base); - P2SetWord(unit, P2_REC_TXCRYPTKEY, 0, base); + /* Set up firmware-based WEP encryption if appropriate */ + + if(highest_enc == S2ENC_WEP && (unit->flags & UNITF_HARDWEP) != 0) + { + P2SetWord(unit, P2_REC_TXCRYPTKEY, unit->tx_key_no, base); keys = unit->keys; - for(i = 0; i < IEEE802_11_WEPKEYCOUNT; i++) + for(i = 0; i < WIFI_KEYCOUNT; i++) { - key_length = keys[i].length; + key_length = keys[i].u.wep.length; if(key_length == 0) - key_length = keys[unit->key_no].length; - P2SetData(unit, P2_REC_CRYPTKEY0 + i, keys[i].key, + key_length = keys[unit->tx_key_no].u.wep.length; + P2SetData(unit, P2_REC_CRYPTKEY0 + i, keys[i].u.wep.key, key_length, base); } } + + /* Set or clear WPA IE */ + + if(highest_enc > S2ENC_WEP) + size = unit->wpa_ie[1] + 2; + else + size = 0; + P2SetID(unit, P2_REC_WPAIE, unit->wpa_ie, size, base); + + /* Let supplicant handle association and roaming */ + + P2SetWord(unit, P2_REC_ROAMINGMODE, 3, base); } - else + + /* Restart the transceiver if we're already online */ + + if((unit->flags & UNITF_ONLINE) != 0) { - if(unit->firmware_type == LUCENT_FIRMWARE - || unit->firmware_type == HERMES2_FIRMWARE) - P2SetWord(unit, P2_REC_ALTENCRYPTION, FALSE, base); - else - P2SetWord(unit, P2_REC_ENCRYPTION, - P2_REC_ENCRYPTIONF_HOSTDECRYPT | P2_REC_ENCRYPTIONF_HOSTENCRYPT, + P2DoCmd(unit, P2_CMD_DISABLE, 0, base); + P2DoCmd(unit, P2_CMD_ENABLE, 0, base); + + /* Attempt to join specified network */ + + if(unit->firmware_type == INTERSIL_FIRMWARE) + { + *(UWORD *)(unit->bssid + ETH_ADDRESSSIZE) = + MakeLEWord(unit->channel); + P2SetData(unit, P2_REC_JOIN, unit->bssid, ETH_ADDRESSSIZE + 2, base); + } } /* Return */ @@ -644,6 +883,7 @@ VOID GoOffline(struct DevUnit *unit, struct DevBase *base) /* Stop interrupts */ unit->LEWordOut(unit->card, P2_REG_INTMASK, 0); + unit->LEWordOut(unit->card, P2_REG_ACKEVENTS, 0xffff); /* Update statistics */ @@ -666,76 +906,220 @@ VOID GoOffline(struct DevUnit *unit, struct DevBase *base) -/****i* prism2.device/GetDefaults ******************************************* +/****i* prism2.device/SetOptions ******************************************* * * NAME -* GetDefaults +* SetOptions -- Set and use interface options. * * SYNOPSIS -* GetDefaults(unit) -* -* VOID GetDefaults(struct DevUnit *); +* SetOptions(unit, tag_list) * -* NOTES -* This function only exists for use in conjunction with the -* SetPrism2Defaults utility. +* VOID SetOptions(struct DevUnit *, struct TagItem *); * **************************************************************************** * */ -static VOID GetDefaults(struct DevUnit *unit, struct DevBase *base) +VOID SetOptions(struct DevUnit *unit, const struct TagItem *tag_list, + struct DevBase *base) { - const struct NamedObject *options; - struct TagItem *tag_list, *tag_item; + struct TagItem *tag_item, *tlist = (struct TagItem *)tag_list; const TEXT *id; UPINT length; - UWORD encryption; - const struct WEPKey *key; + const UBYTE *ie; - options = FindNamedObject(NULL, options_name, NULL); - if(options != NULL) + while((tag_item = NextTagItem(&tlist)) != NULL) { - tag_list = (APTR)options->no_Object; - - while((tag_item = NextTagItem(&tag_list)) != NULL) + switch(tag_item->ti_Tag) { - switch(tag_item->ti_Tag) + case S2INFO_SSID: + id = (const TEXT *)tag_item->ti_Data; + length = StrLen(id); + CopyMem(id, unit->ssid, length); + unit->ssid_length = length; + break; + + case S2INFO_BSSID: + CopyMem((APTR)tag_item->ti_Data, unit->bssid, ETH_ADDRESSSIZE); + break; + + case S2INFO_DefaultKeyNo: + unit->tx_key_no = tag_item->ti_Data; + break; + + case S2INFO_PortType: + unit->mode = tag_item->ti_Data; + break; + + case S2INFO_Channel: + if(tag_item->ti_Data != 0) // ??? + unit->channel = tag_item->ti_Data; + break; + + case S2INFO_WPAInfo: + if(tag_item->ti_Data != (UPINT)NULL) + { + /* Hermes-II uses an "unusual" WPA IE in its association + request. So we use a matching IE everywhere else too */ + + if(unit->firmware_type >= HERMES2_FIRMWARE) + ie = h2_wpa_ie; + else + ie = (const UBYTE *)tag_item->ti_Data; + CopyMem(ie, unit->wpa_ie, ie[1] + 2); + } + else + { + unit->wpa_ie[0] = 0; + unit->wpa_ie[1] = 0; + } + break; + + case S2INFO_AuthTypes: + unit->auth_types = tag_item->ti_Data; + break; + } + } + + return; +} + + + +/****i* prism2.device/SetKey *********************************************** +* +* NAME +* SetKey -- Set an encryption key. +* +* SYNOPSIS +* SetKey(unit, index, type, key, key_length, +* rx_counter) +* +* VOID SetKey(struct DevUnit *, ULONG, ULONG, UBYTE *, ULONG, +* UBYTE *); +* +**************************************************************************** +* +*/ + +VOID SetKey(struct DevUnit *unit, ULONG index, ULONG type, const UBYTE *key, + ULONG key_length, const UBYTE *rx_counter, struct DevBase *base) +{ + struct KeyUnion *slot; + const UBYTE tx_counter[8] = {0, 0, 0, 0, 0x10, 0, 0, 0}; + UWORD i; + struct EClockVal eclock; + + Disable(); + slot = &unit->keys[index]; + switch(type) + { + case S2ENC_WEP: + CopyMem(key, slot->u.wep.key, key_length); + slot->u.wep.length = key_length; + + if((unit->flags & UNITF_HARDWEP) == 0) + { + /* Create a reasonably random IV */ + + ReadEClock(&eclock); + slot->u.wep.tx_iv = FastRand(eclock.ev_lo ^ eclock.ev_hi); + } + + break; + + case S2ENC_TKIP: + CopyMem(key, slot->u.tkip.key, 16); + CopyMem(key + 16, slot->u.tkip.tx_mic_key, MIC_SIZE); + CopyMem(key + 24, slot->u.tkip.rx_mic_key, MIC_SIZE); + slot->u.tkip.tx_iv_low = 0; + slot->u.tkip.tx_iv_high = 0; + slot->u.tkip.rx_iv_low = LEWord(*(UWORD *)rx_counter); + slot->u.tkip.rx_iv_high = LELong(*(ULONG *)(rx_counter + 2)); + slot->u.tkip.tx_ttak_set = FALSE; + slot->u.tkip.rx_ttak_set = FALSE; + + if((unit->flags & UNITF_HARDTKIP) != 0) { - case P2OPT_SSID: - id = (const TEXT *)tag_item->ti_Data; - length = StrLen(id); - CopyMem(id, unit->ssid, length); - unit->ssid_length = length; - break; - - case P2OPT_Encryption: - encryption = tag_item->ti_Data; - if((unit->flags & UNITF_HASWEP) != 0) - unit->encryption = encryption; - break; - - case P2OPT_WEPKey: - key = (APTR)tag_item->ti_Data; - if((unit->flags & UNITF_HASWEP) != 0) + /* For Hermes, load parameters for hardware encryption. The + pairwise key is treated differently from group keys on + Hermes-II, but not on Hermes-I */ + + if(unit->firmware_type >= HERMES2_FIRMWARE && index == 0) { - unit->keys[0].length = key->length; - CopyMem(key->key, &unit->keys[0].key, key->length); + P2Seek(unit, 1, P2_REC_ADDMAPPEDTKIPKEY, 0, base); + unit->LEWordOut(unit->card, P2_REG_DATA1, 28); + unit->LEWordOut(unit->card, P2_REG_DATA1, + P2_REC_ADDMAPPEDTKIPKEY); + unit->WordsOut(unit->card, P2_REG_DATA1, + (UWORD *)unit->bssid, ETH_ADDRESSSIZE / 2); + unit->WordsOut(unit->card, P2_REG_DATA1, (UWORD *)key, + 16 / 2); + unit->WordsOut(unit->card, P2_REG_DATA1, (UWORD *)tx_counter, + 8 / 2); + unit->WordsOut(unit->card, P2_REG_DATA1, (UWORD *)rx_counter, + 6 / 2); + unit->LEWordOut(unit->card, P2_REG_DATA1, 0); + unit->WordsOut(unit->card, P2_REG_DATA1, (UWORD *)key + 16, + 16 / 2); + P2DoCmd(unit, P2_CMD_ACCESS | P2_CMDF_WRITE, + P2_REC_ADDMAPPEDTKIPKEY, base); } - break; - - case P2OPT_PortType: - unit->mode = tag_item->ti_Data; - break; + else + { + P2Seek(unit, 1, P2_REC_ADDDEFAULTTKIPKEY, 0, base); + unit->LEWordOut(unit->card, P2_REG_DATA1, 26); + unit->LEWordOut(unit->card, P2_REG_DATA1, + P2_REC_ADDDEFAULTTKIPKEY); + if(index == unit->tx_key_no) + index |= 0x8000; + unit->LEWordOut(unit->card, P2_REG_DATA1, index); + unit->WordsOut(unit->card, P2_REG_DATA1, (UWORD *)rx_counter, + 6 / 2); + unit->LEWordOut(unit->card, P2_REG_DATA1, 0); + unit->WordsOut(unit->card, P2_REG_DATA1, (UWORD *)key, + 32 / 2); + unit->WordsOut(unit->card, P2_REG_DATA1, (UWORD *)tx_counter, + 8 / 2); + P2DoCmd(unit, P2_CMD_ACCESS | P2_CMDF_WRITE, + P2_REC_ADDDEFAULTTKIPKEY, base); + } + } + else + { + /* Convert key to native endianness */ - case P2OPT_Channel: - if(tag_item->ti_Data != 0) - unit->channel = tag_item->ti_Data; - break; + for(i = 0; i < 8; i++) + slot->u.tkip.key[i] = LEWord(slot->u.tkip.key[i]); } - } + + break; + + case S2ENC_CCMP: + CopyMem(key, slot->u.ccmp.key, 16); + slot->u.ccmp.tx_iv_low = 0; + slot->u.ccmp.tx_iv_high = 0; + slot->u.ccmp.rx_iv_low = LEWord(*(UWORD *)rx_counter); + slot->u.ccmp.rx_iv_high = LELong(*(ULONG *)(rx_counter + 2)); + slot->u.ccmp.stream_set = FALSE; + } + + /* Clear TKIP key if necessary */ + + if(slot->type == S2ENC_TKIP && type != S2ENC_TKIP) + { + if(unit->firmware_type >= HERMES2_FIRMWARE && index == 0) + P2SetData(unit, P2_REC_REMMAPPEDTKIPKEY, unit->bssid, + ETH_ADDRESSSIZE, base); + else if(unit->firmware_type >= LUCENT_FIRMWARE) + P2SetWord(unit, P2_REC_REMDEFAULTTKIPKEY, index, base); } + /* Update type of key in selected slot */ + + slot->type = type; + Enable(); + return; } @@ -1024,9 +1408,9 @@ struct TypeStats *FindTypeStats(struct DevUnit *unit, struct MinList *list, * FlushUnit * * SYNOPSIS -* FlushUnit(unit) +* FlushUnit(unit, last_queue, error) * -* VOID FlushUnit(struct DevUnit *); +* VOID FlushUnit(struct DevUnit *, UBYTE, BYTE); * **************************************************************************** * @@ -1045,7 +1429,7 @@ VOID FlushUnit(struct DevUnit *unit, UBYTE last_queue, BYTE error, { while((request = (APTR)GetMsg(unit->request_ports[i])) != NULL) { - request->io_Error = IOERR_ABORTED; + request->io_Error = error; ReplyMsg((APTR)request); } } @@ -1070,7 +1454,7 @@ VOID FlushUnit(struct DevUnit *unit, UBYTE last_queue, BYTE error, opener = request->ios2_BufferManagement; while((request = (APTR)GetMsg(&opener->read_port)) != NULL) { - request->io_Error = IOERR_ABORTED; + request->io_Error = error; ReplyMsg((APTR)request); } #endif @@ -1179,21 +1563,18 @@ BOOL StatusInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) static VOID RXInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) { - UWORD frame_status, offset, packet_size, frame_id, message_type; + UWORD frame_status, frame_id, ieee_length, frame_control, frame_type, + frame_subtype, encryption, key_no, buffer_no, old_length; struct DevBase *base; - BOOL is_orphan, accepted, is_snap; - ULONG packet_type; - UBYTE *buffer; - struct IOSana2Req *request, *request_tail; - struct Opener *opener, *opener_tail; - struct TypeStats *tracker; + BOOL is_good; + LONG frag_no; + UBYTE *buffer, *p, *frame, *data; base = unit->device; - buffer = unit->rx_buffer; while((unit->LEWordIn(unit->card, P2_REG_EVENTS) & P2_EVENTF_RX) != 0) { - unit->stats.PacketsReceived++; + is_good = TRUE; frame_id = unit->LEWordIn(unit->card, P2_REG_RXFID); P2Seek(unit, 1, frame_id, P2_FRM_STATUS, base); frame_status = unit->LEWordIn(unit->card, P2_REG_DATA1); @@ -1201,93 +1582,153 @@ static VOID RXInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) if((frame_status & (P2_FRM_STATUSF_BADCRYPT | P2_FRM_STATUSF_BADCRC)) == 0) { - /* Read packet header */ + /* Read frame descriptor from card */ + + P2Seek(unit, 1, frame_id, 0, base); + unit->WordsIn(unit->card, P2_REG_DATA1, + (UWORD *)unit->rx_descriptor, + (unit->ethernet_offset + ETH_HEADERSIZE) / 2); + frame = unit->rx_descriptor + unit->ethernet_offset; + ieee_length = BEWord(*(UWORD *)(frame + ETH_PACKET_IEEELEN)); + data = frame + ETH_PACKET_DATA; + unit->WordsIn(unit->card, P2_REG_DATA1, (UWORD *)data, + (ieee_length + MIC_SIZE + 1) / 2); + frame_control = + LEWord(*(UWORD *)(unit->rx_descriptor + P2_FRM_HEADER)); + + /* Get buffer to store fragment in */ + + frag_no = LEWord(*(UWORD *)(unit->rx_descriptor + P2_FRM_HEADER + + WIFI_FRM_SEQCONTROL)); + buffer = GetRXBuffer(unit, frame + ETH_PACKET_SOURCE, frag_no, + &buffer_no, base); + + /* Get location to put new data */ + + if(buffer != NULL) + { + if((frag_no & 0xf ) > 0) + old_length = BEWord(*(UWORD *)(buffer + ETH_PACKET_IEEELEN)); + else + { + /* Copy header to new frame */ - is_orphan = TRUE; - if(unit->firmware_type == HERMES2_FIRMWARE) - offset = P2_H2FRM_ETHFRAME; - else - offset = P2_FRM_ETHFRAME; - P2Seek(unit, 1, frame_id, offset, base); - unit->WordsIn(unit->card, P2_REG_DATA1, (UWORD *)buffer, - ETH_SNAPHEADERSIZE / 2); + CopyMem(frame, buffer, ETH_HEADERSIZE); + old_length = 0; + } + p = buffer + ETH_HEADERSIZE + old_length; - if(AddressFilter(unit, buffer + ETH_PACKET_DEST, base)) - { - packet_size = BEWord(*((UWORD *)(buffer + ETH_PACKET_IEEELEN))) - + ETH_HEADERSIZE; - message_type = frame_status >> P2_FRM_STATUSB_MSGTYPE; - is_snap = message_type == P2_MSGTYPE_RFC1042 || - message_type == P2_MSGTYPE_TUNNEL; - if(is_snap) + /* Get encryption type and key index */ + + if((frame_control & WIFI_FRM_CONTROLF_WEP) != 0) { - packet_type = - BEWord(*((UWORD *)(buffer + ETH_PACKET_SNAPTYPE))); - packet_size -= ETH_SNAPHEADERSIZE - ETH_HEADERSIZE; + key_no = data[3] >> 6 & 0x3; + encryption = unit->keys[key_no].type; } else - packet_type = - BEWord(*((UWORD *)(buffer + ETH_PACKET_IEEELEN))); + encryption = S2ENC_NONE; - opener = (APTR)unit->openers.mlh_Head; - opener_tail = (APTR)&unit->openers.mlh_Tail; + /* Append fragment to frame, decrypting/checking fragment if + necessary */ - /* Offer packet to every opener */ + is_good = unit->fragment_decrypt_functions[encryption](unit, + unit->rx_descriptor + P2_FRM_HEADER, data, &ieee_length, p, + base); + + /* Update length in frame being built with current fragment, or + increment bad frame counter if fragment is bad */ - while(opener != opener_tail) + if(is_good) { - request = (APTR)opener->read_port.mp_MsgList.lh_Head; - request_tail = (APTR)&opener->read_port.mp_MsgList.lh_Tail; - accepted = FALSE; + ieee_length += old_length; + *(UWORD *)(buffer + ETH_PACKET_IEEELEN) = + MakeBEWord(ieee_length); + } + else + unit->stats.BadData++; - /* Offer packet to each request until it's accepted */ + /* If all fragments have arrived, process the complete frame */ - while(request != request_tail && !accepted) + if((frame_control & WIFI_FRM_CONTROLF_MOREFRAGS) == 0) + { + if(is_good) { - if(request->ios2_PacketType == packet_type) + /* Decrypt complete frame if necessary */ + + data = buffer + ETH_HEADERSIZE; + if(encryption == S2ENC_TKIP) { - CopyPacket(unit, request, packet_size, packet_type, - buffer, !is_orphan, frame_id, base); - accepted = TRUE; + /* Hermes cards don't include MIC in frame length, so + we need to grab the MIC from the original RX + descriptor here */ + + if(unit->firmware_type >= LUCENT_FIRMWARE) + { + CopyMem(frame + ETH_PACKET_DATA + ieee_length, + data + ieee_length, MIC_SIZE); + ieee_length += MIC_SIZE; + } + + /* Check Michael MIC */ + +#ifndef __mc68000 + is_good = TKIPDecryptFrame(unit, buffer, data, + ieee_length, data, key_no, base); +#endif + ieee_length -= MIC_SIZE; + *(UWORD *)(buffer + ETH_PACKET_IEEELEN) = + MakeBEWord(ieee_length); + if(!is_good) + unit->stats.BadData++; } - request = - (APTR)request->ios2_Req.io_Message.mn_Node.ln_Succ; } - if(accepted) - is_orphan = FALSE; - opener = (APTR)opener->node.mln_Succ; - } + if(is_good) + { + /* Get frame's 802.11 type and subtype */ - /* If packet was unwanted, give it to S2_READORPHAN request */ + frame_type = (frame_control & WIFI_FRM_CONTROLF_TYPE) + >> WIFI_FRM_CONTROLB_TYPE; + frame_subtype = + (frame_control & WIFI_FRM_CONTROLF_SUBTYPE) + >> WIFI_FRM_CONTROLB_SUBTYPE; - if(is_orphan) - { - unit->stats.UnknownTypesReceived++; - if(!IsMsgPortEmpty(unit->request_ports[ADOPT_QUEUE])) - { - CopyPacket(unit, - (APTR)unit->request_ports[ADOPT_QUEUE]-> - mp_MsgList.lh_Head, packet_size, packet_type, buffer, - FALSE, frame_id, base); + /* If it's a management frame, process it internally; + otherwise distribute it to clients after filtering */ + + if(frame_type == WIFI_FRMTYPE_MGMT) + { + if(frame_subtype == 0x5) + { + CopyMem(unit->rx_descriptor + P2_FRM_HEADER + + WIFI_FRM_ADDRESS3, buffer + ETH_PACKET_SOURCE, + ETH_ADDRESSSIZE); + SaveBeacon(unit, buffer, base); + } + } + else if(AddressFilter(unit, buffer + ETH_PACKET_DEST, + base)) + { + unit->stats.PacketsReceived++; + DistributeRXPacket(unit, buffer, base); + } } } - /* Update remaining statistics */ + /* Mark fragment buffer as unused for next time */ - if(packet_type <= ETH_MTU) - packet_type = ETH_MTU; - tracker = - FindTypeStats(unit, &unit->type_trackers, packet_type, base); - if(tracker != NULL) - { - tracker->stats.PacketsReceived++; - tracker->stats.BytesReceived += packet_size; - } + unit->rx_fragment_nos[buffer_no] = -1; } + else + ReportEvents(unit, S2EVENT_ERROR | S2EVENT_RX, base); } else { + is_good = FALSE; + } + + if(!is_good) + { ReportEvents(unit, S2EVENT_ERROR | S2EVENT_HARDWARE | S2EVENT_RX, base); } @@ -1303,80 +1744,233 @@ static VOID RXInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) unit->LEWordOut(unit->card, P2_REG_INTMASK, unit->LEWordIn(unit->card, P2_REG_INTMASK) | P2_EVENTF_RX); Enable(); + return; } -/****i* prism2.device/CopyPacket ******************************************* +/****i* prism2.device/GetRXBuffer ****************************************** * * NAME -* CopyPacket -- Copy packet to client's buffer. +* GetRXBuffer -- Find an appropriate RX buffer to use. * * SYNOPSIS -* CopyPacket(unit, request, packet_size, packet_type, -* buffer, all_read, frame_id) +* buffer = GetRXBuffer(unit, address, frag_no) * -* VOID CopyPacket(struct DevUnit *, struct IOSana2Req *, UWORD, UWORD, -* UBYTE *, BOOL, UWORD); +* UBYTE *GetRXBuffer(struct DevUnit *, UBYTE *, UWORD); * **************************************************************************** * */ -static VOID CopyPacket(struct DevUnit *unit, struct IOSana2Req *request, - UWORD packet_size, UWORD packet_type, UBYTE *buffer, BOOL all_read, - UWORD frame_id, struct DevBase *base) +static UBYTE *GetRXBuffer(struct DevUnit *unit, const UBYTE *address, + UWORD frag_no, UWORD *buffer_no, struct DevBase *base) { - struct Opener *opener; - BOOL filtered = FALSE; - UWORD size, *p; - - /* Set multicast and broadcast flags */ - - request->ios2_Req.io_Flags &= ~(SANA2IOF_BCAST | SANA2IOF_MCAST); - if((*((ULONG *)(buffer + ETH_PACKET_DEST)) == 0xffffffff) && - (*((UWORD *)(buffer + ETH_PACKET_DEST + 4)) == 0xffff)) - request->ios2_Req.io_Flags |= SANA2IOF_BCAST; - else if((buffer[ETH_PACKET_DEST] & 0x1) != 0) - request->ios2_Req.io_Flags |= SANA2IOF_MCAST; + UWORD i; + UBYTE *buffer; + LONG n; + BOOL found; - /* Set source and destination addresses and packet type */ + buffer = unit->rx_buffers; + for(i = 0, found = FALSE; i < RX_BUFFER_COUNT * 2 && !found; i++) + { + /* Throw away old buffer contents if we didn't find a free slot the + first time around */ - CopyMem(buffer + ETH_PACKET_SOURCE, request->ios2_SrcAddr, - ETH_ADDRESSSIZE); - CopyMem(buffer + ETH_PACKET_DEST, request->ios2_DstAddr, - ETH_ADDRESSSIZE); - request->ios2_PacketType = packet_type; + if(i >= RX_BUFFER_COUNT) + unit->rx_fragment_nos[i % RX_BUFFER_COUNT] = -1; - /* Read rest of packet and de-encapsulate SNAP frames */ + /* For a frame's first fragment, find an empty slot; for subsequent + fragments, find a slot with matching source address */ - if(!all_read) - { - if(packet_type > ETH_MTU) + n = unit->rx_fragment_nos[i % RX_BUFFER_COUNT]; + if(n == -1 && (frag_no & 0xf) == 0 + || *((ULONG *)(buffer + ETH_PACKET_SOURCE)) + == *((ULONG *)(address)) + && *((UWORD *)(buffer + ETH_PACKET_SOURCE + 4)) + == *((UWORD *)(address + 4))) { - p = (UWORD *)(buffer + ETH_PACKET_TYPE); - size = packet_size - ETH_HEADERSIZE; - *p++ = MakeBEWord(packet_type); + found = TRUE; + if(n == -1) + unit->rx_fragment_nos[i % RX_BUFFER_COUNT] = frag_no; + *buffer_no = i; } else - { - p = (UWORD *)(buffer + ETH_SNAPHEADERSIZE); - size = packet_size - ETH_SNAPHEADERSIZE; - } - unit->WordsIn(unit->card, P2_REG_DATA1, p, (size + 1) / 2); + buffer += FRAME_BUFFER_SIZE; } - /* Adjust for cooked packet request */ + if(!found) + buffer = NULL; - if((request->ios2_Req.io_Flags & SANA2IOF_RAW) == 0) - { + return buffer; +} + + + +/****i* prism2.device/DistributeRXPacket *********************************** +* +* NAME +* DistributeRXPacket -- Send a packet to all appropriate destinations. +* +* SYNOPSIS +* DistributeRXPacket(unit, frame) +* +* VOID DistributeRXPacket(struct DevUnit *, UBYTE *); +* +**************************************************************************** +* +*/ + +static VOID DistributeRXPacket(struct DevUnit *unit, UBYTE *frame, + struct DevBase *base) +{ + UWORD packet_size, ieee_length; + BOOL is_orphan = TRUE, accepted, is_snap = FALSE; + ULONG packet_type; + UBYTE *buffer; + const UBYTE *template = snap_template; + struct IOSana2Req *request, *request_tail; + struct Opener *opener, *opener_tail; + struct TypeStats *tracker; + + ieee_length = BEWord(*(UWORD *)(frame + ETH_PACKET_IEEELEN)); + packet_size = ETH_HEADERSIZE + ieee_length; + if(ieee_length >= SNAP_HEADERSIZE) + is_snap = *(const ULONG *)(frame + ETH_PACKET_DATA) + == *(const ULONG *)template; + + /* De-encapsulate SNAP packets and get packet type */ + + if(is_snap) + { + buffer = unit->rx_buffer; + packet_size -= SNAP_HEADERSIZE; + CopyMem(frame, buffer, ETH_PACKET_TYPE); + CopyMem(frame + ETH_HEADERSIZE + SNAP_FRM_TYPE, + buffer + ETH_PACKET_TYPE, packet_size - ETH_PACKET_TYPE); + } + else + buffer = frame; + + packet_type = BEWord(*((UWORD *)(buffer + ETH_PACKET_TYPE))); + + if(packet_size <= ETH_MAXPACKETSIZE) + { + /* Offer packet to every opener */ + + opener = (APTR)unit->openers.mlh_Head; + opener_tail = (APTR)&unit->openers.mlh_Tail; + + while(opener != opener_tail) + { + request = (APTR)opener->read_port.mp_MsgList.lh_Head; + request_tail = (APTR)&opener->read_port.mp_MsgList.lh_Tail; + accepted = FALSE; + + /* Offer packet to each request until it's accepted */ + + while(request != request_tail && !accepted) + { + if(request->ios2_PacketType == packet_type) + { + CopyPacket(unit, request, packet_size, packet_type, + buffer, base); + accepted = TRUE; + } + request = + (APTR)request->ios2_Req.io_Message.mn_Node.ln_Succ; + } + + if(accepted) + is_orphan = FALSE; + opener = (APTR)opener->node.mln_Succ; + } + + /* If packet was unwanted, give it to S2_READORPHAN request */ + + if(is_orphan) + { + unit->stats.UnknownTypesReceived++; + if(!IsMsgPortEmpty(unit->request_ports[ADOPT_QUEUE])) + { + CopyPacket(unit, + (APTR)unit->request_ports[ADOPT_QUEUE]-> + mp_MsgList.lh_Head, packet_size, packet_type, buffer, + base); + } + } + + /* Update remaining statistics */ + + if(packet_type <= ETH_MTU) + packet_type = ETH_MTU; + tracker = + FindTypeStats(unit, &unit->type_trackers, packet_type, base); + if(tracker != NULL) + { + tracker->stats.PacketsReceived++; + tracker->stats.BytesReceived += packet_size; + } + } + else + unit->stats.BadData++; + + return; +} + + + +/****i* prism2.device/CopyPacket ******************************************* +* +* NAME +* CopyPacket -- Copy packet to client's buffer. +* +* SYNOPSIS +* CopyPacket(unit, request, packet_size, packet_type, +* buffer) +* +* VOID CopyPacket(struct DevUnit *, struct IOSana2Req *, UWORD, UWORD, +* UBYTE *); +* +**************************************************************************** +* +*/ + +static VOID CopyPacket(struct DevUnit *unit, struct IOSana2Req *request, + UWORD packet_size, UWORD packet_type, UBYTE *buffer, + struct DevBase *base) +{ + struct Opener *opener; + BOOL filtered = FALSE; + + /* Set multicast and broadcast flags */ + + request->ios2_Req.io_Flags &= ~(SANA2IOF_BCAST | SANA2IOF_MCAST); + if((*((ULONG *)(buffer + ETH_PACKET_DEST)) == 0xffffffff) && + (*((UWORD *)(buffer + ETH_PACKET_DEST + 4)) == 0xffff)) + request->ios2_Req.io_Flags |= SANA2IOF_BCAST; + else if((buffer[ETH_PACKET_DEST] & 0x1) != 0) + request->ios2_Req.io_Flags |= SANA2IOF_MCAST; + + /* Set source and destination addresses and packet type */ + + CopyMem(buffer + ETH_PACKET_SOURCE, request->ios2_SrcAddr, + ETH_ADDRESSSIZE); + CopyMem(buffer + ETH_PACKET_DEST, request->ios2_DstAddr, + ETH_ADDRESSSIZE); + request->ios2_PacketType = packet_type; + + /* Adjust for cooked packet request */ + + if((request->ios2_Req.io_Flags & SANA2IOF_RAW) == 0) + { packet_size -= ETH_PACKET_DATA; buffer += ETH_PACKET_DATA; } #ifdef USE_HACKS else - packet_size += 4; /* Needed for Shapeshifter & Fusion? */ + packet_size += 4; /* Needed for Shapeshifter & Fusion */ #endif request->ios2_DataLength = packet_size; @@ -1466,6 +2060,40 @@ static BOOL AddressFilter(struct DevUnit *unit, UBYTE *address, +/****i* prism2.device/SaveBeacon ******************************************* +* +* NAME +* SaveBeacon -- Save beacon frame for later examination. +* +* SYNOPSIS +* SaveBeacon(unit, frame) +* +* VOID SaveBeacon(struct DevUnit *, UBYTE *); +* +**************************************************************************** +* +*/ + +static VOID SaveBeacon(struct DevUnit *unit, const UBYTE *frame, + struct DevBase *base) +{ + UWORD size; + + /* Store frame for later matching with scan results */ + + size = ETH_HEADERSIZE + BEWord(*(UWORD *)(frame + ETH_PACKET_IEEELEN)); + if(unit->next_beacon + size < unit->beacons + BEACON_BUFFER_SIZE) + { + CopyMem(frame, unit->next_beacon, size); + unit->beacon_count++; + unit->next_beacon += size + sizeof(ULONG) & ~3; + } + + return; +} + + + /****i* prism2.device/TXInt ************************************************ * * NAME @@ -1490,9 +2118,11 @@ static BOOL AddressFilter(struct DevUnit *unit, UBYTE *address, static VOID TXInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) { - UWORD i, packet_size, data_size, packet_type, ieee_length, - frame_id; - UBYTE *buffer; + UWORD i, packet_size, send_size, packet_type, data_size, body_size = 0, + frame_id, encryption, control_value, subtype; + UBYTE *buffer, *desc = unit->tx_descriptor, *plaintext, *ciphertext, + *header, mic_header[ETH_ADDRESSSIZE * 2], *q; + const UBYTE *p, *dest, *source; struct DevBase *base; struct IOSana2Req *request; BOOL is_ieee; @@ -1508,12 +2138,26 @@ static VOID TXInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) if(unit->tx_frame_id != 0 && !IsMsgPortEmpty(port)) { - request = (APTR)port->mp_MsgList.lh_Head; - data_size = packet_size = request->ios2_DataLength; + /* Get next request and full packet size */ + request = (APTR)port->mp_MsgList.lh_Head; + packet_size = request->ios2_DataLength; if((request->ios2_Req.io_Flags & SANA2IOF_RAW) == 0) packet_size += ETH_PACKET_DATA; + /* Determine encryption type and frame subtype */ + + if(packet_size > ETH_HEADERSIZE) + { + encryption = unit->keys[unit->tx_key_no].type; + subtype = 0; + } + else + { + encryption = S2ENC_NONE; + subtype = 4; + } + /* Get packet data */ opener = request->ios2_BufferManagement; @@ -1526,7 +2170,8 @@ static VOID TXInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) if(buffer == NULL) { buffer = unit->tx_buffer; - if(!opener->tx_function(buffer, request->ios2_Data, data_size)) + if(!opener->tx_function(buffer, request->ios2_Data, + request->ios2_DataLength)) { error = S2ERR_NO_RESOURCES; wire_error = S2WERR_BUFF_ERROR; @@ -1538,75 +2183,153 @@ static VOID TXInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) if(error == 0) { - /* Get packet type or length */ + /* Get packet type and/or length */ + data_size = request->ios2_DataLength; if((request->ios2_Req.io_Flags & SANA2IOF_RAW) != 0) + { + data_size -= ETH_PACKET_DATA; packet_type = BEWord(*(UWORD *)(buffer + ETH_PACKET_TYPE)); + } else packet_type = request->ios2_PacketType; is_ieee = packet_type <= ETH_MTU; - /* Write packet descriptor */ + /* Get source and destination addresses */ - if(unit->firmware_type == HERMES2_FIRMWARE) + if((request->ios2_Req.io_Flags & SANA2IOF_RAW) != 0) { - P2Seek(unit, 0, unit->tx_frame_id, 0, base); - for(i = 0; i < P2_H2FRM_ETHFRAME / 2; i++) - unit->LEWordOut(unit->card, P2_REG_DATA0, 0); + dest = buffer; + source = buffer + ETH_ADDRESSSIZE; + buffer += ETH_ADDRESSSIZE * 2 + 2; } else { - P2Seek(unit, 0, unit->tx_frame_id, 0, base); - for(i = 0; i < P2_FRM_HEADER / 2; i++) - unit->LEWordOut(unit->card, P2_REG_DATA0, 0); - unit->LEWordOut(unit->card, P2_REG_DATA0, - IEEE802_11_FRMTYPE_DATA << IEEE802_11_FRM_CONTROLB_TYPE); - for(i++; i < P2_FRM_ETHFRAME / 2; i++) - unit->LEWordOut(unit->card, P2_REG_DATA0, 0); + dest = request->ios2_DstAddr; + source = unit->address; } - /* Write packet header */ + /* Clear frame descriptor as far as start of 802.11 header */ - if((request->ios2_Req.io_Flags & SANA2IOF_RAW) != 0) - { - unit->WordsOut(unit->card, P2_REG_DATA0, (UWORD *)buffer, - ETH_ADDRESSSIZE * 2 / 2); - buffer += ETH_HEADERSIZE; - } + q = desc; + for(i = 0; i < P2_FRM_HEADER; i++) + *q++ = 0; + header = q; + + /* Set TX control field */ + + control_value = P2_FRM_TXCONTROLF_NATIVE; + if(encryption == S2ENC_TKIP && (unit->flags & UNITF_HARDTKIP) != 0) + control_value |= unit->tx_key_no << P2_FRM_TXCONTROLB_MICKEYID + | P2_FRM_TXCONTROLF_MIC; + else if(encryption == S2ENC_NONE + && unit->firmware_type < LUCENT_FIRMWARE) + control_value |= P2_FRM_TXCONTROLF_NOENC; + + *(UWORD *)(desc + unit->txcontrol_offset) = + MakeLEWord(control_value); + + /* Write 802.11 header */ + + *(UWORD *)q = MakeLEWord( + (encryption == S2ENC_NONE ? 0 : WIFI_FRM_CONTROLF_WEP) + | (unit->mode == S2PORT_ADHOC ? 0 : WIFI_FRM_CONTROLF_TODS) + | subtype << WIFI_FRM_CONTROLB_SUBTYPE + | WIFI_FRMTYPE_DATA << WIFI_FRM_CONTROLB_TYPE); + q += 2; + + *(UWORD *)q = 0; + q += 2; + + if(unit->mode == S2PORT_ADHOC) + p = dest; else - { - unit->WordsOut(unit->card, P2_REG_DATA0, - (UWORD *)request->ios2_DstAddr, ETH_ADDRESSSIZE / 2); - unit->WordsOut(unit->card, P2_REG_DATA0, (UWORD *)unit->address, - ETH_ADDRESSSIZE / 2); - } + p = unit->bssid; + for(i = 0; i < ETH_ADDRESSSIZE; i++) + *q++ = *p++; - if(is_ieee) - { - ieee_length = packet_type; - } + for(i = 0, p = source; i < ETH_ADDRESSSIZE; i++) + *q++ = *p++; + + if(unit->mode == S2PORT_ADHOC) + p = unit->bssid; else + p = dest; + for(i = 0; i < ETH_ADDRESSSIZE; i++) + *q++ = *p++; + *(UWORD *)q = 0; + + /* Clear 802.3 header */ + + q = desc + unit->ethernet_offset; + for(i = 0; i < ETH_HEADERSIZE; i++) + *q++ = 0; + + /* Leave room for encryption overhead */ + + q = desc + unit->data_offset; + ciphertext = q; + q += unit->iv_sizes[encryption]; + plaintext = q; + + /* Write SNAP header */ + + if(!is_ieee) { - ieee_length = request->ios2_DataLength + ETH_SNAPHEADERSIZE - - ETH_HEADERSIZE; - if((request->ios2_Req.io_Flags & SANA2IOF_RAW) != 0) - ieee_length -= ETH_HEADERSIZE; + for(i = 0, p = snap_template; i < SNAP_FRM_TYPE; i++) + *q++ = *p++; + *(UWORD *)q = MakeBEWord(packet_type); + q += 2; + body_size += SNAP_HEADERSIZE; } - unit->BEWordOut(unit->card, P2_REG_DATA0, ieee_length); + /* Copy data into frame */ - if(!is_ieee) + CopyMem(buffer, q, data_size); + body_size += data_size; + + /* Append MIC to frame for TKIP */ + + if(encryption == S2ENC_TKIP) { - unit->WordsOut(unit->card, P2_REG_DATA0, (UWORD *)snap_stuff, - (ETH_PACKET_SNAPTYPE - ETH_HEADERSIZE) / 2); - unit->BEWordOut(unit->card, P2_REG_DATA0, packet_type); + q = mic_header; + for(i = 0, p = dest; i < ETH_ADDRESSSIZE; i++) + *q++ = *p++; + for(i = 0, p = source; i < ETH_ADDRESSSIZE; i++) + *q++ = *p++; + TKIPEncryptFrame(unit, mic_header, plaintext, body_size, + plaintext, base); + body_size += MIC_SIZE; } - /* Write packet data and send */ + /* Encrypt fragment if applicable */ + + unit->fragment_encrypt_functions[encryption](unit, header, + plaintext, &body_size, ciphertext, base); + + /* Calculate total length of data to send to adapter */ + + send_size = unit->data_offset + body_size; + + /* Fill in length field, adjusting for Hermes peculiarities */ + + if(unit->firmware_type >= LUCENT_FIRMWARE + && encryption == S2ENC_TKIP) + body_size -= MIC_SIZE; + + if(unit->firmware_type == LUCENT_FIRMWARE + && (unit->flags & UNITF_HARDTKIP) != 0) + *(UWORD *)(desc + unit->ethernet_offset + ETH_PACKET_IEEELEN) = + MakeBEWord(body_size); + else + *(UWORD *)(desc + unit->datalen_offset) = MakeLEWord(body_size); + + /* Write packet to adapter and send */ - unit->WordsOut(unit->card, P2_REG_DATA0, (UWORD *)buffer, - (packet_size - ETH_HEADERSIZE + 1) / 2); frame_id = unit->tx_frame_id; + P2Seek(unit, 0, frame_id, 0, base); + unit->WordsOut(unit->card, P2_REG_DATA0, (UWORD *)desc, + (send_size + 1) / 2); unit->tx_frame_id = 0; P2DoCmd(unit, P2_CMD_TX | P2_CMDF_RECLAIM, frame_id, base); } @@ -1689,7 +2412,7 @@ VOID UpdateStats(struct DevUnit *unit, struct DevBase *base) -/****i* prism2.device/InfoInt ********************************************* +/****i* prism2.device/InfoInt ********************************************** * * NAME * InfoInt @@ -1719,17 +2442,23 @@ VOID UpdateStats(struct DevUnit *unit, struct DevBase *base) static VOID InfoInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) { struct DevBase *base; - UWORD id; + UWORD id, length, rec_length, status, ies_length, data_length, + ssid_length, *ap_rec; + UBYTE *ie, *ssid, *descriptor, *frame, *data, *bssid = unit->bssid; + BOOL associated; base = unit->device; id = unit->LEWordIn(unit->card, P2_REG_INFOFID); - /* Read useful stats and skip others */ + P2Seek(unit, 1, id, 0, base); + length = (unit->LEWordIn(unit->card, P2_REG_DATA1) + 1) * 2; - P2Seek(unit, 1, id, 2, base); - - if(unit->LEWordIn(unit->card, P2_REG_DATA1) == P2_INFO_COUNTERS) + switch(unit->LEWordIn(unit->card, P2_REG_DATA1)) { + case P2_INFO_COUNTERS: + + /* Read useful stats and skip others */ + unit->LEWordIn(unit->card, P2_REG_DATA1); unit->LEWordIn(unit->card, P2_REG_DATA1); @@ -1758,6 +2487,99 @@ static VOID InfoInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) unit->LEWordIn(unit->card, P2_REG_DATA1); unit->stats.BadData += unit->LEWordIn(unit->card, P2_REG_DATA1); + + break; + + case P2_INFO_SCANRESULTS: + case P2_INFO_HOSTSCANRESULTS: + + P2ReadRec(unit, id, unit->scan_results_rec, SCAN_BUFFER_SIZE, base); + Signal(unit->task, unit->scan_complete_signal); + break; + + case P2_INFO_SCANRESULT: + + descriptor = unit->rx_descriptor; + P2ReadRec(unit, id, descriptor, FRAME_BUFFER_SIZE, base); + if(length > 4) + { + /* Save IEEE 802.3 portion of scan result */ + + frame = descriptor + unit->ethernet_offset; + data = frame + ETH_PACKET_DATA; + CopyMem(descriptor + P2_FRM_HEADER + WIFI_FRM_ADDRESS3, + frame + ETH_PACKET_SOURCE, ETH_ADDRESSSIZE); + data_length = + LEWord(*(UWORD *)(descriptor + unit->datalen_offset)); + ies_length = data_length - WIFI_BEACON_IES; + *(UWORD *)(frame + ETH_PACKET_IEEELEN) = MakeBEWord(data_length); + SaveBeacon(unit, frame, base); + + /* Append a fake old-style scan record on to fake record list */ + + rec_length = LEWord(unit->scan_results_rec[0]); + + if(2 + rec_length * 2 + P2_APRECLEN < SCAN_BUFFER_SIZE) + { + ap_rec = unit->scan_results_rec + 1 + rec_length; + CopyMem(frame + ETH_PACKET_SOURCE, ap_rec + P2_APREC_BSSID / 2, + ETH_ADDRESSSIZE); + + ap_rec[P2_APREC_SIGNAL / 2] = + MakeLEWord(descriptor[P2_FRM_SIGNAL]); + + ap_rec[P2_APREC_NOISE / 2] = + MakeLEWord(descriptor[P2_FRM_NOISE]); + + ap_rec[P2_APREC_CHANNEL / 2] = MakeLEWord(GetIE(WIFI_IE_CHANNEL, + data + WIFI_BEACON_IES, ies_length, base)[2]); + + ap_rec[P2_APREC_INTERVAL / 2] = + *(UWORD *)(data + WIFI_BEACON_INTERVAL); + + ap_rec[P2_APREC_CAPABILITIES / 2] = + *(UWORD *)(data + WIFI_BEACON_CAPABILITIES); + + ie = GetIE(WIFI_IE_SSID, data + WIFI_BEACON_IES, ies_length, + base); + ssid_length = ie[1]; + ssid = ie + 2; + ap_rec[P2_APREC_NAMELEN / 2] = MakeLEWord(ssid_length); + CopyMem(ssid, ap_rec + P2_APREC_NAME / 2, ssid_length); + + unit->scan_results_rec[0] = + MakeLEWord(rec_length + P2_APRECLEN / 2); + } + } + else + Signal(unit->task, unit->scan_complete_signal); + break; + + case P2_INFO_LINKSTATUS: + + /* Only report an event if association status has really changed */ + + status = unit->LEWordIn(unit->card, P2_REG_DATA1); + + if(status == 1 || unit->firmware_type < LUCENT_FIRMWARE + && status == 3) + associated = TRUE; + else //if(unit->firmware_type < LUCENT_FIRMWARE || status == 3) + associated = FALSE; + + if(!(*(ULONG *)bssid == 0 && *(UWORD *)(bssid + 4) == 0)) + { + if(associated && (unit->flags & UNITF_ASSOCIATED) == 0) + { + unit->flags |= UNITF_ASSOCIATED; + ReportEvents(unit, S2EVENT_CONNECT, base); + } + else if(!associated && (unit->flags & UNITF_ASSOCIATED) != 0) + { + unit->flags &= ~UNITF_ASSOCIATED; + ReportEvents(unit, S2EVENT_DISCONNECT, base); + } + } } /* Acknowledge event and re-enable info interrupts */ @@ -1774,6 +2596,40 @@ static VOID InfoInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)) +/****i* prism2.device/ResetHandler ***************************************** +* +* NAME +* ResetHandler -- Disable hardware before a reboot. +* +* SYNOPSIS +* ResetHandler(unit, int_code) +* +* VOID ResetHandler(struct DevUnit *, APTR); +* +**************************************************************************** +* +*/ + +static VOID ResetHandler(REG(a1, struct DevUnit *unit), + REG(a6, APTR int_code)) +{ + if((unit->flags & UNITF_HAVEADAPTER) != 0) + { + /* Stop interrupts */ + + unit->LEWordOut(unit->card, P2_REG_INTMASK, 0); + + /* Stop transmission and reception */ + + unit->LEWordOut(unit->card, P2_REG_PARAM0, 0); + unit->LEWordOut(unit->card, P2_REG_COMMAND, P2_CMD_DISABLE); + } + + return; +} + + + /****i* prism2.device/ReportEvents ***************************************** * * NAME @@ -1827,15 +2683,15 @@ static VOID ReportEvents(struct DevUnit *unit, ULONG events, -/****i* prism2.device/UpdateSignalQuality ********************************** +/****i* prism2.device/SendScanResults ************************************** * * NAME -* UpdateSignalQuality -- Read signal quality from card. +* SendScanResults -- Reply to all outstanding scan requests. * * SYNOPSIS -* UpdateSignalQuality(unit) +* SendScanResults(unit) * -* VOID UpdateSignalQuality(struct DevUnit *); +* VOID SendScanResults(struct DevUnit *); * * FUNCTION * @@ -1849,30 +2705,365 @@ static VOID ReportEvents(struct DevUnit *unit, ULONG events, * */ -VOID UpdateSignalQuality(struct DevUnit *unit, struct DevBase *base) +static VOID SendScanResults(struct DevUnit *unit, struct DevBase *base) { - UWORD signal_level, noise_level; - - P2DoCmd(unit, P2_CMD_ACCESS, P2_REC_LINKQUALITY, base); - P2Seek(unit, 1, P2_REC_LINKQUALITY, 6, base); - signal_level = unit->LEWordIn(unit->card, P2_REG_DATA1); - noise_level = unit->LEWordIn(unit->card, P2_REG_DATA1); + BYTE error = 0; + struct IOSana2Req *request, *tail, *next_request; + struct List *list; + APTR pool; + UWORD count, i, j, ssid_length, length, entry_length, *ap_rec, + data_length, frame_length, ies_length; + struct TagItem **tag_lists, *tag; + UBYTE *bssid, *ies; + const UBYTE *beacon, *ie_bssid; + TEXT *ssid; + + list = &unit->request_ports[SCAN_QUEUE]->mp_MsgList; + next_request = (APTR)list->lh_Head; + tail = (APTR)&list->lh_Tail; - if(unit->firmware_type == LUCENT_FIRMWARE) - { - unit->signal_quality.SignalLevel = signal_level - LUCENT_DBM_OFFSET; - unit->signal_quality.NoiseLevel = noise_level - LUCENT_DBM_OFFSET; - } - else + while(next_request != tail) { - unit->signal_quality.SignalLevel = - signal_level / 3 - INTERSIL_DBM_OFFSET; - unit->signal_quality.NoiseLevel = - noise_level / 3 - INTERSIL_DBM_OFFSET; - } + request = next_request; + next_request = (APTR)request->ios2_Req.io_Message.mn_Node.ln_Succ; - return; -} + pool = request->ios2_Data; + + length = LEWord(unit->scan_results_rec[0]); + ap_rec = unit->scan_results_rec + 2; + + if(unit->firmware_type == INTERSIL_FIRMWARE) + { + entry_length = LEWord(unit->scan_results_rec[2]); + ap_rec += 2; + count = (length - 3) * 2 / entry_length; + } + else + { + entry_length = P2_APRECLEN; + count = (length - 1) * 2 / entry_length; + } + + /* Allocate array of tag lists, one for each AP */ + + if(count > 0) + { + tag_lists = AllocPooled(pool, count * sizeof(APTR)); + if(tag_lists == NULL) + error = S2ERR_NO_RESOURCES; + } + else + tag_lists = NULL; + + for(i = 0; i < count && error == 0; i++, ap_rec += entry_length / 2) + { + tag_lists[i] = + AllocPooled(pool, SCAN_TAG_COUNT * sizeof(struct TagItem)); + if(tag_lists[i] == NULL) + error = S2ERR_NO_RESOURCES; + + if(error == 0) + { + tag = tag_lists[i]; + + tag->ti_Tag = S2INFO_BSSID; + tag->ti_Data = (UPINT)(bssid = + AllocPooled(pool, ETH_ADDRESSSIZE)); + if(bssid != NULL) + CopyMem(ap_rec + P2_APREC_BSSID / 2, bssid, + ETH_ADDRESSSIZE); + else + error = S2ERR_NO_RESOURCES; + tag++; + + tag->ti_Tag = TAG_IGNORE; + tag++; + + tag->ti_Tag = S2INFO_Channel; + tag->ti_Data = LEWord(ap_rec[P2_APREC_CHANNEL / 2]); + tag++; + + tag->ti_Tag = S2INFO_BeaconInterval; + tag->ti_Data = LEWord(ap_rec[P2_APREC_INTERVAL / 2]); + tag++; + + tag->ti_Tag = S2INFO_Capabilities; + tag->ti_Data = LEWord(ap_rec[P2_APREC_CAPABILITIES / 2]); + tag++; + + tag->ti_Tag = S2INFO_Signal; + tag->ti_Data = ConvertScanLevel(unit, + LEWord(ap_rec[P2_APREC_SIGNAL / 2]), base); + tag++; + + tag->ti_Tag = S2INFO_Noise; + tag->ti_Data = ConvertScanLevel(unit, + LEWord(ap_rec[P2_APREC_NOISE / 2]), base); + tag++; + + + ssid_length = LEWord(ap_rec[P2_APREC_NAMELEN / 2]); + tag->ti_Tag = S2INFO_SSID; + tag->ti_Data = (UPINT)(ssid = + AllocPooled(pool, 31 + 1)); + if(ssid != NULL) + { + CopyMem(ap_rec + P2_APREC_NAME / 2, ssid, ssid_length); + ssid[ssid_length] = '\0'; + } + else + error = S2ERR_NO_RESOURCES; + tag++; + + tag->ti_Tag = TAG_END; + } + } + + /* Find IEs for each BSS and insert them into the BSS's tag list */ + + for(beacon = unit->beacons, i = 0; i < unit->beacon_count; i++) + { + /* Extract IEs from beacon descriptor */ + + data_length = BEWord(*(UWORD *)(beacon + ETH_PACKET_IEEELEN)); + ies_length = data_length - 12; + frame_length = ETH_HEADERSIZE + data_length; + ies = AllocPooled(pool, sizeof(UWORD) + ies_length); + if(ies != NULL) + { + *(UWORD *)ies = ies_length; + CopyMem(beacon + ETH_PACKET_DATA + WIFI_BEACON_IES, + ies + sizeof(UWORD), ies_length); + } + else + error = S2ERR_NO_RESOURCES; + + /* Find matching tag list and add IEs to it */ + + ie_bssid = beacon + ETH_PACKET_SOURCE; + for(j = 0; j < count; j++) + { + tag = tag_lists[j]; + bssid = (UBYTE *)tag->ti_Data; + if(*(ULONG *)bssid == *(ULONG *)ie_bssid + && *(UWORD *)(bssid + 4) == *(UWORD *)(ie_bssid + 4)) + { + tag++; + tag->ti_Tag = S2INFO_InfoElements; + tag->ti_Data = (PINT)ies; + } + } + + beacon += frame_length + sizeof(ULONG) & ~3; + } + + /* Return results */ + + if(error == 0) + { + request->ios2_StatData = tag_lists; + request->ios2_DataLength = count; + } + else + { + request->ios2_Req.io_Error = error; + request->ios2_WireError = S2WERR_GENERIC_ERROR; + } + Remove((APTR)request); + ReplyMsg((APTR)request); + } + + /* Discard collected beacon frames */ + + Disable(); + unit->next_beacon = unit->beacons; + unit->beacon_count = 0; + Enable(); + + return; +} + + + +/****i* prism2.device/GetNetworkInfo *************************************** +* +* NAME +* GetNetworkInfo -- Get information on current network. +* +* SYNOPSIS +* tag_list = GetNetworkInfo(unit, pool) +* +* struct TagItem *GetNetworkInfo(struct DevUnit *, APTR); +* +* FUNCTION +* +* INPUTS +* unit - A unit of this device. +* pool - A memory pool. +* +* RESULT +* None. +* +**************************************************************************** +* +*/ + +struct TagItem *GetNetworkInfo(struct DevUnit *unit, APTR pool, + struct DevBase *base) +{ + BYTE error = 0; + struct TagItem *tag_list, *tag; + UBYTE *bssid, *ie; + + tag_list = + AllocPooled(pool, INFO_TAG_COUNT * sizeof(struct TagItem)); + if(tag_list == NULL) + error = S2ERR_NO_RESOURCES; + + if(error == 0) + { + tag = tag_list; + + tag->ti_Tag = S2INFO_BSSID; + tag->ti_Data = (UPINT)(bssid = + AllocPooled(pool, ETH_ADDRESSSIZE)); + if(bssid != NULL) + CopyMem(unit->bssid, bssid, ETH_ADDRESSSIZE); + else + error = S2ERR_NO_RESOURCES; + tag++; + + tag->ti_Tag = TAG_IGNORE; + tag++; + + tag->ti_Tag = S2INFO_WPAInfo; + tag->ti_Data = (UPINT)(ie = + AllocPooled(pool, unit->wpa_ie[1] + 2)); + if(ie != NULL) + CopyMem(unit->wpa_ie, ie, unit->wpa_ie[1] + 2); + else + error = S2ERR_NO_RESOURCES; + tag++; + + tag->ti_Tag = TAG_END; + } + + if(error != 0) + tag_list = NULL; + + return tag_list; +} + + + +/****i* prism2.device/UpdateSignalQuality ********************************** +* +* NAME +* UpdateSignalQuality -- Read signal quality from card. +* +* SYNOPSIS +* UpdateSignalQuality(unit) +* +* VOID UpdateSignalQuality(struct DevUnit *); +* +* FUNCTION +* +* INPUTS +* unit - A unit of this device. +* +* RESULT +* None. +* +**************************************************************************** +* +*/ + +VOID UpdateSignalQuality(struct DevUnit *unit, struct DevBase *base) +{ + P2DoCmd(unit, P2_CMD_ACCESS, P2_REC_LINKQUALITY, base); + P2Seek(unit, 1, P2_REC_LINKQUALITY, 6, base); + + unit->signal_quality.SignalLevel = + ConvertLevel(unit, unit->LEWordIn(unit->card, P2_REG_DATA1), base); + unit->signal_quality.NoiseLevel = + ConvertLevel(unit, unit->LEWordIn(unit->card, P2_REG_DATA1), base); + + return; +} + + + +/****i* prism2.device/StartScan ******************************************** +* +* NAME +* StartScan -- Start a scan for available networks. +* +* SYNOPSIS +* StartScan(unit) +* +* VOID StartScan(struct DevUnit *); +* +* FUNCTION +* +* INPUTS +* unit - A unit of this device. +* +* RESULT +* None. +* +**************************************************************************** +* +*/ + +VOID StartScan(struct DevUnit *unit, const TEXT *ssid, struct DevBase *base) +{ + UBYTE *params; + UWORD ssid_length = 0; + + /* Ask for a scan */ + + if((unit->flags & UNITF_ONLINE) != 0) + { + if(ssid != NULL) + ssid_length = StrLen(ssid); + if(unit->firmware_type == INTERSIL_FIRMWARE) + { + params = AllocVec(sizeof(scan_params) + ssid_length, MEMF_PUBLIC); + if(params != NULL) + { + CopyMem(scan_params, params, sizeof(scan_params)); + if(ssid != NULL) + CopyMem(ssid, params + sizeof(scan_params), ssid_length); + params[4] = ssid_length; + P2SetData(unit, P2_REC_HOSTSCAN, params, + sizeof(scan_params) + ssid_length, base); + FreeVec(params); + } + } + else if(unit->firmware_type == SYMBOL_FIRMWARE) + P2SetWord(unit, P2_REC_ALTHOSTSCAN, 0x82, base); + else if(unit->firmware_type >= LUCENT_FIRMWARE + && (unit->flags & UNITF_HARDTKIP) != 0) + { + /* Initialise fake scan results and ask for a series of raw beacon + descriptors */ + + unit->scan_results_rec[0] = MakeLEWord(1); + + P2SetID(unit, P2_REC_SCANSSID, ssid, ssid_length, base); + P2SetWord(unit, P2_REC_SCANCHANNELS, 0x7fff, base); + unit->LEWordOut(unit->card, P2_REG_PARAM1, 0x3fff); + P2DoCmd(unit, P2_CMD_INQUIRE, P2_INFO_SCANRESULT, base); + } + else + { + P2SetID(unit, P2_REC_SCANSSID, ssid, ssid_length, base); + P2DoCmd(unit, P2_CMD_INQUIRE, P2_INFO_SCANRESULTS, base); + } + } + + return; +} @@ -1901,24 +3092,45 @@ VOID UpdateSignalQuality(struct DevUnit *unit, struct DevBase *base) static BOOL LoadFirmware(struct DevUnit *unit, struct DevBase *base) { BOOL success = TRUE; + const TEXT *file_name; struct FileInfoBlock *info = NULL; - UWORD control_reg; - ULONG location, length, start_address; - BPTR file; + UWORD control_reg, pdr_no, *pda = NULL, *pdr, *prod_data, length; + ULONG location, start_address; + BPTR file = (BPTR)NULL; UBYTE *data = NULL; - LONG ch; - UBYTE *buffer = NULL, *p, *end, *q; - UBYTE n = 0, type; - UWORD i; + TEXT *buffer = NULL; + const TEXT *p; + UBYTE type; /* Read firmware file */ - file = Open(firmware_file_name, MODE_OLDFILE); - if(file == BNULL) + switch(unit->firmware_type) + { + case LUCENT_FIRMWARE: + file_name = h1_firmware_file_name; + break; + case HERMES2_FIRMWARE: + file_name = h2_firmware_file_name; + break; + case HERMES2G_FIRMWARE: + file_name = h25_firmware_file_name; + break; + default: + file_name = NULL; + } + + if(file_name == NULL) success = FALSE; if(success) { + file = Open(file_name, MODE_OLDFILE); + if(file == (BPTR)NULL) + success = FALSE; + } + + if(success) + { info = AllocDosObject(DOS_FIB, NULL); if(info == NULL) success = FALSE; @@ -1932,10 +3144,10 @@ static BOOL LoadFirmware(struct DevUnit *unit, struct DevBase *base) if(success) { - buffer = AllocVec(info->fib_Size, MEMF_ANY); - end = buffer + info->fib_Size; + buffer = AllocVec(info->fib_Size + 1, MEMF_ANY); data = AllocVec(MAX_S_REC_SIZE, MEMF_ANY); - if(buffer == NULL || data == NULL) + pda = AllocVec(LUCENT_PDA_SIZE, MEMF_ANY); + if(buffer == NULL || data == NULL || pda == NULL) success = FALSE; } @@ -1943,10 +3155,17 @@ static BOOL LoadFirmware(struct DevUnit *unit, struct DevBase *base) { if(Read(file, buffer, info->fib_Size) == -1) success = FALSE; + buffer[info->fib_Size] = '\0'; } if(success) { + unit->LEWordOut(unit->card, P2_REG_ACKEVENTS, 0xffff); + P2DoCmd(unit, P2_CMD_INIT | 0x100, 0, base); + unit->LEWordOut(unit->card, P2_REG_ACKEVENTS, 0xffff); + P2DoCmd(unit, P2_CMD_INIT | 0x0, 0, base); + unit->LEWordOut(unit->card, P2_REG_ACKEVENTS, 0xffff); + /* Enable auxiliary ports */ unit->LEWordOut(unit->card, P2_REG_PARAM0, 0xfe01); @@ -1963,61 +3182,102 @@ static BOOL LoadFirmware(struct DevUnit *unit, struct DevBase *base) (unit->LEWordIn(unit->card, P2_REG_CONTROL) & P2_REG_CONTROLF_AUX) != P2_REG_CONTROL_AUXENABLED); - /* Write firmware to card */ + /* Read Production Data Area from card */ - unit->LEWordOut(unit->card, P2_REG_PARAM1, 0); - P2DoCmd(unit, P2_CMD_PROGRAM | P2_CMDF_WRITE, 0, base); + if(unit->firmware_type < HERMES2_FIRMWARE) + { + location = LUCENT_PDA_ADDRESS; + unit->LEWordOut(unit->card, P2_REG_AUXPAGE, location >> 7); + unit->LEWordOut(unit->card, P2_REG_AUXOFFSET, + location & (1 << 7) - 1); + + unit->WordsIn(unit->card, P2_REG_AUXDATA, + (UWORD *)pda, LUCENT_PDA_SIZE >> 1); + } + + /* Allow writing to card's RAM */ + + BusyMilliDelay(100, base); + start_address = 0xf8000; + unit->LEWordOut(unit->card, P2_REG_PARAM1, start_address >> 16); + P2DoCmd(unit, P2_CMD_PROGRAM | P2_CMDF_WRITE, start_address, base); + + /* Parse firmware image data and write it to card */ p = buffer; - while(p < end) + while(p != NULL) { - /* Find start of next record */ - - ch = *p++; - if(ch == 'S') + p = ParseNextSRecord(p, &type, data, &length, &location, base); + if(p != NULL) { - /* Get record type */ + switch(type) + { + case '3': - type = *p++; + /* Check that this is not a "special" record */ - /* Skip length field to keep alignment easy */ + if(location < 0xff000000) + { + /* Write data to card */ - p += 2; + if(unit->firmware_type < LUCENT_FIRMWARE) + { + unit->LEWordOut(unit->card, P2_REG_PARAM1, + location >> 16); + P2DoCmd(unit, P2_CMD_PROGRAM | P2_CMDF_WRITE, location, + base); + } - /* Parse hexadecimal portion of record */ + unit->LEWordOut(unit->card, P2_REG_AUXPAGE, + location >> 7); + unit->LEWordOut(unit->card, P2_REG_AUXOFFSET, + location & (1 << 7) - 1); - q = data; - i = 0; - while((ch = *p++) >= '0') - { - n <<= 4; + unit->WordsOut(unit->card, P2_REG_AUXDATA, + (UWORD *)data, length >> 1); + } + break; - if(ch >= 'A') - n |= ch - 'A' + 10; - else - n |= ch - '0'; + case '7': - if((++i & 0x1) == 0) - { - *q++ = n; - n = 0; - } + /* Get location in card memory to begin execution of new + firmware at */ + + start_address = location; } - length = i >> 1; + } + } - switch(type) - { - case '3': + /* Parse PDA plug records and patch firmware */ + + p = buffer; + while(p != NULL) + { + p = ParseNextSRecord(p, &type, data, &length, &location, base); - /* Get location in card memory to store record's data */ + if(p != NULL && type == '3' && location == 0xff000000) + { + /* Get PDR number and the location where it should be patched + into firmware */ - location = (data[0] << 24) + (data[1] << 16) + (data[2] << 8) - + data[3]; - length -= 5; + pdr_no = LELong(*(ULONG *)data); + location = LELong(*(ULONG *)(data + 4)); + length = LELong(*(ULONG *)(data + 8)); - /* Write data to card */ + /* Find PDR to copy data from */ - if(unit->firmware_type != HERMES2_FIRMWARE) + prod_data = NULL; + for(pdr = pda; pdr[1] != 0; pdr += LEWord(pdr[0]) + 1) + { + if(LEWord(pdr[1]) == pdr_no) + prod_data = pdr + 2; + } + + /* Write production data to card if it was found */ + + if(prod_data != NULL) + { + if(unit->firmware_type < LUCENT_FIRMWARE) { unit->LEWordOut(unit->card, P2_REG_PARAM1, location >> 16); @@ -2029,17 +3289,8 @@ static BOOL LoadFirmware(struct DevUnit *unit, struct DevBase *base) unit->LEWordOut(unit->card, P2_REG_AUXOFFSET, location & (1 << 7) - 1); - unit->WordsOut(unit->card, P2_REG_AUXDATA, - (UWORD *)(data + 4), length >> 1); - break; - - case '7': - - /* Get location in card memory to begin execution of new - firmware at */ - - start_address = (data[0] << 24) + (data[1] << 16) - + (data[2] << 8) + data[3]; + unit->WordsOut(unit->card, P2_REG_AUXDATA, prod_data, + length >> 1); } } } @@ -2053,11 +3304,18 @@ static BOOL LoadFirmware(struct DevUnit *unit, struct DevBase *base) /* Execute downloaded firmware */ - if(unit->firmware_type == HERMES2_FIRMWARE) + if(unit->firmware_type >= HERMES2_FIRMWARE) { unit->LEWordOut(unit->card, P2_REG_PARAM1, start_address >> 16); P2DoCmd(unit, P2_CMD_EXECUTE, start_address, base); } + else if(unit->firmware_type >= LUCENT_FIRMWARE) + { + P2DoCmd(unit, P2_CMD_PROGRAM, 0, base); + unit->LEWordOut(unit->card, P2_REG_ACKEVENTS, 0xffff); + P2DoCmd(unit, P2_CMD_INIT, 0, base); + unit->LEWordOut(unit->card, P2_REG_ACKEVENTS, 0xffff); + } else { unit->LEWordOut(unit->card, P2_REG_PARAM1, start_address >> 16); @@ -2068,10 +3326,11 @@ static BOOL LoadFirmware(struct DevUnit *unit, struct DevBase *base) /* Free Resources */ + FreeVec(pda); FreeVec(buffer); FreeVec(data); FreeDosObject(DOS_FIB, info); - if(file != BNULL) + if(file != (BPTR)NULL) Close(file); return success; @@ -2079,6 +3338,76 @@ static BOOL LoadFirmware(struct DevUnit *unit, struct DevBase *base) +/****i* prism2.device/ParseNextSRecord ************************************* +* +* NAME +* ParseNextSRecord +* +**************************************************************************** +* +*/ + +static const TEXT *ParseNextSRecord(const TEXT *s, UBYTE *type, UBYTE *data, + UWORD *data_length, ULONG *location, struct DevBase *base) +{ + LONG ch; + ULONG n = 0; + UWORD i; + BOOL found = FALSE; + + /* Find start of next record, if any */ + + while(!found) + { + ch = *s++; + if(ch == 'S' || ch == '\0') + found = TRUE; + } + + if(ch == 'S') + { + /* Get record type */ + + *type = *s++; + + /* Skip length field to keep alignment easy */ + + s += 2; + + /* Parse hexadecimal portion of record */ + + for(i = 0; (ch = *s++) >= '0'; i++) + { + n <<= 4; + + if(ch >= 'A') + n |= ch - 'A' + 10; + else + n |= ch - '0'; + + if(i >= 8 && (i & 0x1) != 0) + { + *data++ = n; + n = 0; + } + else if(i == 7) + { + *location = n; + n = 0; + } + } + *data_length = (i >> 1) - 5; + } + else + s = NULL; + + /* Return updated text pointer */ + + return s; +} + + + /****i* prism2.device/P2DoCmd ********************************************** * * NAME @@ -2093,11 +3422,17 @@ static BOOL LoadFirmware(struct DevUnit *unit, struct DevBase *base) static VOID P2DoCmd(struct DevUnit *unit, UWORD command, UWORD param, struct DevBase *base) { + if(unit->firmware_type < LUCENT_FIRMWARE && command == P2_CMD_INIT) + unit->LEWordOut(unit->card, P2_REG_ACKEVENTS, 0xffff); + unit->LEWordOut(unit->card, P2_REG_PARAM0, param); unit->LEWordOut(unit->card, P2_REG_COMMAND, command); while((unit->LEWordIn(unit->card, P2_REG_EVENTS) & P2_EVENTF_CMD) == 0); unit->LEWordOut(unit->card, P2_REG_ACKEVENTS, P2_EVENTF_CMD); + + if(unit->firmware_type < LUCENT_FIRMWARE && command == P2_CMD_INIT) + unit->LEWordOut(unit->card, P2_REG_ACKEVENTS, 0xffff); } @@ -2118,11 +3453,13 @@ static BOOL P2Seek(struct DevUnit *unit, UWORD path_no, UWORD rec_no, path_no <<= 1; offset_reg = P2_REG_OFFSET0 + path_no; - unit->LEWordOut(unit->card, P2_REG_SELECT0 + path_no, - rec_no); + while((unit->LEWordIn(unit->card, offset_reg) & P2_REG_OFFSETF_BUSY) + != 0); + unit->LEWordOut(unit->card, P2_REG_SELECT0 + path_no, rec_no); unit->LEWordOut(unit->card, offset_reg, offset); while((unit->LEWordIn(unit->card, offset_reg) & P2_REG_OFFSETF_BUSY) != 0); + return (unit->LEWordIn(unit->card, offset_reg) & P2_REG_OFFSETF_ERROR) == 0; } @@ -2134,6 +3471,9 @@ static BOOL P2Seek(struct DevUnit *unit, UWORD path_no, UWORD rec_no, * NAME * P2SetID * +* NOTES +* id may be NULL as long as length is zero. +* **************************************************************************** * */ @@ -2145,7 +3485,7 @@ static VOID P2SetID(struct DevUnit *unit, UWORD rec_no, const UBYTE *id, unit->LEWordOut(unit->card, P2_REG_DATA1, length / 2 + 3); unit->LEWordOut(unit->card, P2_REG_DATA1, rec_no); - unit->LEWordOut(unit->card, P2_REG_DATA1, length); /* ??? */ + unit->LEWordOut(unit->card, P2_REG_DATA1, length); unit->WordsOut(unit->card, P2_REG_DATA1, (UWORD *)id, (length + 1) / 2); P2DoCmd(unit, P2_CMD_ACCESS | P2_CMDF_WRITE, rec_no, base); @@ -2193,7 +3533,6 @@ static UWORD P2GetWord(struct DevUnit *unit, UWORD rec_no, struct DevBase *base) { P2DoCmd(unit, P2_CMD_ACCESS, rec_no, base); - P2Seek(unit, 1, rec_no, 4, base); return unit->LEWordIn(unit->card, P2_REG_DATA1); @@ -2250,15 +3589,198 @@ static VOID P2SetData(struct DevUnit *unit, UWORD rec_no, const UBYTE *data, +/****i* prism2.device/P2ReadRec ******************************************** +* +* NAME +* P2ReadRec -- Load and read an entire record. +* +* SYNOPSIS +* success = P2ReadRec(unit, rec_no, buffer, max_length) +* +* BOOL P2ReadRec(struct DevUnit *, UWORD, APTR, UWORD); +* +* FUNCTION +* +* INPUTS +* unit - A unit of this device. +* rec_no - Record number to read. +* buffer - Buffer to store data in. +* max_length - Maximum number of bytes to store in buffer. +* +* RESULT +* success - Success indicator. +* +**************************************************************************** +* +*/ + +static BOOL P2ReadRec(struct DevUnit *unit, UWORD rec_no, APTR buffer, + UWORD max_length, struct DevBase *base) +{ + BOOL success = TRUE; + WORD length; + + P2DoCmd(unit, P2_CMD_ACCESS, rec_no, base); + P2Seek(unit, 1, rec_no, 0, base); + + length = (unit->LEWordIn(unit->card, P2_REG_DATA1) + 1) * 2; + P2Seek(unit, 1, rec_no, 0, base); + if(length <= max_length) + unit->WordsIn(unit->card, P2_REG_DATA1, (UWORD *)buffer, + length / 2); + else + success = FALSE; + return success; +} + + + +/****i* prism2.device/ConvertLevel ***************************************** +* +* NAME +* ConvertLevel -- Convert a signal or noise level to dBm. +* +* SYNOPSIS +* dbm_level = ConvertLevel(unit, raw_level) +* +* LONG ConvertLevel(struct DevUnit *, UWORD); +* +* FUNCTION +* +* INPUTS +* unit - A unit of this device. +* raw_level - The value returned from the hardware. +* +* RESULT +* dbm_level - The value in dBm. +* +**************************************************************************** +* +*/ + +static LONG ConvertLevel(struct DevUnit *unit, UWORD raw_level, + struct DevBase *base) +{ + LONG dbm_level; + + if(unit->firmware_type >= LUCENT_FIRMWARE) + dbm_level = raw_level - LUCENT_DBM_OFFSET; + else + dbm_level = raw_level / 3 - INTERSIL_DBM_OFFSET; + + return dbm_level; +} + + + +/****i* prism2.device/ConvertScanLevel ************************************* +* +* NAME +* ConvertScanLevel -- Convert a signal or noise level to dBm. +* +* SYNOPSIS +* dbm_level = ConvertScanLevel(unit, raw_level) +* +* LONG ConvertScanLevel(struct DevUnit *, UWORD); +* +* FUNCTION +* +* INPUTS +* unit - A unit of this device. +* raw_level - The value returned from the hardware. +* +* RESULT +* dbm_level - The value in dBm. +* +**************************************************************************** +* +*/ + +static LONG ConvertScanLevel(struct DevUnit *unit, UWORD raw_level, + struct DevBase *base) +{ + LONG dbm_level; + + if(unit->firmware_type >= LUCENT_FIRMWARE) + dbm_level = raw_level - LUCENT_DBM_OFFSET; + else + dbm_level = (WORD)raw_level; + + return dbm_level; +} + + + +/****i* prism2.device/GetIE ************************************************ +* +* NAME +* GetIE +* +* SYNOPSIS +* ie = GetIE(id, ies, ies_length) +* +* UBYTE *GetIE(UBYTE, UBYTE *, UWORD); +* +* FUNCTION +* +* INPUTS +* id - ID of IE to find. +* ies - A series of IEs. +* ies_length - Length of IE block. +* +* RESULT +* ie - Pointer to start of IE within block, or NULL if not found. +* +**************************************************************************** +* +*/ + +#if 0 +static UBYTE *GetIE(UBYTE id, UBYTE *ies, UWORD ies_length, + struct DevBase *base) +{ + BOOL found = FALSE; + UBYTE *ie, *end; + +// for(ie = ies; ie < end && ie + ie[1] < end; ie += length + 2) + end = ies + ies_length; + while(ie < end && !found) + { + if(ie[0] == id) + found = TRUE; + else + ie += ie[1] + 2; + } + if(!found) + ie = NULL; + + return ie; +} +#else +static UBYTE *GetIE(UBYTE id, UBYTE *ies, UWORD ies_length, + struct DevBase *base) +{ + UBYTE *ie; + + for(ie = ies; ie < ies + ies_length && ie[0] != id; ie += ie[1] + 2); +// for(ie = ies, end = ies + ies_length; ie < end && ie[0] != id; ie += ie[1] + 2); + if(ie >= ies + ies_length) + ie = NULL; + + return ie; +} +#endif + + /****i* prism2.device/UnitTask ********************************************* * * NAME * UnitTask * * SYNOPSIS -* UnitTask() +* UnitTask(sys_base) * -* VOID UnitTask(); +* VOID UnitTask(struct ExecBase *); * * FUNCTION * Completes deferred requests, and handles card insertion and removal @@ -2272,15 +3794,15 @@ static VOID P2SetData(struct DevUnit *unit, UWORD rec_no, const UBYTE *data, #undef UnitTask #endif -static VOID UnitTask() +static VOID UnitTask(struct ExecBase *sys_base) { struct Task *task; struct IORequest *request; struct DevUnit *unit; struct DevBase *base; struct MsgPort *general_port; - ULONG signals, wait_signals, card_removed_signal, card_inserted_signal, - general_port_signal; + ULONG signals = 0, wait_signals, card_removed_signal, + card_inserted_signal, scan_complete_signal, general_port_signal; /* Get parameters */ @@ -2296,12 +3818,13 @@ static VOID UnitTask() general_port_signal = 1 << general_port->mp_SigBit; general_port->mp_Flags = PA_SIGNAL; - /* Allocate a signal for notification of card removal */ + /* Allocate signals for notification of card removal and insertion */ card_removed_signal = unit->card_removed_signal = 1 << AllocSignal(-1); card_inserted_signal = unit->card_inserted_signal = 1 << AllocSignal(-1); + scan_complete_signal = unit->scan_complete_signal = 1 << AllocSignal(-1); wait_signals = (1 << general_port->mp_SigBit) | card_removed_signal - | card_inserted_signal; + | card_inserted_signal | scan_complete_signal | SIGBREAKF_CTRL_C; /* Tell ourselves to check port for old messages */ @@ -2309,7 +3832,7 @@ static VOID UnitTask() /* Infinite loop to service requests and signals */ - while(TRUE) + while((signals & SIGBREAKF_CTRL_C) == 0) { signals = Wait(wait_signals); @@ -2335,6 +3858,9 @@ static VOID UnitTask() GoOffline(unit, base); } + if((signals & scan_complete_signal) != 0) + SendScanResults(unit, base); + if((signals & general_port_signal) != 0) { while((request = (APTR)GetMsg(general_port)) != NULL) @@ -2346,37 +3872,8 @@ static VOID UnitTask() } } } -} - - - -/****i* prism2.device/BusyMilliDelay *************************************** -* -* NAME -* BusyMilliDelay - Busy-wait for specified number of milliseconds. -* -* SYNOPSIS -* BusyMilliDelay(millis) -* -* VOID BusyMilliDelay(ULONG); -* -**************************************************************************** -* -*/ - -static VOID BusyMilliDelay(ULONG millis, struct DevBase *base) -{ - struct timeval time, end_time; - GetSysTime(&end_time); - time.tv_secs = 0; - time.tv_micro = millis * 1000; - AddTime(&end_time, &time); - - while(CmpTime(&end_time, &time) < 0) - GetSysTime(&time); - - return; + FreeMem(task->tc_SPLower, STACK_SIZE); } diff --git a/workbench/devs/networks/prism2/unit_protos.h b/workbench/devs/networks/prism2/unit_protos.h index 17aa902733..3a9fac36f0 100644 --- a/workbench/devs/networks/prism2/unit_protos.h +++ b/workbench/devs/networks/prism2/unit_protos.h @@ -1,8 +1,6 @@ /* -File: unit_protos.h -Author: Neil Cafferkey -Copyright (C) 2004,2005 Neil Cafferkey +Copyright (C) 2004-2011 Neil Cafferkey 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 @@ -33,8 +31,13 @@ VOID DeleteUnit(struct DevUnit *unit, struct DevBase *base); BOOL InitialiseAdapter(struct DevUnit *unit, BOOL reinsertion, struct DevBase *base); VOID ConfigureAdapter(struct DevUnit *unit, struct DevBase *base); +VOID ReconfigureAdapter(struct DevUnit *unit, struct DevBase *base); VOID GoOnline(struct DevUnit *unit, struct DevBase *base); VOID GoOffline(struct DevUnit *unit, struct DevBase *base); +VOID SetOptions(struct DevUnit *unit, const struct TagItem *tag_list, + struct DevBase *base); +VOID SetKey(struct DevUnit *unit, ULONG index, ULONG type, const UBYTE *key, + ULONG key_length, const UBYTE *rx_counter, struct DevBase *base); BOOL AddMulticastRange(struct DevUnit *unit, const UBYTE *lower_bound, const UBYTE *upper_bound, struct DevBase *base); BOOL RemMulticastRange(struct DevUnit *unit, const UBYTE *lower_bound, @@ -45,7 +48,11 @@ VOID FlushUnit(struct DevUnit *unit, UBYTE last_queue, BYTE error, struct DevBase *base); BOOL StatusInt(REG(a1, struct DevUnit *unit), REG(a6, APTR int_code)); VOID UpdateStats(struct DevUnit *unit, struct DevBase *base); +struct TagItem *GetNetworkInfo(struct DevUnit *unit, APTR pool, + struct DevBase *base); VOID UpdateSignalQuality(struct DevUnit *unit, struct DevBase *base); +VOID StartScan(struct DevUnit *unit, const TEXT *ssid, + struct DevBase *base); #endif diff --git a/workbench/devs/networks/prism2/wireless.h b/workbench/devs/networks/prism2/wireless.h dissimilarity index 65% index db5c7c79a8..9c53ec7c75 100644 --- a/workbench/devs/networks/prism2/wireless.h +++ b/workbench/devs/networks/prism2/wireless.h @@ -1,93 +1,74 @@ -/* - -Copyright (C) 2005,2006 Neil Cafferkey - -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. - -*/ - -#ifndef WIRELESS_H -#define WIRELESS_H - - -#include -#include -#include - - -/* IEEE 802.11 definitions */ - -#define IEEE802_11_MAXIDLEN 32 -#define IEEE802_11_WEP64LEN 5 -#define IEEE802_11_WEP128LEN 13 -#define IEEE802_11_WEPKEYCOUNT 4 - -#define IEEE802_11_FRM_CONTROL 0x00 -#define IEEE802_11_FRM_DURATION 0x02 -/*#define IEEE802_11_FRM_BODY 0x20*/ -#define IEEE802_11_FRM_BODY 0x1e - -#define IEEE802_11_FRM_CONTROLB_TYPE 2 -#define IEEE802_11_FRM_CONTROLF_TYPE (0x3 << IEEE802_11_FRM_CONTROLB_TYPE) - -#define IEEE802_11_FRMTYPE_DATA 2 - - -/* Possible SANA 2 extensions */ - -#define S2DUPLEX_AUTO 0 -#define S2DUPLEX_HALF 1 -#define S2DUPLEX_FULL 2 - -#define S2ENC_NONE 0 -#define S2ENC_WEP 1 -#define S2ENC_WPA 2 - -#define S2PORT_AUTO 1 /* eg. device may look for an active link */ -#define S2PORT_SAVED 2 /* eg. from ROM */ -#define S2PORT_DEFAULT 2 /* eg. from ROM */ -#define S2PORT_10BASE2 3 -#define S2PORT_TP 4 -#define S2PORT_MII 5 -#define S2PORT_AUI 6 -#define S2PORT_MANAGED 7 -#define S2PORT_ADHOC 8 - -#define P2_GETSIGNALQUALITY 0x8000 - -struct Sana2SignalQuality -{ - LONG SignalLevel; /* signal level in dBm */ - LONG NoiseLevel; /* noise level in dBm */ -}; - - -/* Support for SetPrism2Defualts command */ - -struct WEPKey -{ - UBYTE key[13]; - UBYTE length; -}; - -#define P2OPT_SSID (TAG_USER + 0) -#define P2OPT_WEPKey (TAG_USER + 1) -#define P2OPT_Encryption (TAG_USER + 4) -#define P2OPT_PortType (TAG_USER + 5) -#define P2OPT_Channel (TAG_USER + 7) - - -#endif +/* + +Copyright (C) 2005-2011 Neil Cafferkey + +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. + +*/ + +#ifndef WIRELESS_H +#define WIRELESS_H + + +/* IEEE 802.11 definitions */ + +#define WIFI_MAXIDLEN 32 +#define WIFI_WEP64LEN 5 +#define WIFI_WEP128LEN 13 +#define WIFI_KEYCOUNT 4 + +#define WIFI_FRM_CONTROL 0x00 +#define WIFI_FRM_DURATION 0x02 +#define WIFI_FRM_ADDRESS1 0x04 +#define WIFI_FRM_ADDRESS2 0x0a +#define WIFI_FRM_ADDRESS3 0x10 +#define WIFI_FRM_SEQCONTROL 0x16 +#define WIFI_FRM_ADDRESS4 0x18 +#define WIFI_FRM_DATA 0x18 + +#define WIFI_FRM_CONTROLB_VERSION 0 +#define WIFI_FRM_CONTROLB_TYPE 2 +#define WIFI_FRM_CONTROLB_SUBTYPE 4 +#define WIFI_FRM_CONTROLB_TODS 8 +#define WIFI_FRM_CONTROLB_FROMDS 9 +#define WIFI_FRM_CONTROLB_MOREFRAGS 10 +#define WIFI_FRM_CONTROLB_WEP 14 +#define WIFI_FRM_CONTROLB_ORDER 15 + +#define WIFI_FRM_CONTROLF_VERSION (0x3 << WIFI_FRM_CONTROLB_VERSION) +#define WIFI_FRM_CONTROLF_TYPE (0x3 << WIFI_FRM_CONTROLB_TYPE) +#define WIFI_FRM_CONTROLF_SUBTYPE (0xf << WIFI_FRM_CONTROLB_SUBTYPE) +#define WIFI_FRM_CONTROLF_TODS (0x1 << WIFI_FRM_CONTROLB_TODS) +#define WIFI_FRM_CONTROLF_FROMDS (0x1 << WIFI_FRM_CONTROLB_FROMDS) +#define WIFI_FRM_CONTROLF_MOREFRAGS (0x1 << WIFI_FRM_CONTROLB_MOREFRAGS) +#define WIFI_FRM_CONTROLF_WEP (0x1 << WIFI_FRM_CONTROLB_WEP) +#define WIFI_FRM_CONTROLF_ORDER (0x1 << WIFI_FRM_CONTROLB_ORDER) + +#define WIFI_FRMTYPE_MGMT 0 +#define WIFI_FRMTYPE_DATA 2 + +#define WIFI_BEACON_TIMESTAMP 0x0 +#define WIFI_BEACON_INTERVAL 0x8 +#define WIFI_BEACON_CAPABILITIES 0xa +#define WIFI_BEACON_IES 0xc + +#define WIFI_IE_SSID 0 +#define WIFI_IE_CHANNEL 3 +#define WIFI_IE_RSN 48 +#define WIFI_IE_CUSTOM 221 + + +#endif -- 2.11.4.GIT